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=

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

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

-or-

次のコマンドを実行します:

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

関連情報

Amazon EMR で Spark ジョブまたは Hive ジョブが HTTP 503「Slow Down」AmazonS3Exception で失敗するのはなぜですか?

Amazon EMR アプリケーションが HTTP 404「Not Found」AmazonS3Exception で失敗するのはなぜですか?

エラーレスポンス

Amazon S3 からの 403 アクセス拒否エラーをトラブルシューティングするにはどうすればよいですか?

AWS公式
AWS公式更新しました 2年前
コメントはありません