Skip to content

Commit e734636

Browse files
committed
update s3 datasource to aws sdk v2
1 parent ab356f8 commit e734636

File tree

5 files changed

+161
-93
lines changed

5 files changed

+161
-93
lines changed

.golangci.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,11 @@ linters:
462462
path: cmd/notification-file/main.go
463463
text: found a struct that contains a context.Context field
464464

465+
- linters:
466+
- containedctx
467+
path: pkg/acquisition/modules/s3/s3.go
468+
text: found a struct that contains a context.Context field
469+
465470
# migrate over time
466471

467472
- linters:

go.mod

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ require (
1212
github.com/appleboy/gin-jwt/v2 v2.10.3
1313
github.com/aws/aws-lambda-go v1.47.0
1414
github.com/aws/aws-sdk-go v1.52.0
15+
github.com/aws/aws-sdk-go-v2 v1.38.3
16+
github.com/aws/aws-sdk-go-v2/config v1.31.6
17+
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.19.4
18+
github.com/aws/aws-sdk-go-v2/service/s3 v1.87.3
19+
github.com/aws/aws-sdk-go-v2/service/sqs v1.42.3
1520
github.com/beevik/etree v1.4.1
1621
github.com/blackfireio/osinfo v1.1.0 // indirect
1722
github.com/bluele/gcache v0.0.2
@@ -100,6 +105,21 @@ require (
100105
github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect
101106
github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect
102107
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
108+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1 // indirect
109+
github.com/aws/aws-sdk-go-v2/credentials v1.18.10 // indirect
110+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.6 // indirect
111+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.6 // indirect
112+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.6 // indirect
113+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect
114+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.6 // indirect
115+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1 // indirect
116+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.6 // indirect
117+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.6 // indirect
118+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.6 // indirect
119+
github.com/aws/aws-sdk-go-v2/service/sso v1.29.1 // indirect
120+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.34.2 // indirect
121+
github.com/aws/aws-sdk-go-v2/service/sts v1.38.2 // indirect
122+
github.com/aws/smithy-go v1.23.0 // indirect
103123
github.com/beorn7/perks v1.0.1 // indirect
104124
github.com/bmatcuk/doublestar v1.3.4 // indirect
105125
github.com/bytedance/sonic v1.13.2 // indirect

go.sum

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,46 @@ github.com/aws/aws-lambda-go v1.47.0 h1:0H8s0vumYx/YKs4sE7YM0ktwL2eWse+kfopsRI1s
4848
github.com/aws/aws-lambda-go v1.47.0/go.mod h1:dpMpZgvWx5vuQJfBt0zqBha60q7Dd7RfgJv23DymV8A=
4949
github.com/aws/aws-sdk-go v1.52.0 h1:ptgek/4B2v/ljsjYSEvLQ8LTD+SQyrqhOOWvHc/VGPI=
5050
github.com/aws/aws-sdk-go v1.52.0/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk=
51+
github.com/aws/aws-sdk-go-v2 v1.38.3 h1:B6cV4oxnMs45fql4yRH+/Po/YU+597zgWqvDpYMturk=
52+
github.com/aws/aws-sdk-go-v2 v1.38.3/go.mod h1:sDioUELIUO9Znk23YVmIk86/9DOpkbyyVb1i/gUNFXY=
53+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1 h1:i8p8P4diljCr60PpJp6qZXNlgX4m2yQFpYk+9ZT+J4E=
54+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1/go.mod h1:ddqbooRZYNoJ2dsTwOty16rM+/Aqmk/GOXrK8cg7V00=
55+
github.com/aws/aws-sdk-go-v2/config v1.31.6 h1:a1t8fXY4GT4xjyJExz4knbuoxSCacB5hT/WgtfPyLjo=
56+
github.com/aws/aws-sdk-go-v2/config v1.31.6/go.mod h1:5ByscNi7R+ztvOGzeUaIu49vkMk2soq5NaH5PYe33MQ=
57+
github.com/aws/aws-sdk-go-v2/credentials v1.18.10 h1:xdJnXCouCx8Y0NncgoptztUocIYLKeQxrCgN6x9sdhg=
58+
github.com/aws/aws-sdk-go-v2/credentials v1.18.10/go.mod h1:7tQk08ntj914F/5i9jC4+2HQTAuJirq7m1vZVIhEkWs=
59+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.6 h1:wbjnrrMnKew78/juW7I2BtKQwa1qlf6EjQgS69uYY14=
60+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.6/go.mod h1:AtiqqNrDioJXuUgz3+3T0mBWN7Hro2n9wll2zRUc0ww=
61+
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.19.4 h1:BTl+TXrpnrpPWb/J3527GsJ/lMkn7z3GO12j6OlsbRg=
62+
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.19.4/go.mod h1:cG2tenc/fscpChiZE29a2crG9uo2t6nQGflFllFL8M8=
63+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.6 h1:uF68eJA6+S9iVr9WgX1NaRGyQ/6MdIyc4JNUo6TN1FA=
64+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.6/go.mod h1:qlPeVZCGPiobx8wb1ft0GHT5l+dc6ldnwInDFaMvC7Y=
65+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.6 h1:pa1DEC6JoI0zduhZePp3zmhWvk/xxm4NB8Hy/Tlsgos=
66+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.6/go.mod h1:gxEjPebnhWGJoaDdtDkA0JX46VRg1wcTHYe63OfX5pE=
67+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo=
68+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo=
69+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.6 h1:R0tNFJqfjHL3900cqhXuwQ+1K4G0xc9Yf8EDbFXCKEw=
70+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.6/go.mod h1:y/7sDdu+aJvPtGXr4xYosdpq9a6T9Z0jkXfugmti0rI=
71+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1 h1:oegbebPEMA/1Jny7kvwejowCaHz1FWZAQ94WXFNCyTM=
72+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1/go.mod h1:kemo5Myr9ac0U9JfSjMo9yHLtw+pECEHsFtJ9tqCEI8=
73+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.6 h1:hncKj/4gR+TPauZgTAsxOxNcvBayhUlYZ6LO/BYiQ30=
74+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.8.6/go.mod h1:OiIh45tp6HdJDDJGnja0mw8ihQGz3VGrUflLqSL0SmM=
75+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.6 h1:LHS1YAIJXJ4K9zS+1d/xa9JAA9sL2QyXIQCQFQW/X08=
76+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.6/go.mod h1:c9PCiTEuh0wQID5/KqA32J+HAgZxN9tOGXKCiYJjTZI=
77+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.6 h1:nEXUSAwyUfLTgnc9cxlDWy637qsq4UWwp3sNAfl0Z3Y=
78+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.6/go.mod h1:HGzIULx4Ge3Do2V0FaiYKcyKzOqwrhUZgCI77NisswQ=
79+
github.com/aws/aws-sdk-go-v2/service/s3 v1.87.3 h1:ETkfWcXP2KNPLecaDa++5bsQhCRa5M5sLUJa5DWYIIg=
80+
github.com/aws/aws-sdk-go-v2/service/s3 v1.87.3/go.mod h1:+/3ZTqoYb3Ur7DObD00tarKMLMuKg8iqz5CHEanqTnw=
81+
github.com/aws/aws-sdk-go-v2/service/sqs v1.42.3 h1:0dWg1Tkz3FnEo48DgAh7CT22hYyMShly8WMd3sGx0xI=
82+
github.com/aws/aws-sdk-go-v2/service/sqs v1.42.3/go.mod h1:hpOo4IGPfGPlHRcf2nizYAzKfz8GzbQ8tTDIUR4H4GQ=
83+
github.com/aws/aws-sdk-go-v2/service/sso v1.29.1 h1:8OLZnVJPvjnrxEwHFg9hVUof/P4sibH+Ea4KKuqAGSg=
84+
github.com/aws/aws-sdk-go-v2/service/sso v1.29.1/go.mod h1:27M3BpVi0C02UiQh1w9nsBEit6pLhlaH3NHna6WUbDE=
85+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.34.2 h1:gKWSTnqudpo8dAxqBqZnDoDWCiEh/40FziUjr/mo6uA=
86+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.34.2/go.mod h1:x7+rkNmRoEN1U13A6JE2fXne9EWyJy54o3n6d4mGaXQ=
87+
github.com/aws/aws-sdk-go-v2/service/sts v1.38.2 h1:YZPjhyaGzhDQEvsffDEcpycq49nl7fiGcfJTIo8BszI=
88+
github.com/aws/aws-sdk-go-v2/service/sts v1.38.2/go.mod h1:2dIN8qhQfv37BdUYGgEC8Q3tteM3zFxTI1MLO2O3J3c=
89+
github.com/aws/smithy-go v1.23.0 h1:8n6I3gXzWJB2DxBDnfxgBaSX6oe0d/t10qGz7OKqMCE=
90+
github.com/aws/smithy-go v1.23.0/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI=
5191
github.com/beevik/etree v1.4.1 h1:PmQJDDYahBGNKDcpdX8uPy1xRCwoCGVUiW669MEirVI=
5292
github.com/beevik/etree v1.4.1/go.mod h1:gPNJNaBGVZ9AwsidazFZyygnd+0pAU38N4D+WemwKNs=
5393
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=

pkg/acquisition/modules/s3/s3.go

Lines changed: 72 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ import (
1616
"time"
1717

1818
"github.com/aws/aws-lambda-go/events"
19-
"github.com/aws/aws-sdk-go/aws"
20-
"github.com/aws/aws-sdk-go/aws/session"
21-
"github.com/aws/aws-sdk-go/service/s3"
22-
"github.com/aws/aws-sdk-go/service/s3/s3iface"
23-
"github.com/aws/aws-sdk-go/service/sqs"
24-
"github.com/aws/aws-sdk-go/service/sqs/sqsiface"
19+
"github.com/aws/aws-sdk-go-v2/aws"
20+
"github.com/aws/aws-sdk-go-v2/config"
21+
"github.com/aws/aws-sdk-go-v2/service/s3"
22+
s3Manager "github.com/aws/aws-sdk-go-v2/feature/s3/manager"
23+
s3types "github.com/aws/aws-sdk-go-v2/service/s3/types"
24+
"github.com/aws/aws-sdk-go-v2/service/sqs"
2525
yaml "github.com/goccy/go-yaml"
2626
"github.com/prometheus/client_golang/prometheus"
2727
log "github.com/sirupsen/logrus"
@@ -32,6 +32,16 @@ import (
3232
"github.com/crowdsecurity/crowdsec/pkg/types"
3333
)
3434

35+
type S3API interface {
36+
s3Manager.ListObjectsV2APIClient
37+
s3Manager.DownloadAPIClient
38+
}
39+
40+
type SQSAPI interface {
41+
ReceiveMessage(ctx context.Context, params *sqs.ReceiveMessageInput, optFns ...func(*sqs.Options)) (*sqs.ReceiveMessageOutput, error)
42+
DeleteMessage(ctx context.Context, params *sqs.DeleteMessageInput, optFns ...func(*sqs.Options)) (*sqs.DeleteMessageOutput, error)
43+
}
44+
3545
type S3Configuration struct {
3646
configuration.DataSourceCommonCfg `yaml:",inline"`
3747
AwsProfile *string `yaml:"aws_profile"`
@@ -51,12 +61,12 @@ type S3Source struct {
5161
metricsLevel metrics.AcquisitionMetricsLevel
5262
Config S3Configuration
5363
logger *log.Entry
54-
s3Client s3iface.S3API
55-
sqsClient sqsiface.SQSAPI
64+
s3Client S3API
65+
sqsClient SQSAPI
5666
readerChan chan S3Object
5767
t *tomb.Tomb
5868
out chan types.Event
59-
ctx aws.Context
69+
ctx context.Context
6070
cancel context.CancelFunc
6171
}
6272

@@ -109,62 +119,60 @@ const (
109119
)
110120

111121
func (s *S3Source) newS3Client() error {
112-
options := session.Options{
113-
SharedConfigState: session.SharedConfigEnable,
114-
}
115-
if s.Config.AwsProfile != nil {
116-
options.Profile = *s.Config.AwsProfile
122+
if s.s3Client != nil {
123+
return nil
117124
}
118125

119-
sess, err := session.NewSessionWithOptions(options)
120-
if err != nil {
121-
return fmt.Errorf("failed to create aws session: %w", err)
126+
var loadOpts []func(*config.LoadOptions) error
127+
if s.Config.AwsProfile != nil && *s.Config.AwsProfile != "" {
128+
loadOpts = append(loadOpts, config.WithSharedConfigProfile(*s.Config.AwsProfile))
122129
}
123-
124-
config := aws.NewConfig()
125-
if s.Config.AwsRegion != "" {
126-
config = config.WithRegion(s.Config.AwsRegion)
130+
region := s.Config.AwsRegion
131+
if region == "" {
132+
region = "us-east-1"
127133
}
128-
if s.Config.AwsEndpoint != "" {
129-
config = config.WithEndpoint(s.Config.AwsEndpoint)
134+
loadOpts = append(loadOpts, config.WithRegion(region))
135+
loadOpts = append(loadOpts, config.WithCredentialsProvider(aws.AnonymousCredentials{}))
136+
cfg, err := config.LoadDefaultConfig(s.ctx, loadOpts...)
137+
if err != nil {
138+
return fmt.Errorf("failed to load aws config: %w", err)
130139
}
131140

132-
s.s3Client = s3.New(sess, config)
133-
if s.s3Client == nil {
134-
return errors.New("failed to create S3 client")
141+
var clientOpts []func(*s3.Options)
142+
if s.Config.AwsEndpoint != "" {
143+
clientOpts = append(clientOpts, func(o *s3.Options) { o.BaseEndpoint = aws.String(s.Config.AwsEndpoint) })
135144
}
136145

146+
s.s3Client = s3.NewFromConfig(cfg, clientOpts...)
137147
return nil
138148
}
139149

140150
func (s *S3Source) newSQSClient() error {
141-
var sess *session.Session
142-
143-
if s.Config.AwsProfile != nil {
144-
sess = session.Must(session.NewSessionWithOptions(session.Options{
145-
SharedConfigState: session.SharedConfigEnable,
146-
Profile: *s.Config.AwsProfile,
147-
}))
148-
} else {
149-
sess = session.Must(session.NewSessionWithOptions(session.Options{
150-
SharedConfigState: session.SharedConfigEnable,
151-
}))
151+
if s.sqsClient != nil {
152+
return nil
152153
}
153154

154-
if sess == nil {
155-
return errors.New("failed to create aws session")
155+
var loadOpts []func(*config.LoadOptions) error
156+
if s.Config.AwsProfile != nil && *s.Config.AwsProfile != "" {
157+
loadOpts = append(loadOpts, config.WithSharedConfigProfile(*s.Config.AwsProfile))
156158
}
157-
config := aws.NewConfig()
158-
if s.Config.AwsRegion != "" {
159-
config = config.WithRegion(s.Config.AwsRegion)
159+
region := s.Config.AwsRegion
160+
if region == "" {
161+
region = "us-east-1"
160162
}
161-
if s.Config.AwsEndpoint != "" {
162-
config = config.WithEndpoint(s.Config.AwsEndpoint)
163+
loadOpts = append(loadOpts, config.WithRegion(region))
164+
loadOpts = append(loadOpts, config.WithCredentialsProvider(aws.AnonymousCredentials{}))
165+
cfg, err := config.LoadDefaultConfig(s.ctx, loadOpts...)
166+
if err != nil {
167+
return fmt.Errorf("failed to load aws config: %w", err)
163168
}
164-
s.sqsClient = sqs.New(sess, config)
165-
if s.sqsClient == nil {
166-
return errors.New("failed to create SQS client")
169+
170+
var clientOpts []func(*sqs.Options)
171+
if s.Config.AwsEndpoint != "" {
172+
clientOpts = append(clientOpts, func(o *sqs.Options) { o.BaseEndpoint = aws.String(s.Config.AwsEndpoint) })
167173
}
174+
175+
s.sqsClient = sqs.NewFromConfig(cfg, clientOpts...)
168176
return nil
169177
}
170178

@@ -186,13 +194,13 @@ func (s *S3Source) readManager() {
186194
}
187195
}
188196

189-
func (s *S3Source) getBucketContent() ([]*s3.Object, error) {
197+
func (s *S3Source) getBucketContent() ([]s3types.Object, error) {
190198
logger := s.logger.WithField("method", "getBucketContent")
191199
logger.Debugf("Getting bucket content for %s", s.Config.BucketName)
192-
bucketObjects := make([]*s3.Object, 0)
200+
bucketObjects := make([]s3types.Object, 0)
193201
var continuationToken *string
194202
for {
195-
out, err := s.s3Client.ListObjectsV2WithContext(s.ctx, &s3.ListObjectsV2Input{
203+
out, err := s.s3Client.ListObjectsV2(s.ctx, &s3.ListObjectsV2Input{
196204
Bucket: aws.String(s.Config.BucketName),
197205
Prefix: aws.String(s.Config.Prefix),
198206
ContinuationToken: continuationToken,
@@ -340,10 +348,10 @@ func (s *S3Source) sqsPoll() error {
340348
return nil
341349
default:
342350
logger.Trace("Polling SQS queue")
343-
out, err := s.sqsClient.ReceiveMessageWithContext(s.ctx, &sqs.ReceiveMessageInput{
351+
out, err := s.sqsClient.ReceiveMessage(s.ctx, &sqs.ReceiveMessageInput{
344352
QueueUrl: aws.String(s.Config.SQSName),
345-
MaxNumberOfMessages: aws.Int64(10),
346-
WaitTimeSeconds: aws.Int64(20), // Probably no need to make it configurable ?
353+
MaxNumberOfMessages: 10,
354+
WaitTimeSeconds: 20, // Probably no need to make it configurable ?
347355
})
348356
if err != nil {
349357
logger.Errorf("Error while polling SQS: %s", err)
@@ -359,21 +367,23 @@ func (s *S3Source) sqsPoll() error {
359367
if err != nil {
360368
logger.Errorf("Error while parsing SQS message: %s", err)
361369
// Always delete the message to avoid infinite loop
362-
_, err = s.sqsClient.DeleteMessage(&sqs.DeleteMessageInput{
363-
QueueUrl: aws.String(s.Config.SQSName),
364-
ReceiptHandle: message.ReceiptHandle,
365-
})
370+
_, err = s.sqsClient.DeleteMessage(s.ctx,
371+
&sqs.DeleteMessageInput{
372+
QueueUrl: aws.String(s.Config.SQSName),
373+
ReceiptHandle: message.ReceiptHandle,
374+
})
366375
if err != nil {
367376
logger.Errorf("Error while deleting SQS message: %s", err)
368377
}
369378
continue
370379
}
371380
logger.Debugf("Received SQS message for object %s/%s", bucket, key)
372381
s.readerChan <- S3Object{Key: key, Bucket: bucket}
373-
_, err = s.sqsClient.DeleteMessage(&sqs.DeleteMessageInput{
374-
QueueUrl: aws.String(s.Config.SQSName),
375-
ReceiptHandle: message.ReceiptHandle,
376-
})
382+
_, err = s.sqsClient.DeleteMessage(s.ctx,
383+
&sqs.DeleteMessageInput{
384+
QueueUrl: aws.String(s.Config.SQSName),
385+
ReceiptHandle: message.ReceiptHandle,
386+
})
377387
if err != nil {
378388
logger.Errorf("Error while deleting SQS message: %s", err)
379389
}
@@ -393,7 +403,7 @@ func (s *S3Source) readFile(bucket string, key string) error {
393403
"key": key,
394404
})
395405

396-
output, err := s.s3Client.GetObjectWithContext(s.ctx, &s3.GetObjectInput{
406+
output, err := s.s3Client.GetObject(s.ctx, &s3.GetObjectInput{
397407
Bucket: aws.String(bucket),
398408
Key: aws.String(key),
399409
})

0 commit comments

Comments
 (0)