能否通过STS角色链实现跨账户S3服务器端分段复制?
实现Boto3同区域跨账户S3纯服务器端分段复制(基于角色链)
核心结论
完全可以通过IAM角色链实现S3客户端切换角色后,直接调用upload_part_copy完成纯服务器端跨账户分段复制,无需本地转存文件。
关键步骤
1. 配置IAM权限链
- 源账户侧:执行角色切换的初始身份(用户/角色)需具备
sts:AssumeRole权限,允许切换至目标账户的指定IAM角色。 - 目标账户侧:被切换的角色需同时拥有:
- 源S3桶的
s3:GetObject权限(用于读取待复制的分段数据) - 目标S3桶的
s3:PutObject、s3:ListBucket、s3:AbortMultipartUpload、s3:ListMultipartUploadParts权限(用于管理分段上传全流程)
- 源S3桶的
- 额外注意:若源桶默认拒绝跨账户访问,需在源桶策略中添加允许目标角色ARN读取对象的规则。
2. Boto3代码实现示例
先通过STS服务获取目标角色的临时凭证,再用该凭证初始化S3客户端,直接执行服务器端分段复制:
import boto3 # 1. 用源账户身份初始化STS客户端 sts_client = boto3.client('sts') # 2. 切换至目标账户的角色 assume_role_resp = sts_client.assume_role( RoleArn='arn:aws:iam::目标账户ID:role/目标复制角色名', RoleSessionName='s3-cross-account-copy-session' ) # 3. 用临时凭证创建具备跨账户权限的S3客户端 temp_creds = assume_role_resp['Credentials'] s3_client = boto3.client( 's3', aws_access_key_id=temp_creds['AccessKeyId'], aws_secret_access_key=temp_creds['SecretAccessKey'], aws_session_token=temp_creds['SessionToken'] ) # 4. 初始化分段上传 multipart_upload = s3_client.create_multipart_upload( Bucket='目标桶名称', Key='目标对象键' ) upload_id = multipart_upload['UploadId'] # 5. 执行单段服务器端复制(示例:10MB分段) part_resp = s3_client.upload_part_copy( Bucket='目标桶名称', Key='目标对象键', UploadId=upload_id, PartNumber=1, CopySource={ 'Bucket': '源桶名称', 'Key': '源对象键' }, CopySourceRange='bytes=0-10485759' ) # 6. 完成分段上传 s3_client.complete_multipart_upload( Bucket='目标桶名称', Key='目标对象键', UploadId=upload_id, MultipartUpload={ 'Parts': [ {'ETag': part_resp['CopyPartResult']['ETag'], 'PartNumber': 1} ] } )
3. 重要注意事项
- 角色链的长度不能超过AWS当前限制(最大5个角色)
- 分段大小需符合S3规则:最小5MB(最后一段可小于5MB),最大5GB
- 建议添加异常处理逻辑,分段上传失败时调用
abort_multipart_upload清理未完成的上传任务
内容的提问来源于stack exchange,提问作者Kevin Lam
相关产品推荐
相关产品推荐

