批处理操作(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)准备基础设施”-
创建必要的存储桶:
destination-bucket-name:目标存储桶(用于存放复制的对象)- 建议开启版本控制
inventory-bucket-name:用于存储库存清单报告batch-results-bucket:用于存储批处理作业报告
-
配置目标存储桶策略(可选,用于确保对象所有权):
{ "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 库存(推荐用于大型数据集)
- 登录源账户(账户 A)AWS 控制台,进入 S3 服务
- 选择需要迁移的源存储桶
- 导航至 管理 → 库存配置
- 点击 创建库存配置
- 配置以下参数:
- 库存配置名称:
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)创建,不是在源账户。
等待清单报告生成后,在目标账户创建批处理作业来执行复制操作。
通过控制台创建:
-
登录目标账户(账户 B)AWS 控制台
-
在 S3 控制台中,选择 批处理操作 → 创建作业
-
选择清单报告:
- 对象列表: 使用现有清单文件
- 清单格式: CSV 或 Parquet
- 浏览并选择生成的清单报告文件(manifest.json)
- 清单路径示例:
s3://inventory-bucket-name/source-bucket-name/batch-copy-inventory/2024-12-17T00-00Z/manifest.json
-
选择操作类型:复制
-
配置目标:
- 目标桶:
arn:aws:s3:::destination-bucket-name(使用目标账户的存储桶)
- 目标桶:
-
额外选项:
- 存储类别: 选择目标存储类(可选)
- 访问控制:
- 推荐选择 bucket-owner-full-control
- 这确保复制后的对象归目标账户所有
- 加密方式: 选择加密方式(可选)
- 对象元数据: 复制(保留原始元数据)
-
完成报告:
- 选择报告存放的桶:
batch-results-bucket - 报告将记录成功和失败的对象
- 选择报告存放的桶:
-
配置完成设置(在目标账户 B 创建 IAM 角色):
a. 创建 IAM 策略:
- 在 IAM 控制台,选择 策略 → 创建策略
- 使用 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/*"}]}-
修改策略中的存储桶名称:
- 替换
source-bucket-name为源账户的实际存储桶名称 - 替换
destination-bucket-name为目标存储桶名称 - 替换
inventory-bucket-name为清单存储桶名称 - 替换
batch-results-bucket为报告存储桶名称
- 替换
-
策略名称:
S3-Batch-Operations-Policy
b. 创建 IAM 角色:
- 在 IAM 控制台,选择 角色 → 创建角色
- 可信实体类型:AWS 服务
- 使用案例:S3 → S3 Batch Operations
- 附加上面创建的策略:
S3-Batch-Operations-Policy - 角色名称:
S3-Batch-Role
关键配置说明:
- 此角色必须在目标账户(账户 B)创建
- 角色的信任关系会自动配置为信任
batchoperations.s3.amazonaws.com - 此角色需要读取源账户存储桶的权限(通过步骤 1 的存储桶策略授予)
- 清单路径必须使用通配符
*,不能指定具体的 manifest.json 路径
-
审核并创建作业
重要参数说明:
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
# 比较对象数量(需要分别在两个账户执行)# 在源账户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-
选择合适的清单频率
- 对于静态数据:使用 Weekly 清单
- 对于频繁变化的数据:使用 Daily 清单
-
批处理作业配置
- 设置合理的优先级(较低优先级可降低成本)
- 使用对象过滤减少不必要的复制
-
并行处理
- S3 批处理自动并行处理,无需额外配置
- 大型作业会自动分片处理
-
请求成本
- 每个复制操作产生 PUT 请求费用(目标)和 GET 请求费用(源)
- 批处理作业本身按对象数量收费($0.25/百万对象)
-
数据传输成本
- 跨账户同区域传输:免费
- 跨区域传输:按标准数据传输费率计费
-
存储成本
- 清单报告和批处理报告会产生额外存储成本
- 建议定期清理旧报告
-
最小权限原则
- IAM 角色仅授予必要的权限
- 使用资源级权限限制访问范围
-
加密
- 启用目标存储桶加密(SSE-S3、SSE-KMS)
- 如使用 KMS,需配置密钥策略允许跨账户访问
-
审计
- 启用 CloudTrail 记录 S3 批处理 API 调用
- 定期审查批处理作业报告
问题 1:批处理作业无法读取清单
错误:Reading the manifest is forbidden: null
解决方案:
- 确认批处理作业在目标账户(账户 B)创建,不是源账户
- 检查 IAM 角色策略中清单路径使用通配符:
arn:aws:s3:::inventory-bucket-name/* - 不要使用具体的 manifest.json 路径
- 验证 IAM 角色有权限读取清单存储桶
问题 2:批处理作业无法读取源存储桶对象
错误:Access Denied 或 403 Forbidden
解决方案:
- 检查源账户(账户 A)的存储桶策略是否允许目标账户的 IAM 角色访问
- 验证 IAM 角色 ARN 在源存储桶策略中配置正确
- 确认 IAM 角色策略包含读取源存储桶的权限
- 检查源存储桶是否启用了阻止公共访问,可能需要调整
问题 3:批处理作业无法写入目标存储桶
错误:Access Denied 写入失败
解决方案:
- 验证 IAM 角色策略包含
s3:PutObject和s3: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-Roleaws iam list-attached-role-policies --role-name S3-Batch-Role
# 测试源存储桶访问(使用 IAM 角色)aws s3 ls s3://source-bucket-name/ --profile target-accountS3 复制(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 批处理操作提供了可靠、可扩展的跨账户对象复制解决方案,特别适合以下场景:
- 大规模数据迁移(数百万至数十亿对象)
- 需要详细报告和审计追踪
- 一次性或定期批量复制需求
- 需要精确控制复制过程和对象所有权
跨账户配置关键要点
Section titled “跨账户配置关键要点”- 批处理作业位置:必须在目标账户(账户 B)创建,不是源账户
- 权限配置方向:
- 源账户存储桶策略:授权目标账户的 IAM 角色读取
- 目标账户 IAM 角色:拥有读取源桶和写入目标桶的权限
- 清单存储位置:清单文件存储在目标账户,但由源账户的 S3 服务生成
- 对象所有权:使用
bucket-owner-full-control确保对象归目标账户所有
通过正确配置存储桶策略、IAM 角色和批处理作业参数,可以安全高效地完成跨账户数据复制任务。