Skip to content

Commit 178ef7f

Browse files
SNOW-3637978: Do not attempt to get S3 bucket accelerate config for Snowflake-internal stages (#1805)
1 parent 9dbf61b commit 178ef7f

3 files changed

Lines changed: 39 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
New features:
66

77
Bug fixes:
8+
- Do not attempt to get S3 bucket accelerate config for Snowflake-internal stages (matched by bucket name `sfc-*`) since s3:GetAccelerateConfiguration not granted anyways (snowflakedb/gosnowflake#1805).
89

910
Internal changes:
1011

file_transfer_agent.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -650,6 +650,12 @@ func (sfa *snowflakeFileTransferAgent) transferAccelerateConfigWithUtil(s3Util s
650650
if err != nil {
651651
return err
652652
}
653+
// role used in Snowflake stage (bucket sfc-*) operations doesn't have s3:GetAccelerateConfiguration
654+
// thus get-bucket-accelerate-configuration API calls will surely fail with HTTP 403
655+
if strings.HasPrefix(strings.ToLower(s3Loc.bucketName), "sfc-") {
656+
logger.WithContext(sfa.sc.ctx).Debugf("Not attempting to get bucket transfer accelerate endpoint for internal stage.")
657+
return nil
658+
}
653659
s3Cli, err := s3Util.createClientWithConfig(sfa.stageInfo, false, sfa.sc.cfg, sfa.sc.telemetry)
654660
if err != nil {
655661
return err
@@ -663,12 +669,16 @@ func (sfa *snowflakeFileTransferAgent) transferAccelerateConfigWithUtil(s3Util s
663669
Message: errors2.ErrMsgFailedToConvertToS3Client,
664670
}, sfa.sc)
665671
}
672+
logger.WithContext(sfa.sc.ctx).Debugf("Getting accelerate endpoint for bucket %v.", s3Loc.bucketName)
666673
ret, err := withCloudStorageTimeout(sfa.ctx, sfa.sc.cfg, func(ctx context.Context) (*s3.GetBucketAccelerateConfigurationOutput, error) {
667674
return client.GetBucketAccelerateConfiguration(ctx, &s3.GetBucketAccelerateConfigurationInput{
668675
Bucket: &s3Loc.bucketName,
669676
})
670677
})
671678
sfa.useAccelerateEndpoint = ret != nil && ret.Status == "Enabled"
679+
if sfa.useAccelerateEndpoint {
680+
logger.WithContext(sfa.sc.ctx).Debugf("Transfer acceleration enabled for bucket %v.", s3Loc.bucketName)
681+
}
672682
if err != nil {
673683
logger.WithContext(sfa.sc.ctx).Warnf("An error occurred when getting accelerate config: %v", err)
674684
}

file_transfer_agent_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,34 @@ func TestGetBucketAccelerateConfigurationInvalidClient(t *testing.T) {
180180
})
181181
}
182182

183+
func TestGetBucketAccelerateConfigurationSkippedForInternalStage(t *testing.T) {
184+
runSnowflakeConnTest(t, func(sct *SCTest) {
185+
sfa := &snowflakeFileTransferAgent{
186+
ctx: context.Background(),
187+
sc: sct.sc,
188+
commandType: uploadCommand,
189+
srcFiles: make([]string, 0),
190+
data: &execResponseData{
191+
SrcLocations: make([]string, 0),
192+
},
193+
stageInfo: &execResponseStageInfo{
194+
Location: "sfc-test-bucket-customer-stage.s3.amazonaws.com",
195+
},
196+
}
197+
err := sfa.transferAccelerateConfigWithUtil(&s3ClientCreatorMock{
198+
extract: func(s string) (*s3Location, error) {
199+
return &s3Location{bucketName: "sfc-test-bucket-customer-stage.s3.amazonaws.com", s3Path: ""}, nil
200+
},
201+
create: func(info *execResponseStageInfo, useAccelerateEndpoint bool, cfg *Config, _ *snowflakeTelemetry) (cloudClient, error) {
202+
t.Fatal("S3 client must not be created for internal stage bucket")
203+
return nil, nil
204+
},
205+
})
206+
assertNilF(t, err)
207+
assertFalseF(t, sfa.useAccelerateEndpoint, "useAccelerateEndpoint should be false for internal stage bucket")
208+
})
209+
}
210+
183211
func TestUnitDownloadWithInvalidLocalPath(t *testing.T) {
184212
tmpDir, err := os.MkdirTemp("", "data")
185213
if err != nil {

0 commit comments

Comments
 (0)