我如何解决 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 发出请求的应用程序中构建重试逻辑。
相关内容
AWS 官方已更新 1 年前