跳至内容

为什么我的 AWS Glue 作业会返回“403 Access Denied”错误?

3 分钟阅读
0

当我的 AWS Glue 作业尝试读取或写入 Amazon Simple Storage Service (Amazon S3) 存储桶时,该作业返回“403 Access Denied”错误。

简短描述

以下示例是您可能收到“Access Denied”错误的常见原因:

  • AWS Identity and Access Management (IAM) 角色没有访问存储桶所需的权限。
  • Amazon S3 存储桶策略不允许为 IAM 角色提供所需的权限。
  • S3 存储桶所有者与对象所有者不同。
  • Amazon Virtual Private Cloud (Amazon VPC) 端点策略不包含访问 S3 存储桶所需的权限。
  • 对象由 AWS Key Management Service (AWS KMS) 加密。AWS KMS 策略未向 IAM 角色授予使用密钥所需的最低权限。
  • S3 存储桶启用了 Requester Pays(申请方付款)选项。
  • AWS Organizations 服务控制策略限制对 S3 存储桶的访问。

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

更新 IAM 角色权限以访问 S3 存储桶

运行 AWS Glue 作业的 IAM 角色需要访问 S3 存储桶。要向 IAM 角色授予所需的权限,请将 IAM 策略附加到 IAM 角色。另一种最佳做法是将 AWSGlueServiceRole 托管式策略附加到 IAM 角色,以确认提供基本的 AWS Glue 作业权限。此外,请创建并附加客户管理型策略,以授予在写入时放置 S3 对象的权限。

要更新 IAM 角色的权限以访问存储桶,请完成以下步骤:

  1. 打开 IAM 控制台
  2. 打开与 AWS Glue 作业关联且需要访问存储桶的 IAM 角色。
  3. 在 IAM 用户/角色的 Permissions(权限)选项卡中,展开每个策略以查看其 JSON 策略文档。
  4. 在 JSON 策略文档中,查找包含存储桶名称的策略。然后,确认这些策略允许对存储桶执行正确的 S3 操作。如果 IAM 角色未被授予访问存储桶所需的权限,请添加策略以授予正确的权限。例如,以下 IAM 策略可授予 IAM 角色将对象 (s3:PutObject) 放入 S3 存储桶 DOC-EXAMPLE-BUCKET 的访问权限:
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "ExampleStmt",
          "Action": "s3:PutObject",
          "Effect": "Allow",
          "Resource": [
            "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
          ]
        }
      ]
    }

**注意:**请将策略中的 DOC-EXAMPLE-BUCKET 替换为您的 S3 存储桶的名称。

更新存储桶策略以向 IAM 角色授予所需的权限

查看存储桶策略中是否有以下配置:

  • 任何显式拒绝 IAM 角色访问存储桶的语句
  • 任何可能限制 IAM 角色访问权限的权限和条件

要查看并修改存储桶策略以向 IAM 角色授予所需的访问权限,请完成以下步骤:

  1. 打开 Amazon S3 控制台
  2. 在导航窗格中,选择 Buckets(存储桶)。
  3. 选择 S3 存储桶。
  4. Permissions(权限)页面的 Bucket policy(存储桶策略)下,查看存储桶策略中是否包含任何拒绝该角色访问存储桶的语句。
  5. 修改存储桶策略,以编辑或删除任何拒绝 IAM 角色访问存储桶的语句。

有关存储桶策略示例,请参阅 Amazon S3 存储桶策略的示例

更新对象的所有者

默认情况下,上传对象的 AWS 账户拥有该 S3 对象。即使存储桶归不同账户所有,此设置仍然适用。如果其他账户可以将对象上传到您的存储桶,请检查您的 IAM 身份无法访问的对象归哪个账户所有。要检查对象归哪个账户所有,请运行 GetObjectAcl 命令。

