如何通过Assume Role跨账号读S3并直接复制到自有S3(无需中转)
解决方案:跨账号S3对象无中转复制(避免目标桶开放权限)
一、用Boto3多会话实现无中转复制
完全可以通过多会话实现,核心思路是用两个身份分别处理读源桶和写目标桶,通过预签名URL传递源对象的临时读取权限,不需要给目标Bucket B添加允许源角色写入的桶策略。
具体步骤:
创建两个Boto3会话
- 会话1:Assume到能读取Bucket A的跨账号角色,获取源身份凭证。
- 会话2:使用你自己账号的身份(比如本地默认凭证、或你拥有写入Bucket B权限的IAM用户/角色)。
生成源对象的预签名URL
用会话1的S3客户端,为Bucket A中的目标对象生成带s3:GetObject权限的预签名URL,有效期设置为足够完成复制的时间(比如3600秒)。用目标身份发起复制
用会话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权限,同时整合读源桶和写目标桶的能力。
具体配置:
在自身账号创建新角色(比如
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的角色名" }
- 允许写入自身账号的Bucket B:
- 信任关系策略:仅允许你指定的身份(比如你的IAM用户ARN、或你常用的角色ARN)Assume该角色,示例策略:
使用流程
- 你先Assume自身账号的
MyCopyRole(因为信任关系限制,只有你能操作)。 - 在该角色会话内,Assume跨账号读Bucket A的角色,获取源凭证。
- 生成源对象预签名URL,再用
MyCopyRole的权限写入Bucket B(流程和多会话一致)。
- 你先Assume自身账号的
这种方式的优势:
- 角色权限集中管理,避免直接使用个人凭证。
- 专属角色仅对你开放,进一步降低权限滥用风险。
- 复用原跨账号角色的读权限,无需重复配置源桶权限。
内容的提问来源于stack exchange,提问作者Itay Weiss
相关产品推荐
相关产品推荐

