Share Your AWS re:Post Experience - Quick 3 Question Survey
Help us improve AWS re:Post! We're interested in understanding how you use re:Post and its impact on your AWS journey. Please take a moment to complete our brief 3-question survey.
我如何解决 Amazon S3 批量操作问题?
我在为桶中的对象创建 Amazon Simple Storage Service (Amazon S3) 批量操作作业时,Amazon S3 返回错误。或者,批处理作业失败。
简述
如果 Amazon S3 批量操作作业遇到问题,导致其无法成功运行,作业将会失败。失败的作业会生成一个或多个失败代码和原因。要查看 Amazon S3 批量操作的失败代码和原因,请求作业的详细信息。您也可以在作业的完成报告中查看失败代码和原因。
为了防止作业运行大量失败的操作,Amazon S3 为每个批量操作作业设置了任务失败阈值。Amazon S3 会在运行至少 1,000 个任务后监控任务失败率。如果作业的失败率超过 50%,该作业将失败。要解决此失败问题,检查失败的原因并进行更正。然后,重新提交作业。
解决方法
清单文件格式不正确 (.csv 或 JSON)
Amazon S3 批量操作支持 .csv 和 JSON(Amazon S3 清单报告)清单文件。如果清单文件不正确,您必须在 Amazon S3 中创建新的批处理作业并指定正确的格式。
-
对于 Amazon S3 清单报告,使用 CSV 格式的报告,并指定与清单报告关联的 manifest.json 文件。
-
对于 .csv 文件,在清单文件的每一行中包括桶名称和对象键。(可选)包括对象版本。如果您在清单中包含版本 ID,则必须为所有对象指定 ID。否则,不要包含任何版本 ID。对象键必须采用 URL 编码。
注意: 如果清单中的对象位于受版本控制的桶中,您必须指定这些对象的版本 ID。否则,批处理作业将失败。或者,Amazon S3 可能会将批处理作业应用于错误的对象版本。
有关详细信息,请参阅指定清单。
清单文件指定多个桶名称或包含多个标头行
使用 S3 批量操作时,清单文件列出的所有对象均必须位于同一个桶中。否则,您会收到以下错误:
"Reasons for failure: Cannot have more than 1 bucket per Job.JOB_ID"
对于 S3 批量操作作业,确保您的清单文件仅指定一个桶名称,且不包含任何标头行。在以下示例中,Amazon S3 返回错误,因为清单文件包含多个标头行。
bucket,key my-batch-bucket,object001.txt my-batch-bucket,object002.txt my-batch-bucket,object003.txt my-batch-bucket,object004.txt
IAM 角色缺少读取清单文件的权限
创建 S3 批量操作作业的 AWS Identity and Access Management (IAM) 角色必须具有清单文件的 GetObject 读取权限。检查对象的元数据是否有与 S3 对象所有权不匹配的访问权限。此外,查找是否使用了任何不受支持的 AWS Key Management Service (AWS KMS) 密钥来加密清单文件。
如果 IAM 角色没有正确的权限,您在创建 S3 批量操作作业时会收到以下错误:
AWS CLI 错误示例
"Reason for failure Reading the manifest is forbidden: AccessDenied"
注意: 如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅排查 AWS CLI 错误。此外,请确保您使用的是最新的 AWS CLI 版本。
Amazon S3 控制台错误示例
"Warning: Unable to get the manifest object's ETag.Specify a different object to continue"
注意: S3 批量操作支持 AWS KMS 加密的 CSV 清单报告。S3 批量操作不支持 AWS KMS 加密的 .csv 清单文件。有关详细信息,请参阅使用 S3 控制台配置清单。
批处理作业位于不同的区域
S3 批量操作复制作业必须与对象将复制到的目标桶位于同一个 AWS 区域。创建批处理作业时,选择与目标桶相同的区域。例如,如果目标桶位于 us-west-2 区域,则选择 us-west-2 作为批处理作业的区域。
S3 清单报告缺少目标桶
S3 批量操作生成的清单必须有目标桶。Amazon S3 存储桶策略还必须允许 s3:PutObject 操作。如果报告被发送到另一个 AWS 账户,应确认目标桶允许 IAM 角色执行 s3:PutObject 操作。
缺少 IAM 角色的信任策略
注意: 请确保指定 IAM 角色,而不是 IAM 用户。
IAM 角色的信任策略定义其他主体担任该角色必须满足的条件。要允许 S3 批量操作服务主体担任 IAM 角色,向该角色附加信任策略。
此信任策略示例授予对 Amazon S3 的访问权限。其可降低与权限升级相关的任何风险:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "batchoperations.s3.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
缺少创建批处理作业的 IAM 权限
在创建和运行 S3 批量操作作业之前,向 IAM 角色授予所需权限。如果您的 IAM 角色缺少执行 S3 批量操作作业所需的权限,批处理作业将失败。
要创建 S3 批量操作作业,向 IAM 角色授予 s3:CreateJob 权限。创建作业的同一个实体还必须具有 iam:PassRole 权限。这允许实体传递您为批处理作业指定的 IAM 角色。有关详细信息,请参阅 IAM JSON 策略元素: Resource。
缺少对源桶、S3 清单报告或目标桶的访问权限
确保您用于 S3 批量操作的 IAM 角色具有执行批处理作业所需的权限。
以下是复制操作的 IAM policy 示例:
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:PutObject", "s3:PutObjectAcl", "s3:PutObjectTagging" ], "Effect": "Allow", "Resource": "arn:aws:s3:::{{DestinationBucket}}/*" }, { "Action": [ "s3:GetObject", "s3:GetObjectAcl", "s3:GetObjectTagging", "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::{{SourceBucket}}", "arn:aws:s3:::{{SourceBucket}}/*" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Resource": [ "arn:aws:s3:::{{ManifestBucket}}/*" ] }, { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": [ "arn:aws:s3:::{{ReportBucket}}/*" ] } ] }
有关详细信息,请参阅授予 Amazon S3 批量操作权限。
Organizations SCP 具有限制
如果您使用 AWS Organizations,请确认没有任何拒绝访问 Amazon S3 的拒绝声明。例如,您的服务控制策略 (SCP) 明确拒绝所有 S3 操作。在这种情况下,创建批处理作业时可能会出现Access Denied错误。
以下示例策略明确拒绝所有 S3 操作:
{ "Version": "2012-10-17", "Statement": [ { "Principal": "*", "Effect": "Deny", "Action": "s3:*", "Resource": "*" } ] }
要应用限制性策略,将 S3 批量操作用于执行操作的 IAM 角色添加到允许列表中。以下示例为策略添加例外:
{ "Version": "2012-10-17", "Statement": \[ { "Principal": "\*", "Effect": "Deny", "Action": "s3:\*", "Resource": "\*", "Condition": { "StringNotLike": { "aws:userId": \[ "AROAEXAMPLEID:\*", "AIDAEXAMPLEID", "111111111111" \] } } } \] }
清单中缺少对象的版本 ID
如果批量操作作业在清单中遇到版本 ID 字段为空的对象,您会收到以下错误:
"Error: BUCKET_NAME,prefix/file_name,failed,400,InvalidRequest,Task failed due to missing VersionId"
如果清单格式在操作期间使用了版本 ID,版本 ID 字段不能是空字符串。而必须是“null”字符串。未受版本控制的作业不会遇到此错误。它们会对每个对象的最新版本执行操作,而不是仅针对在清单中找到的版本 ID。要修复此错误,将空版本 ID 转换为 null 字符串。
注意: 只有该特定对象的批量操作会失败,整个作业不会失败。
作业报告在开启 Amazon S3 对象锁定保留模式时未送达
在管理模式或合规模式下为目标桶配置对象锁定保留模式时,您可能会收到以下错误:
"Error: Reasons for failure.The job report could not be written to your bucket.Please check your permissions."
Amazon S3 不支持对具有保留模式配置的目标桶配置对象锁定。配置保留模式后,桶受到单写多读 (WORM) 保护。要修复此错误,为作业完成报告选择一个未配置对象锁定保留模式的目标桶。
注意: 失败的是完成报告,而不是作业。作业会成功完成,所有对象都会进行处理。
ETag 版本不一致
在批量操作作业中指定清单时,您可以指定清单对象键、ETag 和可选的版本 ID。在指定清单文件时,检查 ETag 的值是否与 S3 存储桶中清单对象最新版本的 ETag 一致。在 Amazon S3 控制台的批量操作选项卡中,检查清单文件属性中的清单对象 ETag。在 AWS CLI 中,检查清单规范传递的 Etag 的值。
如果控制台或 AWS CLI 中填充的 ETag 与 S3 存储桶中的 Etag 不一致,将出现以下错误:
"Error reading the manifest.Caused by: ETag mismatch.Expected ETag: 69f52a4e9f797e987155d9c8f5880897"
注意此错误中的Expected ETag,确保您的 ETag 的两个版本是一致的。有关详细信息,请参阅指定清单。

相关内容
- AWS 官方已更新 4 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前