S3跨账号复制遇CopyObject操作Access Denied错误排查
解决跨账号S3复制AccessDenied问题
当跨AWS账号复制S3桶内容出现AccessDenied错误时,即便配置了s3:GetObject和s3:PutObject,通常还有以下几个容易忽略的权限点需要检查:
源桶(bucketA)需额外权限
执行--recursive复制需要遍历桶内对象,因此必须确保执行命令的身份拥有s3:ListBucket权限。同时,源桶的桶策略需要明确允许目标账号(Account-B)或执行命令的IAM用户/角色访问,示例策略片段:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::Account-B-ID:root"}, "Action": ["s3:GetObject", "s3:ListBucket"], "Resource": ["arn:aws:s3:::bucketA", "arn:aws:s3:::bucketA/*"] } ] }目标桶(bucketB)需ACL相关权限
使用--acl bucket-owner-full-control参数时,执行命令的身份需要拥有s3:PutObjectAcl权限,否则无法设置对象的ACL让目标桶所有者获得控制权。如果目标桶开启了桶所有者强制设置(Bucket owner enforced),则无需该参数,可直接移除--acl bucket-owner-full-control后重试。确认执行命令的身份权限范围
无论使用Account-A还是Account-B的身份执行命令,该身份必须同时具备:- 对bucketA的
s3:GetObject和s3:ListBucket权限 - 对bucketB的
s3:PutObject(以及s3:PutObjectAcl,如果保留ACL参数)权限
建议优先使用Account-A的身份执行复制,因为桶所有者默认拥有桶内所有对象的访问权限,可避免对象级ACL的限制。
- 对bucketA的
检查对象级私有ACL
如果bucketA内存在其他账号上传的对象,且对象设置了私有ACL,即便桶策略允许访问,也会出现权限拒绝。此时需要对象所有者为执行身份授予s3:GetObject权限,或切换到Account-A的身份执行复制。
内容的提问来源于stack exchange,提问作者oscar
相关产品推荐
相关产品推荐

