为什么我的 Amazon EMR 应用程序失败并显示 HTTP 403“访问被拒绝”AmazonS3Exception 错误?

3 分钟阅读
0

当我向 Amazon EMR 集群提交应用程序时,应用程序失败并显示 HTTP 403“访问被拒绝”AmazonS3Exception 错误。

解决方法

如果权限配置不正确,就可能会在 Amazon EMR 或 Amazon Simple Storage Service (Amazon S3) 上收到“访问拒绝”错误消息。

错误消息示例:

java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 8B28722038047BAA; S3 Extended Request ID: puwS77OKgMrvjd30/EY4CWlC/AuhOOSNsxfI8xQJXMd20c7sCq4ljjVKsX4AwS7iuo92C9m+GWY=), S3 Extended Request ID: puwS77OKgMrvjd30/EY4CWlC/AuhOOSNsxfI8xQJXMd20c7sCq4ljjVKsX4AwS7iuo92C9m+GWY=

检查应用程序代码中指定的凭证或 IAM 角色

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

在 Amazon EMR 集群的主节点上运行 ls 命令:

aws s3 ls s3://doc-example-bucket/abc/

**注意:**将 s3://doc-example-bucket/abc/ 替换为您的 Amazon S3 路径。

如果前面的命令成功,则凭证或 AWS Identity and Access Management (IAM) 角色会导致访问拒绝 错误。

要解决此问题,请完成以下步骤:

  1. 确认您的应用程序使用了预期的凭证或代入了预期的 IAM 角色。
  2. 要验证该角色是否具有访问 Amazon S3 路径的权限,请使用 AWS CLI 代入 IAM 角色。然后,向 S3 路径发出一个示例请求。

查看 Amazon EC2 实例配置文件角色的策略

如果 Amazon Elastic Compute Cloud (Amazon EC2) 实例配置文件没有所需的对 S3 存储桶的读取和写入权限,则可能会出现访问拒绝错误。

**注意:**默认情况下,应用程序会从 Amazon EC2 实例配置文件的 IAM 角色继承 Amazon S3 访问权限。验证附加到此角色的 IAM 策略是否允许对源存储桶和目标存储桶执行所需的 S3 操作。

要检查您是否具有所需的读取权限,请运行 ls 命令:

aws s3 ls s3://doc-example-bucket/myfolder/

输出示例:

An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

-或-

运行以下命令:

hdfs dfs -ls s3://doc-example-bucket/myfolder

输出示例:

ls: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: RBT41F8SVAZ9F90B; S3 Extended Request ID: ih/UlagUkUxe/ty7iq508hYVfRVqo+pB6/xEVr5WHuvcIlfQnFf33zGTAaoP2i7cAb1ZPIWQ6Cc=; Proxy: null), S3 Extended Request ID: ih/UlagUkUxe/ty7iq508hYVfRVqo+pB6/xEVr5WHuvcIlfQnFf33zGTAaoP2i7cAb1ZPIWQ6Cc=

确保实例配置文件角色具有所需的 S3 存储桶读取和写入权限。

IAM 策略示例:

{  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ListObjectsInBucket",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::doc-example-bucket"
      ]
    },
    {
      "Sid": "AllObjectActions",
      "Effect": "Allow",
      "Action": "s3:*Object*",
      "Resource": [
        "arn:aws:s3:::doc-example-bucket/*"
      ]
    }
  ]
}

检查 IAM 角色是否有 EMRFS 角色映射

如果您使用安全配置来为 Amazon EMR File System (EMRFS) 指定 IAM 角色,则使用角色映射。您的应用程序会根据角色映射配置继承 IAM 角色的 S3 权限。

附加到这些角色的 IAM 策略必须在源存储桶和目标存储桶上具有所需的 S3 权限。要为向 Amazon S3 发出的 EMRFS 请求指定 IAM 角色,请参阅使用 IAM 角色为 EMRFS 设置安全配置

检查 Amazon S3 VPC 端点策略

