如何解决AWS CopyObject跨账号复制后对象归属为源账号的问题?
解决S3跨账号复制后对象归属及ACL权限报错问题
问题分析
跨账号复制S3对象后归属仍为源账号A,添加ACL: 'bucket-owner-full-control'触发AccessDenied错误,核心原因是源桶/目标桶权限配置不足,或执行复制的IAM身份缺少必要权限。
解决方案步骤
1. 配置源桶权限,允许跨账号读取及修改ACL
通过源桶的桶策略,给目标账号B(或执行复制的具体IAM身份)授予读取源对象、修改对象ACL的权限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<账号B ID>:root" // 可替换为执行复制的IAM角色/用户ARN }, "Action": ["s3:GetObject", "s3:GetObjectAcl"], "Resource": "arn:aws:s3:::source_bucket_name/*" }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<账号B ID>:root" }, "Action": "s3:PutObjectAcl", "Resource": "arn:aws:s3:::source_bucket_name/*" } ] }
如果复制操作由账号A的IAM身份发起,需给该身份附加包含s3:GetObject、s3:PutObjectAcl权限的IAM策略。
2. 配置目标桶权限,允许接收带ACL的对象
优先方案:启用桶所有者强制控制(推荐)
这是AWS官方推荐的跨账号对象归属解决方案,无需依赖ACL:
- 进入目标桶的权限设置,找到对象所有权选项,选择桶所有者强制控制并保存。
- 启用后,所有写入该桶的对象自动归属账号B,无需添加
ACL参数,直接执行复制即可。
备选方案:通过桶策略允许ACL设置
如果必须使用ACL方式,给目标桶添加以下桶策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "<执行复制的IAM身份ARN>" }, "Action": ["s3:PutObject", "s3:PutObjectAcl"], "Resource": "arn:aws:s3:::some_destination_bucket/*" } ] }
3. 修正复制代码参数
如果使用ACL方式,注意参数格式的正确性:
import { S3 } from 'aws-sdk'; import { CopyObjectRequest } from 'aws-sdk/clients/s3'; const s3 = new S3(); const params: CopyObjectRequest = { Bucket: 'some_destination_bucket', CopySource: '/source_bucket_name/file_name', // 注意开头的斜杠,避免路径解析错误 Key: 'file_name', // 目标键只需桶内路径,无需重复桶名 ExpectedBucketOwner: '<账号B ID>', ACL: 'bucket-owner-full-control' }; s3.copyObject(params).promise() .then(data => console.log('复制成功', data)) .catch(err => console.error('复制失败', err));
4. 验证执行复制的IAM身份权限
确保执行复制的IAM用户/角色具备以下权限:
- 对源桶:
s3:GetObject、s3:GetObjectAcl - 对目标桶:
s3:PutObject、s3:PutObjectAcl
对应的IAM策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject", "s3:GetObjectAcl"], "Resource": "arn:aws:s3:::source_bucket_name/*" }, { "Effect": "Allow", "Action": ["s3:PutObject", "s3:PutObjectAcl"], "Resource": "arn:aws:s3:::some_destination_bucket/*" } ] }
内容的提问来源于stack exchange,提问作者David Faizulaev
相关产品推荐
相关产品推荐

