Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
我如何解决 Amazon S3 批量操作问题?
我在为存储桶中的对象创建 Amazon Simple Storage Service (Amazon S3) 批量操作作业时,Amazon S3 返回错误。或者,Amazon S3 批量操作作业失败。
解决方法
要跟踪作业失败,请索取任务详细信息或完成报告。确定原因并解决问题后,重新提交 S3 批量操作作业。
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
清单 .csv 或 .json 文件格式不正确
S3 批量操作支持 .csv 和 .json 库存清单文件。如果您未正确格式化清单文件,则必须在 Amazon S3 中创建新的批处理作业并指定正确的格式。
在指定清单时,请执行以下操作:
- 对于 Amazon S3 清单报告,使用 .csv 格式的报告,并指定与清单报告关联的 manifest.json 文件。
- 对于 .csv 文件,在清单文件的每一行中包括存储桶名称和对象键。您也可以包括对象版本。如果您在清单中包含版本 ID,则必须为所有对象指定 ID。
**注意:**必须对对象键进行 URL 编码。 - 如果对象位于受版本控制的存储桶中,您必须指定这些对象的版本 ID。否则,批处理作业将失败。或者,Amazon S3 可能会将批处理作业应用于错误的对象版本。
清单文件指定多个存储桶名称或包含多个标头行
如果清单文件列出的所有对象不存在于同一个存储桶中,则您会收到以下错误消息:
“失败原因: Cannot have more than 1 bucket per Job.JOB_ID”
确保您的清单文件仅指定一个存储桶名称且不包含标题行。
包含多个标题行的清单文件示例:
bucket,keymy-batch-bucket,object001.txt my-batch-bucket,object002.txt my-batch-bucket,object003.txt my-batch-bucket,object004.txt
IAM 角色没有权限读取清单文件
如果 AWS Identity and Access Management (IAM) 角色不具有读取清单的权限,则您会收到以下错误之一:
AWS CLI 中的“失败原因:读取清单被禁止: AccessDenied”。
-或-
Amazon S3 控制台中的“警告: 无法获取清单对象的 ETag。请指定其他对象以继续”。
创建 S3 批量操作作业的 IAM 角色必须具有清单文件的 GetObject 读取权限。检查对象的元数据是否存在与 S3 对象所有权不匹配的访问权限。此外,检查是否使用了任何不受支持的 AWS Key Management Service (AWS KMS) 密钥来加密清单文件。
**注意:**S3 批量操作支持 AWS KMS 加密的 .csv 清单报告。S3 批量操作不支持 AWS KMS 加密的 .csv 清单文件。有关详细信息,请参阅使用 Amazon S3 控制台配置清单。
批处理作业位于不同的区域
S3 批量操作复制作业必须与目标存储桶位于同一 AWS 区域。例如,如果目标存储桶位于 us-west-2 区域,则选择 us-west-2 作为批处理作业的区域。
S3 清单报告缺少目标存储桶
S3 批量操作生成的清单必须有目标桶。Amazon S3 存储桶策略还必须允许 s3:PutObject 操作。如果作业将报告发送到另一个 AWS 账户,应确认目标存储桶允许 IAM 角色执行 s3:PutObject 操作。
缺少 IAM 角色的信任策略
IAM 角色的信任策略定义了其他主体担任该角色的必要条件。要允许 S3 批量操作主体担任 IAM 角色,请向该角色附加信任策略。
策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "batchoperations.s3.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
**注意:**请确保指定 IAM 角色,而不是 IAM 用户。
IAM 角色缺少创建批处理作业的权限
要创建 S3 批量操作作业,请向 IAM 角色授予 s3:CreateJob 权限。创建作业的实体还必须具有 iam:PassRole 权限才能传递您为批处理作业指定的 IAM 角色。有关详细信息,请参阅 IAM JSON 策略元素: Resource。
IAM 角色缺少执行批处理作业操作的权限
确保向 IAM 角色授予在批处理作业中执行特定操作的正确权限。
具有复制操作所需权限的 IAM 策略示例:
{ "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}}/*" ] } ] }
AWS Organizations SCP 拒绝访问
如果您使用 Organizations,请确认服务控制策略 (SCP) 中没有拒绝访问 Amazon S3 的 Deny 语句。否则,创建批处理作业时可能会出现 Access Denied 错误。
明确拒绝所有 S3 操作的 SCP 示例:
{ "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
如果 S3 批量操作作业在清单中找到版本 ID 字段为空的对象,则您会收到以下错误:
“Error: BUCKET_NAME,prefix/file_name,failed,400,InvalidRequest,Task failed due to missing VersionId"
如果清单格式在操作期间使用了版本 ID,版本 ID 字段不能是空字符串。而必须是 null 字符串。要解决此问题,请将空版本 ID 转换为 null 字符串。
**注意:**S3 批量操作仅对指定对象失败,不是整个作业失败。
Amazon S3 无法提供作业报告,因为您使用了对象锁定保留
如果在管理模式或合规模式下为目标存储桶配置 S3 对象锁定保留,您可能会收到以下错误:
“Error: Reasons for failure.无法将作业报告写入存储桶。请检查您的权限。”
Amazon S3 不支持对具有保留模式配置的目标存储桶配置对象锁定。配置保留模式后,存储桶受到一次写入多次读取 (WORM) 保护。要解决此问题,请选择没有对象锁定保留的目标存储桶。
**注意:**只有完成报告失败,作业不失败。作业会成功完成,所有对象都会进行处理。
ETag 版本不一致
如果 Amazon S3 控制台或 AWS CLI 上的 ETag 值与存储桶中的 ETag 不匹配,则您会收到以下错误:
“Error reading the manifest.Caused by: ETag mismatch.Expected ETag: 69f52a4e9f797e987155d9c8f5880897”
在 S3 批量操作作业中选择清单时,您可以指定清单对象键、ETag 和可选版本 ID。确保 ETag 值与 S3 存储桶中清单对象最新版本的 ETag 相匹配。在 Amazon S3 控制台的 Batch Operations(批量操作)选项卡中,检查清单文件属性中的 Manifest object ETag(清单对象 ETag)。在 AWS CLI 中,检查清单规范传递的 ETag 的值。
**注意:**如果您将 S3 批量操作作业创建为现有作业的克隆,则在克隆清单中更新 ETag。
HTTP 500 和 503 错误
如果 Amazon S3 无法处理请求,则您会收到 500 Internal Error 状态代码。如果对您的 S3 存储桶的请求数量很高,则您将收到 503 Slow Down 状态代码。要解决这些问题,请参阅如何对来自 Amazon S3 的 HTTP 500 或 503 错误进行故障排除?
**注意:**最佳做法是在向 Amazon S3 发出请求的应用程序中构建重试逻辑。