如果其他账户的 IAM 身份向您的 S3 存储桶上传对象,请配置 S3 对象所有权。然后,添加一个存储桶策略,要求上传对象时包含 bucket-owner-full-control 访问控制列表 (ACL)。添加存储桶策略后,如果在上传对象时包含 bucket-owner-full-control ACL,该策略会自动将对象的所有者更改为存储桶所有者。有关详细信息,请参阅当其他 AWS 账户将对象上传到我的 Amazon S3 存储桶时,我怎样才能要求他们授予我对对象的完全控制权?

更新 Amazon VPC 端点策略

当同时满足以下两个条件时,更新 VPC 端点策略,以包含访问 S3 存储桶和对象所需的权限:

  • AWS Glue 作业正在读取对象或向 Amazon S3 写入对象。
  • 该连接使用 VPC 端点路由到 Amazon S3。

例如,以下 VPC 端点策略仅允许访问存储桶 DOC-EXAMPLE-BUCKET。如果您的存储桶未在策略中列为允许的资源,则用户或角色无法使用 VPC 端点访问该存储桶:

{
  "Statement": [
    {
      "Sid": "Access-to-specific-bucket-only",
      "Principal": "*",
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
    }
  ]
}

**注意:**请将策略中的 DOC-EXAMPLE-BUCKET 替换为您的 S3 存储桶的名称。

如果用户或角色在上传对象时包含 ACL,则您必须更新 VPC 端点策略以授予对 PutObjectAcl 操作的访问权限。例如:

{
  "Statement": [
    {
      "Sid": "Access-to-specific-bucket-only",
      "Principal": "*",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
    }
  ]
}

更新 AWS KMS 密钥策略以允许访问 IAM 角色

如果您的提取、转换、加载 (ETL) 作业读取或向 Amazon S3 写入加密数据,则该作业必须具有以下配置:

  • IAM 角色的策略包含 AWS KMS 操作所需的权限。
  • AWS KMS 密钥的策略包含 IAM 角色所需的权限。

要允许必要的 AWS KMS 操作,请在 IAM 角色的策略中包含以下权限:

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:Decrypt",
      "kms:Encrypt",
      "kms:GenerateDataKey"
    ],
    "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
  }
}

**注意:**请将策略中的 Amazon 资源名称 (ARN) 替换为您选择的 ARN。

有关详细信息,请参阅在 AWS Glue 中设置加密

查看 KMS 密钥策略,以验证该策略是否允许访问 AWS Glue 作业的角色。有关密钥策略的详细信息,请参阅 AWS KMS 中的密钥策略

查看 S3 存储桶中的“申请方付款”选项

如果 S3 存储桶启用了 Requester Pays(申请方付款)选项,则从 AWS Glue 作业对该存储桶的所有请求都必须包含 Requester Pays(申请方付款)标头。默认情况下,发送给 Amazon S3 的 AWS Glue 请求不包含 Requester Pays(申请方付款)标头。如果没有此标头,对申请方付款存储桶的 API 调用将失败,并显示“Access Denied”异常。要将 Requester Pays(申请方付款)标头添加到 ETL 脚本中,请使用 hadoopConfiguration().set() 在 GlueContext 变量或 Apache Spark 会话变量中添加 fs.s3.useRequesterPaysHeader。有关详细信息,请参阅如何从 AWS Glue、Amazon EMR 或 Amazon Athena 中访问 Amazon S3 申请方付款存储桶?

查看 AWS Organizations 服务控制策略

如果您使用 AWS Organizations,请查看服务控制策略以确保该策略允许访问 Amazon S3。例如,以下策略会显式拒绝对 Amazon S3 的访问并导致“Access Denied”错误:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "s3:*",
      "Resource": "*"
    }
  ]
}

有关详细信息,请参阅使用 AWS Organizations 为组织启用所有功能

相关信息

如何解决来自 Amazon S3 的 403“访问被拒绝”错误?

AWS 官方已更新 8 个月前