Skip to content

批处理操作(unknown)

S3 批处理操作(S3 Batch Operations)允许你在数百万甚至数十亿个对象上执行大规模操作。本指南演示如何使用批处理操作将账户 A 的 S3 存储桶内容复制到账户 B。

关键要点:批处理作业必须在目标账户(账户 B)创建,而非源账户。

graph TB
    subgraph "账户 A - 源账户"
        A[源 S3 存储桶]
        B[源存储桶策略]
    end
    
    subgraph "账户 B - 目标账户"
        C[清单存储桶]
        D[目标 S3 存储桶]
        E[S3 批处理作业]
        F[IAM 角色]
        G[批处理报告存储桶]
    end
    
    A -->|生成清单| C
    C -->|读取清单| E
    E -->|使用角色| F
    F -->|读取源对象| A
    B -->|授权访问| F
    F -->|写入对象| D
    E -->|生成报告| G
    
    style A fill:#e1f5ff
    style D fill:#fff4e1
    style E fill:#f0f0f0
    style F fill:#ffe1e1
  • 源账户(账户 A)对源存储桶有完全访问权限
  • 目标账户(账户 B)已创建目标存储桶
  • 具备创建 IAM 角色和策略的权限
  • 了解基本的 S3 存储桶策略配置
  • 跨账户不能跨区域

步骤 1:在源账户(账户 A)配置存储桶策略

Section titled “步骤 1:在源账户(账户 A)配置存储桶策略”

在源存储桶上添加策略,允许目标账户的 IAM 角色读取对象:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCrossAccountRead",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ACCOUNT-B-ID:role/S3-Batch-Role"
},
"Action": [
"s3:GetObject",
"s3:GetObjectVersion"
],
"Resource": "arn:aws:s3:::source-bucket-name/*"
},
{
"Sid": "AllowCrossAccountBucketAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ACCOUNT-B-ID:role/S3-Batch-Role"
},
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::source-bucket-name"
}
]
}

配置说明:

  • ACCOUNT-B-ID 替换为目标账户的 12 位账户 ID
  • source-bucket-name 替换为实际的源(账户 A)存储桶名称
  • S3-Batch-Role 是将在步骤 4 中创建的 IAM 角色名称
  • 此策略允许目标账户的批处理角色读取源存储桶中的对象

步骤 2:在目标账户(账户 B)准备基础设施