如果 EMR 集群的子网路由表具有指向 Amazon S3 虚拟私有云 (VPC) 端点的路由,则确认端点策略允许所需的 Amazon S3 操作。

使用 AWS CLI

运行 describe-vpc-endpoints AWS CLI 注释以检查端点策略:

aws ec2 describe-vpc-endpoints --vpc-endpoint-ids "vpce-########"

**注意:**将 vpce-######## 替换为您的 VPC ID

运行 modify-vpc-endpoint 命令来修改端点策略:

aws ec2 modify-vpc-endpoint --vpc-endpoint-id "vpce-########" --policy-document file://policy.json

**注意:**替换 --vpc-endpoint-idJSON 文件路径。

使用 Amazon VPC 控制台

完成以下步骤:

  1. 打开 Amazon VPC 控制台
  2. 在导航窗格中,选择 Endpoints(端点)。
  3. 选择 Amazon S3 端点(EMR 集群的子网路由表中的端点)。
  4. 选择 Policy(策略)选项卡。
  5. 选择 Edit Policy(编辑策略)。

检查 S3 存储桶和目标存储桶策略

存储桶策略指定允许或拒绝的主体操作。源和目标存储桶策略必须允许实例配置文件角色或映射的 IAM 角色执行所需的 Amazon S3 操作。

要修改存储桶策略,请使用 AWS CLI 或 Amazon S3 控制台。

使用 AWS CLI

运行 get-bucket-policy 命令来获取存储桶策略:

aws s3api get-bucket-policy --bucket doc-example-bucket

**注意:**将 doc-example-policy 替换为源存储桶或目标存储桶的名称。

修改策略,然后将策略保存到 JSON 文件中。

然后,运行 put-bucket-policy 命令将修改后的策略添加到存储桶:

aws s3api put-bucket-policy --bucket doc-example-bucket --policy file://policy.json

**注意:**替换存储桶名称和 JSON 文件路径。

使用 Amazon S3 控制台

有关说明,请参阅使用 Amazon S3 控制台添加存储桶策略

**重要事项:**如果您的应用程序访问另一个 AWS 账户的 S3 存储桶,则账户拥有者必须在存储桶策略中允许您的 IAM 角色。

例如,以下存储桶策略为 emr-account 中的所有 IAM 角色和用户提供了对 **s3://doc-example-bucket/myfolder/**的完全访问权限:

{
  "Id": "MyCustomPolicy",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowRootAndHomeListingOfCompanyBucket",
      "Principal": {
        "AWS": [
          "arn:aws:iam::emr-account:root"
        ]
      },
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::doc-example-bucket"
      ],
      "Condition": {
        "StringEquals": {
          "s3:prefix": [
            "",
            "myfolder/"
          ],
          "s3:delimiter": [
            "/"
          ]
        }
      }
    },
    {
      "Sid": "AllowListingOfUserFolder",
      "Principal": {
        "AWS": [
          "arn:aws:iam::emr-account:root"
        ]
      },
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::doc-example-bucket"
      ],
      "Condition": {
        "StringLike": {
          "s3:prefix": [
            "myfolder/*"
          ]
        }
      }
    },
    {
      "Sid": "AllowAllS3ActionsInUserFolder",
      "Principal": {
        "AWS": [
          "arn:aws:iam::emr-account:root"
        ]
      },
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": [
       "arn:aws:s3:::doc-example-bucket/myfolder/*",
        "arn:aws:s3:::doc-example-bucket/myfolder*"
      ]
    }
  ]
}

相关信息

为什么我在 Amazon EMR 上的 Spark 或 Hive 作业失败并显示 HTTP 503“运行缓慢”AmazonS3Exception 错误?

为什么我的 Amazon EMR 应用程序失败并显示 HTTP 404“未找到”AmazonS3Exception 错误?

错误响应

如何排除来自 Amazon S3 的 403 访问被拒绝错误?

AWS 官方
AWS 官方已更新 6 个月前