@@ -11,10 +11,12 @@ import (
11
11
"strings"
12
12
"time"
13
13
14
- "github.com/aws/aws-sdk-go/aws"
15
- "github.com/aws/aws-sdk-go/aws/arn"
16
- "github.com/aws/aws-sdk-go/aws/session"
17
- "github.com/aws/aws-sdk-go/service/kinesis"
14
+ "github.com/aws/aws-sdk-go-v2/aws"
15
+ "github.com/aws/aws-sdk-go-v2/aws/arn"
16
+ "github.com/aws/aws-sdk-go-v2/config"
17
+ "github.com/aws/aws-sdk-go-v2/service/kinesis"
18
+ kinTypes "github.com/aws/aws-sdk-go-v2/service/kinesis/types"
19
+
18
20
yaml "github.com/goccy/go-yaml"
19
21
"github.com/prometheus/client_golang/prometheus"
20
22
log "github.com/sirupsen/logrus"
@@ -45,7 +47,7 @@ type KinesisSource struct {
45
47
metricsLevel metrics.AcquisitionMetricsLevel
46
48
Config KinesisConfiguration
47
49
logger * log.Entry
48
- kClient * kinesis.Kinesis
50
+ kClient * kinesis.Client
49
51
shardReaderTomb * tomb.Tomb
50
52
}
51
53
@@ -68,39 +70,32 @@ func (k *KinesisSource) GetUuid() string {
68
70
return k .Config .UniqueId
69
71
}
70
72
71
- func (k * KinesisSource ) newClient () error {
72
- var sess * session.Session
73
-
74
- if k .Config .AwsProfile != nil {
75
- sess = session .Must (session .NewSessionWithOptions (session.Options {
76
- SharedConfigState : session .SharedConfigEnable ,
77
- Profile : * k .Config .AwsProfile ,
78
- }))
79
- } else {
80
- sess = session .Must (session .NewSessionWithOptions (session.Options {
81
- SharedConfigState : session .SharedConfigEnable ,
82
- }))
73
+ func (k * KinesisSource ) newClient (ctx context.Context ) error {
74
+ var loadOpts []func (* config.LoadOptions ) error
75
+ if k .Config .AwsProfile != nil && * k .Config .AwsProfile != "" {
76
+ loadOpts = append (loadOpts , config .WithSharedConfigProfile (* k .Config .AwsProfile ))
83
77
}
84
-
85
- if sess == nil {
86
- return errors . New ( "failed to create aws session" )
78
+ region := k . Config . AwsRegion
79
+ if region == "" {
80
+ region = "us-east-1"
87
81
}
82
+ loadOpts = append (loadOpts , config .WithRegion (region ))
83
+ loadOpts = append (loadOpts , config .WithCredentialsProvider (aws.AnonymousCredentials {}))
88
84
89
- config := aws .NewConfig ()
90
-
91
- if k .Config .AwsRegion != "" {
92
- config = config .WithRegion (k .Config .AwsRegion )
85
+ cfg , err := config .LoadDefaultConfig (ctx , loadOpts ... )
86
+ if err != nil {
87
+ return fmt .Errorf ("failed to load aws config: %w" , err )
93
88
}
94
89
90
+ var clientOpts []func (* kinesis.Options )
95
91
if k .Config .AwsEndpoint != "" {
96
- config = config .WithEndpoint (k .Config .AwsEndpoint )
92
+ clientOpts = append (clientOpts , func (o * kinesis.Options ) {
93
+ o .BaseEndpoint = aws .String (k .Config .AwsEndpoint )
94
+ })
97
95
}
98
96
99
- k .kClient = kinesis .New (sess , config )
100
- if k .kClient == nil {
101
- return errors .New ("failed to create kinesis client" )
102
- }
103
97
98
+ k .kClient = kinesis .NewFromConfig (cfg , clientOpts ... )
104
99
return nil
105
100
}
106
101
@@ -156,7 +151,7 @@ func (k *KinesisSource) Configure(yamlConfig []byte, logger *log.Entry, metricsL
156
151
return err
157
152
}
158
153
159
- err = k .newClient ()
154
+ err = k .newClient (context . TODO () )
160
155
if err != nil {
161
156
return fmt .Errorf ("cannot create kinesis client: %w" , err )
162
157
}
@@ -203,12 +198,14 @@ func (k *KinesisSource) decodeFromSubscription(record []byte) ([]CloudwatchSubsc
203
198
func (k * KinesisSource ) WaitForConsumerDeregistration (consumerName string , streamARN string ) error {
204
199
maxTries := k .Config .MaxRetries
205
200
for i := range maxTries {
206
- _ , err := k .kClient .DescribeStreamConsumer (& kinesis.DescribeStreamConsumerInput {
207
- ConsumerName : aws .String (consumerName ),
208
- StreamARN : aws .String (streamARN ),
209
- })
201
+ _ , err := k .kClient .DescribeStreamConsumer (
202
+ context .TODO (),
203
+ & kinesis.DescribeStreamConsumerInput {
204
+ ConsumerName : aws .String (consumerName ),
205
+ StreamARN : aws .String (streamARN ),
206
+ })
210
207
211
- var resourceNotFoundErr * kinesis .ResourceNotFoundException
208
+ var resourceNotFoundErr * kinTypes .ResourceNotFoundException
212
209
if errors .As (err , & resourceNotFoundErr ) {
213
210
return nil
214
211
}
@@ -226,12 +223,14 @@ func (k *KinesisSource) WaitForConsumerDeregistration(consumerName string, strea
226
223
227
224
func (k * KinesisSource ) DeregisterConsumer () error {
228
225
k .logger .Debugf ("Deregistering consumer %s if it exists" , k .Config .ConsumerName )
229
- _ , err := k .kClient .DeregisterStreamConsumer (& kinesis.DeregisterStreamConsumerInput {
230
- ConsumerName : aws .String (k .Config .ConsumerName ),
231
- StreamARN : aws .String (k .Config .StreamARN ),
232
- })
226
+ _ , err := k .kClient .DeregisterStreamConsumer (
227
+ context .TODO (),
228
+ & kinesis.DeregisterStreamConsumerInput {
229
+ ConsumerName : aws .String (k .Config .ConsumerName ),
230
+ StreamARN : aws .String (k .Config .StreamARN ),
231
+ })
233
232
234
- var resourceNotFoundErr * kinesis .ResourceNotFoundException
233
+ var resourceNotFoundErr * kinTypes .ResourceNotFoundException
235
234
if errors .As (err , & resourceNotFoundErr ) {
236
235
return nil
237
236
}
@@ -251,14 +250,16 @@ func (k *KinesisSource) DeregisterConsumer() error {
251
250
func (k * KinesisSource ) WaitForConsumerRegistration (consumerARN string ) error {
252
251
maxTries := k .Config .MaxRetries
253
252
for i := range maxTries {
254
- describeOutput , err := k .kClient .DescribeStreamConsumer (& kinesis.DescribeStreamConsumerInput {
255
- ConsumerARN : aws .String (consumerARN ),
256
- })
253
+ describeOutput , err := k .kClient .DescribeStreamConsumer (
254
+ context .TODO (),
255
+ & kinesis.DescribeStreamConsumerInput {
256
+ ConsumerARN : aws .String (consumerARN ),
257
+ })
257
258
if err != nil {
258
259
return fmt .Errorf ("cannot describe stream consumer: %w" , err )
259
260
}
260
261
261
- if * describeOutput .ConsumerDescription .ConsumerStatus == "ACTIVE" {
262
+ if describeOutput .ConsumerDescription .ConsumerStatus == "ACTIVE" {
262
263
k .logger .Debugf ("Consumer %s is active" , consumerARN )
263
264
return nil
264
265
}
@@ -273,10 +274,12 @@ func (k *KinesisSource) WaitForConsumerRegistration(consumerARN string) error {
273
274
func (k * KinesisSource ) RegisterConsumer () (* kinesis.RegisterStreamConsumerOutput , error ) {
274
275
k .logger .Debugf ("Registering consumer %s" , k .Config .ConsumerName )
275
276
276
- streamConsumer , err := k .kClient .RegisterStreamConsumer (& kinesis.RegisterStreamConsumerInput {
277
- ConsumerName : aws .String (k .Config .ConsumerName ),
278
- StreamARN : aws .String (k .Config .StreamARN ),
279
- })
277
+ streamConsumer , err := k .kClient .RegisterStreamConsumer (
278
+ context .TODO (),
279
+ & kinesis.RegisterStreamConsumerInput {
280
+ ConsumerName : aws .String (k .Config .ConsumerName ),
281
+ StreamARN : aws .String (k .Config .StreamARN ),
282
+ })
280
283
if err != nil {
281
284
return nil , fmt .Errorf ("cannot register stream consumer: %w" , err )
282
285
}
@@ -289,7 +292,7 @@ func (k *KinesisSource) RegisterConsumer() (*kinesis.RegisterStreamConsumerOutpu
289
292
return streamConsumer , nil
290
293
}
291
294
292
- func (k * KinesisSource ) ParseAndPushRecords (records []* kinesis .Record , out chan types.Event , logger * log.Entry , shardID string ) {
295
+ func (k * KinesisSource ) ParseAndPushRecords (records []kinTypes .Record , out chan types.Event , logger * log.Entry , shardID string ) {
293
296
for _ , record := range records {
294
297
if k .Config .StreamARN != "" {
295
298
if k .metricsLevel != metrics .AcquisitionMetricsLevelNone {
@@ -365,38 +368,42 @@ func (k *KinesisSource) ReadFromSubscription(reader kinesis.SubscribeToShardEven
365
368
return nil
366
369
}
367
370
368
- switch event := event .(type ) {
369
- case * kinesis. SubscribeToShardEvent :
370
- k .ParseAndPushRecords (event .Records , out , logger , shardID )
371
- case * kinesis. SubscribeToShardEventStreamUnknownEvent :
372
- logger .Infof ("got an unknown event, what to do ?" )
371
+ switch et := event .(type ) {
372
+ case * kinTypes. SubscribeToShardEventStreamMemberSubscribeToShardEvent :
373
+ k .ParseAndPushRecords (et . Value .Records , out , logger , shardID )
374
+ default :
375
+ logger .Infof ("unhandled SubscribeToShard event: %T" , et )
373
376
}
374
377
}
375
378
}
376
379
}
377
380
378
381
func (k * KinesisSource ) SubscribeToShards (arn arn.ARN , streamConsumer * kinesis.RegisterStreamConsumerOutput , out chan types.Event ) error {
379
- shards , err := k .kClient .ListShards (& kinesis.ListShardsInput {
380
- StreamName : aws .String (arn .Resource [7 :]),
381
- })
382
+ shards , err := k .kClient .ListShards (
383
+ context .TODO (),
384
+ & kinesis.ListShardsInput {
385
+ StreamName : aws .String (arn .Resource [7 :]),
386
+ })
382
387
if err != nil {
383
388
return fmt .Errorf ("cannot list shards for enhanced_read: %w" , err )
384
389
}
385
390
386
391
for _ , shard := range shards .Shards {
387
392
shardID := * shard .ShardId
388
393
389
- r , err := k .kClient .SubscribeToShard (& kinesis.SubscribeToShardInput {
390
- ShardId : aws .String (shardID ),
391
- StartingPosition : & kinesis.StartingPosition {Type : aws .String (kinesis .ShardIteratorTypeLatest )},
392
- ConsumerARN : streamConsumer .Consumer .ConsumerARN ,
393
- })
394
+ r , err := k .kClient .SubscribeToShard (
395
+ context .TODO (),
396
+ & kinesis.SubscribeToShardInput {
397
+ ShardId : aws .String (shardID ),
398
+ StartingPosition : & kinTypes.StartingPosition {Type : kinTypes .ShardIteratorTypeLatest },
399
+ ConsumerARN : streamConsumer .Consumer .ConsumerARN ,
400
+ })
394
401
if err != nil {
395
402
return fmt .Errorf ("cannot subscribe to shard: %w" , err )
396
403
}
397
404
398
405
k .shardReaderTomb .Go (func () error {
399
- return k .ReadFromSubscription (r .GetEventStream ().Reader , out , shardID , arn .Resource [7 :])
406
+ return k .ReadFromSubscription (r .GetStream ().Reader , out , shardID , arn .Resource [7 :])
400
407
})
401
408
}
402
409
@@ -463,11 +470,13 @@ func (k *KinesisSource) ReadFromShard(out chan types.Event, shardID string) erro
463
470
logger := k .logger .WithField ("shard" , shardID )
464
471
logger .Debugf ("Starting to read shard" )
465
472
466
- sharIt , err := k .kClient .GetShardIterator (& kinesis.GetShardIteratorInput {
467
- ShardId : aws .String (shardID ),
468
- StreamName : & k .Config .StreamName ,
469
- ShardIteratorType : aws .String (kinesis .ShardIteratorTypeLatest ),
470
- })
473
+ sharIt , err := k .kClient .GetShardIterator (
474
+ context .TODO (),
475
+ & kinesis.GetShardIteratorInput {
476
+ ShardId : aws .String (shardID ),
477
+ StreamName : & k .Config .StreamName ,
478
+ ShardIteratorType : kinTypes .ShardIteratorTypeLatest ,
479
+ })
471
480
if err != nil {
472
481
logger .Errorf ("Cannot get shard iterator: %s" , err )
473
482
return fmt .Errorf ("cannot get shard iterator: %w" , err )
@@ -480,16 +489,17 @@ func (k *KinesisSource) ReadFromShard(out chan types.Event, shardID string) erro
480
489
for {
481
490
select {
482
491
case <- ticker .C :
483
- records , err := k .kClient .GetRecords (& kinesis.GetRecordsInput {ShardIterator : it })
492
+ records , err := k .kClient .GetRecords (context .TODO (), & kinesis.GetRecordsInput {ShardIterator : it })
493
+ it = records .NextShardIterator
484
494
485
- var throughputErr * kinesis .ProvisionedThroughputExceededException
495
+ var throughputErr * kinTypes .ProvisionedThroughputExceededException
486
496
if errors .As (err , & throughputErr ) {
487
497
logger .Warn ("Provisioned throughput exceeded" )
488
498
// TODO: implement exponential backoff
489
499
continue
490
500
}
491
501
492
- var expiredIteratorErr * kinesis .ExpiredIteratorException
502
+ var expiredIteratorErr * kinTypes .ExpiredIteratorException
493
503
if errors .As (err , & expiredIteratorErr ) {
494
504
logger .Warn ("Expired iterator" )
495
505
continue
@@ -521,9 +531,11 @@ func (k *KinesisSource) ReadFromStream(out chan types.Event, t *tomb.Tomb) error
521
531
k .logger .Info ("starting kinesis acquisition from shards" )
522
532
523
533
for {
524
- shards , err := k .kClient .ListShards (& kinesis.ListShardsInput {
525
- StreamName : aws .String (k .Config .StreamName ),
526
- })
534
+ shards , err := k .kClient .ListShards (
535
+ context .TODO (),
536
+ & kinesis.ListShardsInput {
537
+ StreamName : aws .String (k .Config .StreamName ),
538
+ })
527
539
if err != nil {
528
540
return fmt .Errorf ("cannot list shards: %w" , err )
529
541
}
0 commit comments