@@ -194,6 +194,7 @@ def upload_file(
194
194
195
195
S3ClientWrapper ._attempt_import_boto3 ()
196
196
import boto3 .s3 .transfer
197
+ from boto3 .exceptions import S3UploadFailedError
197
198
198
199
transfer_config = boto3 .s3 .transfer .TransferConfig (
199
200
** (transfer_config_kwargs or {})
@@ -222,13 +223,27 @@ def upload_file(
222
223
)
223
224
224
225
# automatically determines whether to perform multi-part upload
225
- s3 .Bucket (bucket ).upload_file (
226
- upload_file_path ,
227
- remote_file_key ,
228
- Callback = progress_callback ,
229
- Config = transfer_config ,
230
- ExtraArgs = {"ACL" : "bucket-owner-full-control" },
231
- )
226
+ try :
227
+ s3 .Bucket (bucket ).upload_file (
228
+ upload_file_path ,
229
+ remote_file_key ,
230
+ Callback = progress_callback ,
231
+ Config = transfer_config ,
232
+ ExtraArgs = {"ACL" : "bucket-owner-full-control" },
233
+ )
234
+ except S3UploadFailedError as upload_error :
235
+ if "Invalid canned ACL" in str (upload_error ):
236
+ s3 .Bucket (bucket ).upload_file (
237
+ upload_file_path ,
238
+ remote_file_key ,
239
+ Callback = progress_callback ,
240
+ Config = transfer_config ,
241
+ # https://sagebionetworks.jira.com/browse/SYNPY-1198
242
+ # IBM Based buckets enforce this by default, and does not support this additional setting
243
+ # ExtraArgs={"ACL": "bucket-owner-full-control"},
244
+ )
245
+ else :
246
+ raise upload_error
232
247
if progress_bar is not None :
233
248
progress_bar .close ()
234
249
return upload_file_path
0 commit comments