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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:20:38