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

如何通过Assume Role跨账号读S3并直接复制到自有S3(无需中转)

解决方案:跨账号S3对象无中转复制(避免目标桶开放权限)

一、用Boto3多会话实现无中转复制

完全可以通过多会话实现,核心思路是用两个身份分别处理读源桶和写目标桶,通过预签名URL传递源对象的临时读取权限,不需要给目标Bucket B添加允许源角色写入的桶策略。

具体步骤:

  1. 创建两个Boto3会话

    • 会话1:Assume到能读取Bucket A的跨账号角色,获取源身份凭证。
    • 会话2:使用你自己账号的身份(比如本地默认凭证、或你拥有写入Bucket B权限的IAM用户/角色)。
  2. 生成源对象的预签名URL
    用会话1的S3客户端,为Bucket A中的目标对象生成带s3:GetObject权限的预签名URL,有效期设置为足够完成复制的时间(比如3600秒)。

  3. 用目标身份发起复制
    用会话2的S3客户端调用copy_object接口,将预签名URL作为CopySource参数,直接复制到Bucket B。

示例代码:

import boto3

# 会话1:Assume跨账号读Bucket A的角色
sts_client = boto3.client('sts')
assumed_role = sts_client.assume_role(
    RoleArn='arn:aws:iam::源账号ID:role/读BucketA的角色名',
    RoleSessionName='CrossAccountReadSession'
)
source_s3 = boto3.client(
    's3',
    aws_access_key_id=assumed_role['Credentials']['AccessKeyId'],
    aws_secret_access_key=assumed_role['Credentials']['SecretAccessKey'],
    aws_session_token=assumed_role['Credentials']['SessionToken']
)

# 生成预签名URL(有效期3600秒)
presigned_url = source_s3.generate_presigned_url(
    'get_object',
    Params={'Bucket': 'bucket-a', 'Key': '目标对象路径'},
    ExpiresIn=3600
)

# 会话2:使用自身账号身份(默认凭证,需拥有Bucket B写入权限)
target_s3 = boto3.client('s3')

# 发起跨桶复制
target_s3.copy_object(
    Bucket='bucket-b',
    Key='目标存储路径',
    CopySource=presigned_url
)

这种方式的优势:

  • 无需修改Bucket B的桶策略,避免源角色所属账号获得写入权限。
  • 复制操作由S3后台直接完成,无本地数据中转。
  • 预签名URL仅在设定有效期内有效,降低权限泄露风险。

二、创建仅你可用的角色复用原权限

也可以通过在自身账号创建专属角色来实现,核心是让这个角色仅对你开放Assume权限,同时整合读源桶和写目标桶的能力。

具体配置:

  1. 在自身账号创建新角色(比如MyCopyRole)

    • 信任关系策略:仅允许你指定的身份(比如你的IAM用户ARN、或你常用的角色ARN)Assume该角色,示例策略:
      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "AWS": "arn:aws:iam::你的账号ID:user/你的用户名"
                  },
                  "Action": "sts:AssumeRole"
              }
          ]
      }
      
    • 权限策略:
      • 允许写入自身账号的Bucket B:
        {
            "Effect": "Allow",
            "Action": ["s3:PutObject", "s3:PutObjectAcl"],
            "Resource": "arn:aws:s3:::bucket-b/*"
        }
        
      • 允许Assume跨账号读Bucket A的角色:
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::源账号ID:role/读BucketA的角色名"
        }
        
  2. 使用流程

    • 你先Assume自身账号的MyCopyRole(因为信任关系限制,只有你能操作)。
    • 在该角色会话内,Assume跨账号读Bucket A的角色,获取源凭证。
    • 生成源对象预签名URL,再用MyCopyRole的权限写入Bucket B(流程和多会话一致)。

这种方式的优势:

  • 角色权限集中管理,避免直接使用个人凭证。
  • 专属角色仅对你开放,进一步降低权限滥用风险。
  • 复用原跨账号角色的读权限,无需重复配置源桶权限。

内容的提问来源于stack exchange,提问作者Itay Weiss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:12:29