跳至内容

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

3 分钟阅读
0

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