Amazon EMR アプリケーションが HTTP 403「アクセス拒否」AmazonS3Exception で失敗するのはなぜですか?

最終更新日: 2022 年 5 月 3 日

アプリケーションを Amazon EMR クラスターに送信すると、アプリケーションは HTTP 403「アクセス拒否」AmazonS3Exception で失敗します。

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=

解決方法

権限が正しく設定されていない場合、Amazon EMR または Amazon Simple Storage Service (Amazon S3) で「アクセスが拒否されました」というエラーが表示されることがあります。

まず、アプリケーションコードで指定された認証情報またはロールを確認します

EMR クラスターのマスターノードで次のコマンドを実行します。s3://doc-example-bucket/abc/ を Amazon S3 パスに置き換えます。

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

このコマンドが成功すると、アプリケーションコードで指定された認証情報またはロールが「アクセス拒否」エラーを引き起こしていることになります。アプリケーションが予想される認証情報を使用している、または想定されるロールを引き受けていること、および Amazon S3 パスにアクセスできることを確認します。AWS CLI を使用して、AWS Identity and Access Management (IAM) ロールを仮定することにより、ロールに Amazon S3 パスへのアクセス権限があることを確認します。次に、S3 パスへのサンプルリクエストを実行します。

このコマンドが失敗した場合は、AWS Command Line Interface (AWS CLI) の最新バージョンを使用していることを確認してください。次に、アクセス拒否エラーを解決するには、以下のことを確認します。

    Amazon EC2 インスタンスプロファイルロールのポリシーを確認する

    Amazon Elastic Compute Cloud (Amazon EC2) インスタンスプロファイルに、S3 バケットに対する必要な読み取りおよび書き込み権限がない場合、「アクセスが拒否されました」というエラーが表示されることがあります。

    注:デフォルトでは、アプリケーションは Amazon EC2 インスタンスプロファイルの IAM ロールから Amazon S3 アクセスを継承します。このロールにアタッチされた IAM ポリシーが、ソースバケットと宛先バケットで必要な S3 オペレーションを許可するようにしてください。

    この問題をトラブルシューティングするには、次のコマンドを実行して、必要な読み取り許可があるかどうかを確認します。

    $ 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 ポリシーの S3 アクションは、S3 バケット doc-example-bucket に対する必要な読み取りおよび書き込みアクセスを提供します。

    {
      "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/*"
          ]
        }
      ]
    }

    EMRFS ロールマッピングの IAM ロールを確認する

    セキュリティ設定を使用して EMRFS の IAM ロールを指定する場合は、ロールマッピングを使用します。アプリケーションは、ロールマッピング設定に基づいて IAM ロールから S3 権限を継承します。

    これらのロールにアタッチされた IAM ポリシーには、ソースバケットと宛先バケットで必要な S3 許可が必要です。Amazon S3 への EMRFS リクエストの IAM ロールを指定するには、「EMRFS の IAM ロールを使用したセキュリティ設定のセットアップ」を参照してください。

    Amazon S3 VPC エンドポイントポリシーを確認する

    EMR クラスターのサブネットルートテーブルに Amazon S3 VPC エンドポイントへのルートがある場合は、エンドポイントポリシーで必要な Amazon S3 オペレーションが許可されていることを確認します。

    CLI を使用してエンドポイントポリシーを確認および変更するには:

    次のコマンドを実行して、エンドポイントポリシーを確認します。vpce-xxxxxxxx をご自身の VPC ID に置き換えます。

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

    必要に応じて、次のコマンドを実行して、変更されたエンドポイントポリシーをアップロードします。VPC ID と JSON ファイルパスを置き換えます。

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

    Amazon VPC コンソールを使用してエンドポイントポリシーを確認および変更するには:

    1. Amazon VPC コンソールを開きます。
    2. ナビゲーションペインから [エンドポイント] を選択します。
    3. Amazon S3 エンドポイント (EMR クラスターのサブネットルートテーブルにあるエンドポイント) を選択します。次に、[ポリシー] タブを選択して、エンドポイントポリシーを確認します。
    4. 必要な Amazon S3 アクションを追加するには、[ポリシーの編集] を選択します。

    S3 のレプリケート元およびレプリケート先バケットポリシーを確認します

    バケットポリシーはプリンシパルのために許可または拒否されるアクションを指定します。ソースと宛先バケットのバケットポリシーでは、必要な Amazon S3 オペレーションの実行を EC2 インスタンスプロファイルのロールまたはマッピングされた IAM ロールに許可する必要があります。

    CLI を使用してバケットポリシーを確認および変更するには:

    次のコマンドを実行して、バケットポリシーを確認します。doc-example-bucket をレプリケート元バケットまたはレプリケート先バケットの名前に置き換えます。

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

    必要に応じて、次のコマンドを実行して、変更されたバケットポリシーをアップロードします。バケット名と JSON ファイルパスを置き換えます。

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

    Amazon S3 コンソールを使用してバケットポリシーを確認および変更するには:

    1. Amazon S3 コンソールを開きます。
    2. バケットを選択します。
    3. [アクセス権限] タブを選択します。
    4. [バケットポリシー] を選択して、バケットポリシーを確認して変更します。

    別のアカウントの 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*"
          ]
        }
      ]
    }