Section titled “步骤 2:在目标账户(账户 B)准备基础设施”
  1. 创建必要的存储桶

    • destination-bucket-name:目标存储桶(用于存放复制的对象)
      • 建议开启版本控制
    • inventory-bucket-name:用于存储库存清单报告
    • batch-results-bucket:用于存储批处理作业报告
  2. 配置目标存储桶策略(可选,用于确保对象所有权):

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowBatchOperationsWrite",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ACCOUNT-B-ID:role/S3-Batch-Role"
},
"Action": [
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::destination-bucket-name/*"
}
]
}

步骤 3:在源账户(账户 A)创建 S3 清单

Section titled “步骤 3:在源账户(账户 A)创建 S3 清单”

S3 批处理操作需要清单文件来确定要处理的对象列表。清单将存储在目标账户的 inventory-bucket-name 中。

方法 1:使用 S3 库存(推荐用于大型数据集)

  1. 登录源账户(账户 A)AWS 控制台,进入 S3 服务
  2. 选择需要迁移的源存储桶
  3. 导航至 管理库存配置
  4. 点击 创建库存配置
  5. 配置以下参数:
    • 库存配置名称: batch-copy-inventory
    • 报告存储桶: 输入目标账户(账户 B)的清单存储桶 ARN
      • 格式:arn:aws:s3:::inventory-bucket-name
      • 注意:跨账户必须使用 ARN 格式,不能使用 s3:// 格式
    • 目标存储桶权限
      • AWS 会自动生成一段 JSON 策略
      • 复制这段策略
      • 登录目标账户(账户 B),进入 inventory-bucket-name 存储桶
      • 权限存储桶策略 中添加这段策略
      • 这允许源账户的 S3 服务写入清单报告到目标账户
    • 频率: 每天 或 每周
    • 输出格式: CSV(推荐,易于调试和查看)
    • 状态: 启用
    • 其他元数据字段(可选):
      • 大小
      • 最后修改日期
      • 存储类型
      • ETag

注意事项:

  • 首次清单报告因为存储量的不同,可能需要 24-48 小时生成
  • 清单文件以 Gzip 压缩的 CSV 或 Parquet 格式存储

2025/12/17

步骤 4:在目标账户(账户 B)创建 S3 批处理作业

Section titled “步骤 4:在目标账户(账户 B)创建 S3 批处理作业”

重要:批处理作业必须在目标账户(账户 B)创建,不是在源账户。

等待清单报告生成后,在目标账户创建批处理作业来执行复制操作。

通过控制台创建:

  1. 登录目标账户(账户 B)AWS 控制台

  2. 在 S3 控制台中,选择 批处理操作创建作业

  3. 选择清单报告:

    • 对象列表: 使用现有清单文件
    • 清单格式: CSV 或 Parquet
    • 浏览并选择生成的清单报告文件(manifest.json)
    • 清单路径示例:s3://inventory-bucket-name/source-bucket-name/batch-copy-inventory/2024-12-17T00-00Z/manifest.json
  4. 选择操作类型:复制

  5. 配置目标:

    • 目标桶: arn:aws:s3:::destination-bucket-name(使用目标账户的存储桶)
  6. 额外选项:

    • 存储类别: 选择目标存储类(可选)
    • 访问控制:
      • 推荐选择 bucket-owner-full-control
      • 这确保复制后的对象归目标账户所有
    • 加密方式: 选择加密方式(可选)
    • 对象元数据: 复制(保留原始元数据)
  7. 完成报告:

    • 选择报告存放的桶:batch-results-bucket
    • 报告将记录成功和失败的对象
  8. 配置完成设置(在目标账户 B 创建 IAM 角色):

    a. 创建 IAM 策略:

    1. 在 IAM 控制台,选择 策略创建策略
    2. 使用 JSON 编辑器,粘贴以下策略:
    {
    "Version": "2012-10-17",
    "Statement": [
    {
    "Sid": "ReadSourceBucket",
    "Effect": "Allow",
    "Action": [
    "s3:GetObject",
    "s3:GetObjectVersion",
    "s3:GetObjectVersionTagging",
    "s3:GetObjectTagging"
    ],
    "Resource": "arn:aws:s3:::source-bucket-name/*"
    },
    {
    "Sid": "ListSourceBucket",
    "Effect": "Allow",
    "Action": [
    "s3:ListBucket",
    "s3:GetBucketLocation"
    ],
    "Resource": "arn:aws:s3:::source-bucket-name"
    },
    {
    "Sid": "WriteDestinationBucket",
    "Effect": "Allow",
    "Action": [
    "s3:PutObject",
    "s3:PutObjectAcl",
    "s3:PutObjectTagging"
    ],
    "Resource": "arn:aws:s3:::destination-bucket-name/*"
    },
    {
    "Sid": "ReadInventory",
    "Effect": "Allow",
    "Action": [
    "s3:GetObject",
    "s3:GetObjectVersion"
    ],
    "Resource": "arn:aws:s3:::inventory-bucket-name/*"
    },
    {
    "Sid": "WriteJobReports",
    "Effect": "Allow",
    "Action": [
    "s3:PutObject"
    ],
    "Resource": "arn:aws:s3:::batch-results-bucket/*"
    }
    ]
    }
    1. 修改策略中的存储桶名称:

      • 替换 source-bucket-name 为源账户的实际存储桶名称
      • 替换 destination-bucket-name 为目标存储桶名称
      • 替换 inventory-bucket-name 为清单存储桶名称
      • 替换 batch-results-bucket 为报告存储桶名称
    2. 策略名称:S3-Batch-Operations-Policy

    b. 创建 IAM 角色:

    1. 在 IAM 控制台,选择 角色创建角色
    2. 可信实体类型:AWS 服务
    3. 使用案例:S3S3 Batch Operations
    4. 附加上面创建的策略:S3-Batch-Operations-Policy
    5. 角色名称:S3-Batch-Role

    关键配置说明:

    • 此角色必须在目标账户(账户 B)创建
    • 角色的信任关系会自动配置为信任 batchoperations.s3.amazonaws.com
    • 此角色需要读取源账户存储桶的权限(通过步骤 1 的存储桶策略授予)
    • 清单路径必须使用通配符 *,不能指定具体的 manifest.json 路径
  9. 审核并创建作业

重要参数说明:

  • CannedAccessControlList: bucket-owner-full-control:确保目标账户拥有完全控制权
  • MetadataDirective: COPY:保留原始对象元数据
  • confirmation-required:作业需要手动确认后才会运行
  1. 创建后,作业状态为 等待确认
  2. 在 Batch Operations 控制台中,选择作业并点击 运行作业
  3. 作业状态变更为 Active 并开始执行
  4. 监控作业进度:
    • Total objects: 总对象数
    • Succeeded: 成功复制的对象数
    • Failed: 失败的对象数
    • Completion percentage: 完成百分比

检查目标存储桶:

# 在目标账户检查复制的对象
aws s3 ls s3://destination-bucket-name/ --recursive
# 比较对象数量(需要分别在两个账户执行)
# 在源账户
aws s3 ls s3://source-bucket-name/ --recursive | wc -l
# 在目标账户
aws s3 ls s3://destination-bucket-name/ --recursive | wc -l

查看批处理作业报告:

作业完成后,在 batch-results-bucket 中会生成详细报告,包含:

  • 成功和失败的对象列表
  • 错误原因(如有)
  • 总体统计信息

验证对象所有权:

# 检查对象的所有者(应该是目标账户)
aws s3api get-object-acl --bucket destination-bucket-name --key path/to/file
  1. 选择合适的清单频率

    • 对于静态数据:使用 Weekly 清单
    • 对于频繁变化的数据:使用 Daily 清单
  2. 批处理作业配置

    • 设置合理的优先级(较低优先级可降低成本)
    • 使用对象过滤减少不必要的复制
  3. 并行处理

    • S3 批处理自动并行处理,无需额外配置
    • 大型作业会自动分片处理
  1. 请求成本

    • 每个复制操作产生 PUT 请求费用(目标)和 GET 请求费用(源)
    • 批处理作业本身按对象数量收费($0.25/百万对象)
  2. 数据传输成本

    • 跨账户同区域传输:免费
    • 跨区域传输:按标准数据传输费率计费
  3. 存储成本

    • 清单报告和批处理报告会产生额外存储成本
    • 建议定期清理旧报告
  1. 最小权限原则

    • IAM 角色仅授予必要的权限
    • 使用资源级权限限制访问范围
  2. 加密

    • 启用目标存储桶加密(SSE-S3、SSE-KMS)
    • 如使用 KMS,需配置密钥策略允许跨账户访问
  3. 审计

    • 启用 CloudTrail 记录 S3 批处理 API 调用
    • 定期审查批处理作业报告

问题 1:批处理作业无法读取清单

错误:Reading the manifest is forbidden: null

解决方案:

  • 确认批处理作业在目标账户(账户 B)创建,不是源账户
  • 检查 IAM 角色策略中清单路径使用通配符:arn:aws:s3:::inventory-bucket-name/*
  • 不要使用具体的 manifest.json 路径
  • 验证 IAM 角色有权限读取清单存储桶

问题 2:批处理作业无法读取源存储桶对象

错误:Access Denied403 Forbidden

解决方案:

  • 检查源账户(账户 A)的存储桶策略是否允许目标账户的 IAM 角色访问
  • 验证 IAM 角色 ARN 在源存储桶策略中配置正确
  • 确认 IAM 角色策略包含读取源存储桶的权限
  • 检查源存储桶是否启用了阻止公共访问,可能需要调整

问题 3:批处理作业无法写入目标存储桶

错误:Access Denied 写入失败

解决方案:

  • 验证 IAM 角色策略包含 s3:PutObjects3:PutObjectAcl 权限
  • 检查目标存储桶策略(如果配置了)是否允许写入
  • 确认目标存储桶的对象所有权设置

问题 4:批处理作业创建失败

错误:Invalid IAM role

解决方案:

  • 确认 IAM 角色在目标账户(账户 B)创建
  • 验证角色信任关系包含 batchoperations.s3.amazonaws.com
  • 检查角色名称拼写是否正确

问题 5:复制后对象所有权不正确

问题:对象复制成功,但源账户仍是所有者

解决方案:

  • 在批处理作业配置中,访问控制选择 bucket-owner-full-control
  • 或在目标存储桶设置中启用 Bucket owner enforced(对象所有权)
  • 这确保所有复制到目标存储桶的对象自动归目标账户所有

问题 6:清单报告未生成

解决方案:

  • S3 Inventory 首次生成需要 24-48 小时
  • 检查清单配置是否启用
  • 验证目标清单存储桶的桶策略允许源账户 S3 服务写入
  • 查看源存储桶的库存配置状态

问题 7:跨账户配置清单存储桶时报错

错误:Access Denied 配置清单目标

解决方案:

  • 使用 ARN 格式而非 s3:// 格式:arn:aws:s3:::inventory-bucket-name
  • 确保在目标账户的清单存储桶中添加了允许源账户 S3 服务写入的桶策略
  • AWS 控制台会自动生成所需的策略,复制并应用到目标存储桶
# 在目标账户检查批处理作业状态
aws s3control describe-job \
--account-id ACCOUNT-B-ID \
--job-id JOB-ID
# 列出所有批处理作业
aws s3control list-jobs \
--account-id ACCOUNT-B-ID \
--job-statuses Active Failed Completed
# 获取作业详细信息
aws s3control describe-job \
--account-id ACCOUNT-B-ID \
--job-id JOB-ID \
--output json > job-details.json
# 验证 IAM 角色权限(在目标账户)
aws iam get-role --role-name S3-Batch-Role
aws iam list-attached-role-policies --role-name S3-Batch-Role
# 测试源存储桶访问(使用 IAM 角色)
aws s3 ls s3://source-bucket-name/ --profile target-account

适用场景:

  • 需要持续、自动的复制
  • 实时或近实时复制需求
  • 跨区域灾难恢复

对比批处理操作:

  • 批处理:一次性大规模复制,手动触发
  • 复制:自动、持续复制新对象和现有对象

适用场景:

  • 大规模数据迁移(TB 到 PB 级别)
  • 需要数据验证和完整性检查
  • 从本地到 S3 的迁移
aws s3 sync s3://source-bucket-name s3://destination-bucket-name \
--source-region us-east-1 \
--region us-west-2

适用场景:

  • 小规模数据复制(< 1TB)
  • 临时性、一次性需求
  • 不需要详细报告和审计

S3 批处理操作提供了可靠、可扩展的跨账户对象复制解决方案,特别适合以下场景:

  • 大规模数据迁移(数百万至数十亿对象)
  • 需要详细报告和审计追踪
  • 一次性或定期批量复制需求
  • 需要精确控制复制过程和对象所有权
  1. 批处理作业位置:必须在目标账户(账户 B)创建,不是源账户
  2. 权限配置方向
    • 源账户存储桶策略:授权目标账户的 IAM 角色读取
    • 目标账户 IAM 角色:拥有读取源桶和写入目标桶的权限
  3. 清单存储位置:清单文件存储在目标账户,但由源账户的 S3 服务生成
  4. 对象所有权:使用 bucket-owner-full-control 确保对象归目标账户所有

通过正确配置存储桶策略、IAM 角色和批处理作业参数,可以安全高效地完成跨账户数据复制任务。