diff --git a/.changelog/096161d8acea4d53afe332ec60aac3db.json b/.changelog/096161d8acea4d53afe332ec60aac3db.json new file mode 100644 index 00000000000..34ca7a7fa53 --- /dev/null +++ b/.changelog/096161d8acea4d53afe332ec60aac3db.json @@ -0,0 +1,8 @@ +{ + "id": "096161d8-acea-4d53-afe3-32ec60aac3db", + "type": "bugfix", + "description": "Enable user to call GetBucketRegion without credential config", + "modules": [ + "feature/s3/manager" + ] +} \ No newline at end of file diff --git a/feature/s3/manager/bucket_region.go b/feature/s3/manager/bucket_region.go index 8c701952949..5e06ea1d348 100644 --- a/feature/s3/manager/bucket_region.go +++ b/feature/s3/manager/bucket_region.go @@ -63,8 +63,6 @@ const bucketRegionHeader = "X-Amz-Bucket-Region" // // manager.GetBucketRegion(ctx, s3.NewFromConfig(cfg), bucket, func(o *s3.Options) { // o.Credentials = nil -// // Or -// o.Credentials = aws.AnonymousCredentials{} // }) // // The request with anonymous credentials will not be signed. @@ -72,11 +70,14 @@ const bucketRegionHeader = "X-Amz-Bucket-Region" func GetBucketRegion(ctx context.Context, client HeadBucketAPIClient, bucket string, optFns ...func(*s3.Options)) (string, error) { var captureBucketRegion deserializeBucketRegion - clientOptionFns := make([]func(*s3.Options), len(optFns)+1) + clientOptionFns := make([]func(*s3.Options), len(optFns)+2) clientOptionFns[0] = func(options *s3.Options) { options.APIOptions = append(options.APIOptions, captureBucketRegion.RegisterMiddleware) } - copy(clientOptionFns[1:], optFns) + clientOptionFns[1] = func(options *s3.Options) { + options.Credentials = nil + } + copy(clientOptionFns[2:], optFns) _, err := client.HeadBucket(ctx, &s3.HeadBucketInput{ Bucket: aws.String(bucket), diff --git a/feature/s3/manager/bucket_region_test.go b/feature/s3/manager/bucket_region_test.go index c0ed0151946..e10be6eb300 100644 --- a/feature/s3/manager/bucket_region_test.go +++ b/feature/s3/manager/bucket_region_test.go @@ -39,9 +39,8 @@ func testSetupGetBucketRegionServer(region string, statusCode int, incHeader boo } var testGetBucketRegionCases = []struct { - RespRegion string - StatusCode int - ExpectReqRegion string + RespRegion string + StatusCode int }{ { RespRegion: "bucket-region", @@ -56,9 +55,8 @@ var testGetBucketRegionCases = []struct { StatusCode: 200, }, { - RespRegion: "bucket-region", - StatusCode: 200, - ExpectReqRegion: "default-region", + RespRegion: "bucket-region", + StatusCode: 200, }, } diff --git a/feature/s3/manager/integ_bucket_region_test.go b/feature/s3/manager/integ_bucket_region_test.go index 92087723c7e..d1a8c16416f 100644 --- a/feature/s3/manager/integ_bucket_region_test.go +++ b/feature/s3/manager/integ_bucket_region_test.go @@ -8,19 +8,34 @@ import ( "testing" "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/credentials" "github.com/aws/aws-sdk-go-v2/feature/s3/manager" "github.com/aws/aws-sdk-go-v2/service/s3" ) func TestInteg_GetBucketRegion(t *testing.T) { expectRegion := integConfig.Region - - region, err := manager.GetBucketRegion(context.Background(), s3.NewFromConfig(integConfig), aws.ToString(bucketName)) - if err != nil { - t.Fatalf("expect no error, got %v", err) + cases := map[string]struct { + optFns []func(*s3.Options) + }{ + "normal credentials": {[]func(o *s3.Options){}}, + "invalid credentials": {[]func(o *s3.Options){ + func(o *s3.Options) { + o.Credentials = credentials.NewStaticCredentialsProvider("fakeDummy", "fakeDummy", "") + }, + }}, } - if e, a := expectRegion, region; e != a { - t.Errorf("expect %s bucket region, got %s", e, a) + for name, c := range cases { + t.Run(name, func(t *testing.T) { + region, err := manager.GetBucketRegion(context.Background(), s3.NewFromConfig(integConfig, c.optFns...), aws.ToString(bucketName)) + if err != nil { + t.Fatalf("expect no error, got %v", err) + } + + if e, a := expectRegion, region; e != a { + t.Errorf("expect %s bucket region, got %s", e, a) + } + }) } }