我如何解决 Amazon S3 批量操作问题?

3 分钟阅读
0

我在为桶中的对象创建 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 官方
AWS 官方已更新 8 个月前