@@ -9,12 +9,12 @@ import (
99 "strings"
1010 "time"
1111
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"
1818)
1919
2020// S3Getter is a Getter implementation that will download a module from
@@ -55,7 +55,7 @@ func (g *S3Getter) ClientMode(u *url.URL) (ClientMode, error) {
5555 Bucket : aws .String (bucket ),
5656 Prefix : aws .String (path ),
5757 }
58- resp , err := client .ListObjectsWithContext (ctx , req )
58+ resp , err := client .ListObjects (ctx , req )
5959 if err != nil {
6060 return 0 , err
6161 }
@@ -127,17 +127,17 @@ func (g *S3Getter) Get(dst string, u *url.URL) error {
127127 req .Marker = aws .String (lastMarker )
128128 }
129129
130- resp , err := client .ListObjectsWithContext (ctx , req )
130+ resp , err := client .ListObjects (ctx , req )
131131 if err != nil {
132132 return err
133133 }
134134
135- hasMore = aws . BoolValue ( resp .IsTruncated )
135+ hasMore = resp .IsTruncated
136136
137137 // Get each object storing each file relative to the destination path
138138 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
141141
142142 // If the key ends with a backslash assume it is a directory and ignore
143143 if strings .HasSuffix (objPath , "/" ) {
@@ -182,7 +182,7 @@ func (g *S3Getter) GetFile(dst string, u *url.URL) error {
182182 return g .getObject (ctx , client , dst , bucket , path , version )
183183}
184184
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 {
186186 req := & s3.GetObjectInput {
187187 Bucket : aws .String (bucket ),
188188 Key : aws .String (key ),
@@ -191,7 +191,7 @@ func (g *S3Getter) getObject(ctx context.Context, client *s3.S3, dst, bucket, ke
191191 req .VersionId = aws .String (version )
192192 }
193193
194- resp , err := client .GetObjectWithContext (ctx , req )
194+ resp , err := client .GetObject (ctx , req )
195195 if err != nil {
196196 return err
197197 }
@@ -205,47 +205,50 @@ func (g *S3Getter) getObject(ctx context.Context, client *s3.S3, dst, bucket, ke
205205
206206 if g .client != nil && g .client .ProgressListener != nil {
207207 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 )
209209 }
210210 defer body .Close ()
211211
212212 // There is no limit set for the size of an object from S3
213213 return copyReader (dst , body , 0666 , g .client .umask (), 0 )
214214}
215215
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+
218220 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 ,
229226 })
227+ })
228+ } else if staticCreds != nil {
229+ creds = staticCreds
230230 }
231231
232232 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+ )))
238241 }
239242
240243 conf .Credentials = creds
241244 if region != "" {
242- conf . Region = aws . String (region )
245+ loadOptions = append ( loadOptions , config . WithRegion (region ) )
243246 }
244247
245- return conf . WithCredentialsChainVerboseErrors ( true )
248+ return config . LoadDefaultConfig ( context . TODO (), loadOptions ... )
246249}
247250
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 ) {
249252 // This just check whether we are dealing with S3 or
250253 // any other S3 compliant service. S3 has a predictable
251254 // url as others do not
@@ -314,34 +317,36 @@ func (g *S3Getter) parseUrl(u *url.URL) (region, bucket, path, version string, c
314317 _ , hasAwsSecret := u .Query ()["aws_access_key_secret" ]
315318 _ , hasAwsToken := u .Query ()["aws_access_token" ]
316319 if hasAwsId || hasAwsSecret || hasAwsToken {
317- creds = credentials .NewStaticCredentials (
320+ provider : = credentials .NewStaticCredentialsProvider (
318321 u .Query ().Get ("aws_access_key_id" ),
319322 u .Query ().Get ("aws_access_key_secret" ),
320323 u .Query ().Get ("aws_access_token" ),
321324 )
325+ creds = & provider
322326 }
323327
324328 return
325329}
326330
327331func (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
331336
332337 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+ )
341341 } 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
344347 }
345348
346- return s3 .New (sess ), nil
349+ return s3 .NewFromConfig (cfg , func (opts * s3.Options ) {
350+ opts .UsePathStyle = true
351+ }), nil
347352}
0 commit comments