@@ -9,12 +9,12 @@ import (
9
9
"strings"
10
10
"time"
11
11
12
- "github.com/aws/aws-sdk-go/aws"
13
- "github.com/aws/aws-sdk-go/aws/credentials "
14
- "github.com/aws/aws-sdk-go/aws/ credentials/ec2rolecreds "
15
- "github.com/aws/aws-sdk-go/aws/ec2metadata "
16
- "github.com/aws/aws-sdk-go/aws/session "
17
- "github.com/aws/aws-sdk-go/service/s3"
12
+ "github.com/aws/aws-sdk-go-v2 /aws"
13
+ "github.com/aws/aws-sdk-go-v2/config "
14
+ "github.com/aws/aws-sdk-go-v2/ credentials"
15
+ "github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds "
16
+ "github.com/aws/aws-sdk-go-v2/feature/ec2/imds "
17
+ "github.com/aws/aws-sdk-go-v2 /service/s3"
18
18
)
19
19
20
20
// S3Getter is a Getter implementation that will download a module from
@@ -55,7 +55,7 @@ func (g *S3Getter) ClientMode(u *url.URL) (ClientMode, error) {
55
55
Bucket : aws .String (bucket ),
56
56
Prefix : aws .String (path ),
57
57
}
58
- resp , err := client .ListObjectsWithContext (ctx , req )
58
+ resp , err := client .ListObjects (ctx , req )
59
59
if err != nil {
60
60
return 0 , err
61
61
}
@@ -127,17 +127,17 @@ func (g *S3Getter) Get(dst string, u *url.URL) error {
127
127
req .Marker = aws .String (lastMarker )
128
128
}
129
129
130
- resp , err := client .ListObjectsWithContext (ctx , req )
130
+ resp , err := client .ListObjects (ctx , req )
131
131
if err != nil {
132
132
return err
133
133
}
134
134
135
- hasMore = aws . BoolValue ( resp .IsTruncated )
135
+ hasMore = resp .IsTruncated
136
136
137
137
// Get each object storing each file relative to the destination path
138
138
for _ , object := range resp .Contents {
139
- lastMarker = aws . StringValue ( object .Key )
140
- objPath := aws . StringValue ( object .Key )
139
+ lastMarker = * object .Key
140
+ objPath := * object .Key
141
141
142
142
// If the key ends with a backslash assume it is a directory and ignore
143
143
if strings .HasSuffix (objPath , "/" ) {
@@ -182,7 +182,7 @@ func (g *S3Getter) GetFile(dst string, u *url.URL) error {
182
182
return g .getObject (ctx , client , dst , bucket , path , version )
183
183
}
184
184
185
- func (g * S3Getter ) getObject (ctx context.Context , client * s3.S3 , dst , bucket , key , version string ) error {
185
+ func (g * S3Getter ) getObject (ctx context.Context , client * s3.Client , dst , bucket , key , version string ) error {
186
186
req := & s3.GetObjectInput {
187
187
Bucket : aws .String (bucket ),
188
188
Key : aws .String (key ),
@@ -191,7 +191,7 @@ func (g *S3Getter) getObject(ctx context.Context, client *s3.S3, dst, bucket, ke
191
191
req .VersionId = aws .String (version )
192
192
}
193
193
194
- resp , err := client .GetObjectWithContext (ctx , req )
194
+ resp , err := client .GetObject (ctx , req )
195
195
if err != nil {
196
196
return err
197
197
}
@@ -205,47 +205,50 @@ func (g *S3Getter) getObject(ctx context.Context, client *s3.S3, dst, bucket, ke
205
205
206
206
if g .client != nil && g .client .ProgressListener != nil {
207
207
fn := filepath .Base (key )
208
- body = g .client .ProgressListener .TrackProgress (fn , 0 , * resp .ContentLength , resp .Body )
208
+ body = g .client .ProgressListener .TrackProgress (fn , 0 , resp .ContentLength , resp .Body )
209
209
}
210
210
defer body .Close ()
211
211
212
212
// There is no limit set for the size of an object from S3
213
213
return copyReader (dst , body , 0666 , g .client .umask (), 0 )
214
214
}
215
215
216
- func (g * S3Getter ) getAWSConfig (region string , url * url.URL , creds * credentials.Credentials ) * aws.Config {
217
- conf := & aws.Config {}
216
+ func (g * S3Getter ) getAWSConfig (region string , url * url.URL , staticCreds * credentials.StaticCredentialsProvider ) (conf aws.Config , err error ) {
217
+ var loadOptions []func (* config.LoadOptions ) error
218
+ var creds aws.CredentialsProvider
219
+
218
220
metadataURLOverride := os .Getenv ("AWS_METADATA_URL" )
219
- if creds == nil && metadataURLOverride != "" {
220
- creds = credentials .NewChainCredentials (
221
- []credentials.Provider {
222
- & credentials.EnvProvider {},
223
- & credentials.SharedCredentialsProvider {Filename : "" , Profile : "" },
224
- & ec2rolecreds.EC2RoleProvider {
225
- Client : ec2metadata .New (session .New (& aws.Config {
226
- Endpoint : aws .String (metadataURLOverride ),
227
- })),
228
- },
221
+ if staticCreds == nil && metadataURLOverride != "" {
222
+ creds = ec2rolecreds .New (func (o * ec2rolecreds.Options ) {
223
+ o .Client = imds .New (imds.Options {
224
+ Endpoint : metadataURLOverride ,
225
+ ClientEnableState : imds .ClientEnabled ,
229
226
})
227
+ })
228
+ } else if staticCreds != nil {
229
+ creds = staticCreds
230
230
}
231
231
232
232
if creds != nil {
233
- conf .Endpoint = & url .Host
234
- conf .S3ForcePathStyle = aws .Bool (true )
235
- if url .Scheme == "http" {
236
- conf .DisableSSL = aws .Bool (true )
237
- }
233
+ loadOptions = append (loadOptions ,
234
+ config .WithEC2IMDSClientEnableState (imds .ClientEnabled ),
235
+ config .WithCredentialsProvider (creds ),
236
+ config .WithEndpointResolverWithOptions (aws .EndpointResolverWithOptionsFunc (
237
+ func (service , region string , options ... interface {}) (aws.Endpoint , error ) {
238
+ return aws.Endpoint {URL : url .Host }, nil
239
+ },
240
+ )))
238
241
}
239
242
240
243
conf .Credentials = creds
241
244
if region != "" {
242
- conf . Region = aws . String (region )
245
+ loadOptions = append ( loadOptions , config . WithRegion (region ) )
243
246
}
244
247
245
- return conf . WithCredentialsChainVerboseErrors ( true )
248
+ return config . LoadDefaultConfig ( context . TODO (), loadOptions ... )
246
249
}
247
250
248
- func (g * S3Getter ) parseUrl (u * url.URL ) (region , bucket , path , version string , creds * credentials.Credentials , err error ) {
251
+ func (g * S3Getter ) parseUrl (u * url.URL ) (region , bucket , path , version string , creds * credentials.StaticCredentialsProvider , err error ) {
249
252
// This just check whether we are dealing with S3 or
250
253
// any other S3 compliant service. S3 has a predictable
251
254
// url as others do not
@@ -314,34 +317,36 @@ func (g *S3Getter) parseUrl(u *url.URL) (region, bucket, path, version string, c
314
317
_ , hasAwsSecret := u .Query ()["aws_access_key_secret" ]
315
318
_ , hasAwsToken := u .Query ()["aws_access_token" ]
316
319
if hasAwsId || hasAwsSecret || hasAwsToken {
317
- creds = credentials .NewStaticCredentials (
320
+ provider : = credentials .NewStaticCredentialsProvider (
318
321
u .Query ().Get ("aws_access_key_id" ),
319
322
u .Query ().Get ("aws_access_key_secret" ),
320
323
u .Query ().Get ("aws_access_token" ),
321
324
)
325
+ creds = & provider
322
326
}
323
327
324
328
return
325
329
}
326
330
327
331
func (g * S3Getter ) newS3Client (
328
- region string , url * url.URL , creds * credentials.Credentials ,
329
- ) (* s3.S3 , error ) {
330
- var sess * session.Session
332
+ region string , url * url.URL , creds * credentials.StaticCredentialsProvider ,
333
+ ) (* s3.Client , error ) {
334
+ var err error
335
+ var cfg aws.Config
331
336
332
337
if profile := url .Query ().Get ("aws_profile" ); profile != "" {
333
- var err error
334
- sess , err = session .NewSessionWithOptions (session.Options {
335
- Profile : profile ,
336
- SharedConfigState : session .SharedConfigEnable ,
337
- })
338
- if err != nil {
339
- return nil , err
340
- }
338
+ cfg , err = config .LoadDefaultConfig (context .TODO (),
339
+ config .WithSharedConfigProfile (profile ),
340
+ )
341
341
} else {
342
- config := g .getAWSConfig (region , url , creds )
343
- sess = session .New (config )
342
+ cfg , err = g .getAWSConfig (region , url , creds )
343
+ }
344
+
345
+ if err != nil {
346
+ return nil , err
344
347
}
345
348
346
- return s3 .New (sess ), nil
349
+ return s3 .NewFromConfig (cfg , func (opts * s3.Options ) {
350
+ opts .UsePathStyle = true
351
+ }), nil
347
352
}
0 commit comments