批处理操作(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 清单”- 创建存储桶,
inventory-bucket-name:用户存储库存清单报告batch-results-bucket:用户存储批处理报告
- S3 批处理操作需要清单文件来确定要处理的对象列表。
通过控制台配置:
- 登录 AWS 控制台,进入 S3 服务
- 选择需要迁移的存储桶
- 导航至 管理 → 库存配置
- 点击 创建库存配置
- 配置以下参数:
- 库存配置名称:
batch-copy-inventory - 报告存储桶: 选择用于存储清单的存储桶
s3://inventory-bucket-name - 目标存储桶权限:复制给出的JSON到
inventory-bucket-name的桶策略中- 点击添加语句,粘贴替换到灰色的部分
- 频率: 每天 或 每周
- 输出格式: CSV 或 Parquet
- 状态: 启用
- 其他元数据字段(可选):
- 大小
- 最后修改日期
- 存储类型
- ETag
- 库存配置名称:
注意事项:
- 首次清单报告因为存储量的不同,可能需要 24-48 小时生成;
- 清单文件以 Gzip 压缩的 CSV 或 Parquet 格式存储
步骤 4:创建 S3 批处理作业
Section titled “步骤 4:创建 S3 批处理作业”等待清单报告生成后,创建批处理作业来执行复制操作。
通过控制台创建:
- 在 S3 控制台中,选择 批处理操作 → 创建作业
- 选择清单报告:
- 对象列表: 使用现有清单文件
- 清单格式: CSV 或 Parquet
- 浏览并选择生成的清单报告文件(manifest.json)
- 选择操作类型:复制
- 配置目标:
- 目标桶:
s3://目标桶名称
- 目标桶:
- 额外选项:
- 存储类别: 选择目标存储类(可选)
- 访问控制: 对象拥有者(推荐用于跨账户)
- 加密方式: 选择加密方式(可选)
- 对象元数据: 复制(保留原始元数据)
- 完成报告:
- 选择报告存放的桶
batch-results-bucket
- 选择报告存放的桶
- 配置完成设置:
- 创建IAM策略:
- 复制给出的IAM角色策略模板,到策略编辑器
- 修改语句
{{SourceBucketArn}}=arn:aws:s3:::源桶名称{{SourceBucketArn}}/*=arn:aws:s3:::源桶名称/*(ARN可以在源桶的属性页面找到)- 修改清单路径:
s3://inventory-bucket-name/sv4puobtz55xufufcdd/batch-copy-inventory/2025-12-16T01-00Z/manifest.json为s3://inventory-bucket-name/*;否则会遇到无法无法读取的错误。
- 策略名称:
S3-Batch-Policy
- 创建IAM角色:
- 可信实体类型:AWS服务,使用案例:S3->S3 Batch Operations
- 附加策略
S3-Batch-Policy - 角色名称:
S3-Batch-Role
- 创建IAM策略:
- 审核并创建作业
重要参数说明:
CannedAccessControlList: bucket-owner-full-control:确保目标账户拥有完全控制权MetadataDirective: COPY:保留原始对象元数据confirmation-required:作业需要手动确认后才会运行
步骤 5:确认并运行批处理作业
Section titled “步骤 5:确认并运行批处理作业”- 创建后,作业状态为 等待确认
- 在 Batch Operations 控制台中,选择作业并点击 运行作业
- 作业状态变更为 Active 并开始执行
- 监控作业进度:
- Total objects: 总对象数
- Succeeded: 成功复制的对象数
- Failed: 失败的对象数
- Completion percentage: 完成百分比
步骤 6:验证复制结果
Section titled “步骤 6:验证复制结果”检查目标存储桶:
# 列出目标存储桶中的对象aws s3 ls s3://destination-bucket-name/ --recursive --profile account-b
# 比较对象数量aws s3 ls s3://source-bucket-name/ --recursive | wc -laws s3 ls s3://destination-bucket-name/ --recursive --profile account-b | wc -l查看批处理作业报告:
作业完成后,在指定的报告存储桶中会生成详细报告,包含:
- 成功和失败的对象列表
- 错误原因(如有)
- 总体统计信息
-
选择合适的清单频率
- 对于静态数据:使用 Weekly 清单
- 对于频繁变化的数据:使用 Daily 清单
-
批处理作业配置
- 设置合理的优先级(较低优先级可降低成本)
- 使用对象过滤减少不必要的复制
-
并行处理
- S3 批处理自动并行处理,无需额外配置
- 大型作业会自动分片处理
-
请求成本
- 每个复制操作产生 PUT 请求费用(目标)和 GET 请求费用(源)
- 批处理作业本身按对象数量收费($0.25/百万对象)
-
数据传输成本
- 跨账户同区域传输:免费
- 跨区域传输:按标准数据传输费率计费
-
存储成本
- 清单报告和批处理报告会产生额外存储成本
- 建议定期清理旧报告
-
最小权限原则
- IAM 角色仅授予必要的权限
- 使用资源级权限限制访问范围
-
加密
- 启用目标存储桶加密(SSE-S3、SSE-KMS)
- 如使用 KMS,需配置密钥策略允许跨账户访问
-
审计
- 启用 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.jsonS3 复制(S3 Replication)
Section titled “S3 复制(S3 Replication)”适用场景:
- 需要持续、自动的复制
- 实时或近实时复制需求
- 跨区域灾难恢复
对比批处理操作:
- 批处理:一次性大规模复制,手动触发
- 复制:自动、持续复制新对象和现有对象
AWS DataSync
Section titled “AWS DataSync”适用场景:
- 大规模数据迁移(TB 到 PB 级别)
- 需要数据验证和完整性检查
- 从本地到 S3 的迁移
AWS CLI 同步
Section titled “AWS CLI 同步”aws s3 sync s3://source-bucket-name s3://destination-bucket-name \ --source-region us-east-1 \ --region us-west-2适用场景:
- 小规模数据复制(< 1TB)
- 临时性、一次性需求
- 不需要详细报告和审计
S3 批处理操作提供了可靠、可扩展的跨账户对象复制解决方案,特别适合以下场景:
- 大规模数据迁移(数百万至数十亿对象)
- 需要详细报告和审计追踪
- 一次性或定期批量复制需求
- 需要精确控制复制过程
通过正确配置存储桶策略、IAM 角色和批处理作业参数,可以安全高效地完成跨账户数据复制任务。