Skip to content

批处理操作(unknown)

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

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

步骤 1:在目标账户(账户 B)配置存储桶策略

Section titled “步骤 1:在目标账户(账户 B)配置存储桶策略”
  • 目标桶开启版本控制
  • 在目标存储桶上添加策略,允许源账户写入对象:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCrossAccountCopy",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ACCOUNT-A-ID:root"
},
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:PutObjectTagging"
],
"Resource": "arn:aws:s3:::destination-bucket-name/*"
},
{
"Sid": "AllowCrossAccountBucketAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ACCOUNT-A-ID:root"
},
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::destination-bucket-name"
}
]
}

配置说明:

  • ACCOUNT-A-ID 替换为源账户的 12 位账户 ID
  • destination-bucket-name 替换为实际的目标(账户B)存储桶名称
  • PutObjectAcl 权限用于保持对象 ACL(可选)

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

Section titled “步骤 2:在源账户(账户 A)创建 S3 清单”
  1. 创建存储桶,
    1. inventory-bucket-name:用户存储库存清单报告
    2. batch-results-bucket:用户存储批处理报告
  2. S3 批处理操作需要清单文件来确定要处理的对象列表。

通过控制台配置:

  1. 登录 AWS 控制台,进入 S3 服务
  2. 选择需要迁移的存储桶
  3. 导航至 管理库存配置
  4. 点击 创建库存配置
  5. 配置以下参数:
    • 库存配置名称: batch-copy-inventory
    • 报告存储桶: 选择用于存储清单的存储桶s3://inventory-bucket-name
    • 目标存储桶权限:复制给出的JSON到inventory-bucket-name的桶策略中
      • 点击添加语句,粘贴替换到灰色的部分
    • 频率: 每天 或 每周
    • 输出格式: CSV 或 Parquet
    • 状态: 启用
    • 其他元数据字段(可选):
      • 大小
      • 最后修改日期
      • 存储类型
      • ETag

注意事项:

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

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

通过控制台创建:

  1. 在 S3 控制台中,选择 批处理操作创建作业
  2. 选择清单报告:
    • 对象列表: 使用现有清单文件
    • 清单格式: CSV 或 Parquet
    • 浏览并选择生成的清单报告文件(manifest.json)
  3. 选择操作类型:复制
  4. 配置目标:
    • 目标桶: s3://目标桶名称
  5. 额外选项:
    • 存储类别: 选择目标存储类(可选)
    • 访问控制: 对象拥有者(推荐用于跨账户)
    • 加密方式: 选择加密方式(可选)
    • 对象元数据: 复制(保留原始元数据)
  6. 完成报告:
    • 选择报告存放的桶batch-results-bucket
  7. 配置完成设置:
    1. 创建IAM策略:
      1. 复制给出的IAM角色策略模板,到策略编辑器
      2. 修改语句
        1. {{SourceBucketArn}}=arn:aws:s3:::源桶名称
        2. {{SourceBucketArn}}/*=arn:aws:s3:::源桶名称/*(ARN可以在源桶的属性页面找到)
        3. 修改清单路径:s3://inventory-bucket-name/sv4puobtz55xufufcdd/batch-copy-inventory/2025-12-16T01-00Z/manifest.jsons3://inventory-bucket-name/*;否则会遇到无法无法读取的错误。
      3. 策略名称:S3-Batch-Policy
    2. 创建IAM角色:
      1. 可信实体类型:AWS服务,使用案例:S3->S3 Batch Operations
      2. 附加策略S3-Batch-Policy
      3. 角色名称:S3-Batch-Role
  8. 审核并创建作业

重要参数说明:

  • 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 --profile account-b
# 比较对象数量
aws s3 ls s3://source-bucket-name/ --recursive | wc -l
aws s3 ls s3://destination-bucket-name/ --recursive --profile account-b | wc -l

查看批处理作业报告:

作业完成后,在指定的报告存储桶中会生成详细报告,包含:

  • 成功和失败的对象列表
  • 错误原因(如有)
  • 总体统计信息
  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:批处理作业创建失败

错误:AccessDenied: Access Denied

解决方案:

  • 检查目标存储桶策略是否正确配置
  • 验证 IAM 角色权限是否完整
  • 确认目标存储桶所有者是否为账户 B

问题 2:对象复制失败

错误:403 Forbidden

解决方案:

  • 验证目标存储桶策略包含 s3:PutObject 权限
  • 检查 KMS 密钥策略(如使用加密)
  • 确认 IAM 角色可以代入

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

解决方案:

  • 在批处理作业中设置 CannedAccessControlList: bucket-owner-full-control
  • 或在目标存储桶启用 Bucket owner enforced 设置

问题 4:清单报告未生成

解决方案:

  • 等待 24-48 小时(首次生成时间较长)
  • 检查清单配置是否启用
  • 验证清单目标存储桶权限
# 检查批处理作业状态
aws s3control describe-job \
--account-id ACCOUNT-A-ID \
--job-id JOB-ID
# 列出所有批处理作业
aws s3control list-jobs \
--account-id ACCOUNT-A-ID \
--job-statuses Active Failed Completed
# 获取作业详细信息
aws s3control describe-job \
--account-id ACCOUNT-A-ID \
--job-id JOB-ID \
--output json > job-details.json

适用场景:

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

对比批处理操作:

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

适用场景:

  • 大规模数据迁移(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 批处理操作提供了可靠、可扩展的跨账户对象复制解决方案,特别适合以下场景:

  • 大规模数据迁移(数百万至数十亿对象)
  • 需要详细报告和审计追踪
  • 一次性或定期批量复制需求
  • 需要精确控制复制过程

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