You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过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权限(用于管理分段上传全流程)
  • 额外注意:若源桶默认拒绝跨账户访问,需在源桶策略中添加允许目标角色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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 12:42:27