Amazon EMR アプリケーションが HTTP 403「アクセス拒否」AmazonS3Exception で失敗する理由を知りたいです。

所要時間3分
0

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

解決策

アクセス許可を正しく設定していないと、Amazon EMR または Amazon Simple Storage Service (Amazon S3) で "Access Denied" エラーが発生することがあります。

エラーメッセージの例:

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) ロールが Access Denied エラーの原因となっています。

この問題を解決するには、次のステップを実行してください。

  1. アプリケーションが想定される認証情報を使用しているか、想定される IAM ロールを引き受けていることを確認します。
  2. ロールに Amazon S3 パスへのアクセス許可があることを確認するために、AWS CLI を使用して IAM ロールを引き受けます。次に、S3 パスへのサンプルリクエストを実行します。

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

Amazon Elastic Compute Cloud (Amazon EC2) インスタンスプロファイルに S3 バケットに対する必要な読み取りアクセス許可と書き込みアクセス許可がない場合、Access Denied エラーが発生する場合があります。

注: デフォルトでは、アプリケーションは 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/*"
      ]
    }
  ]
}

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

セキュリティ設定を使用して Amazon EMR ファイルシステム (EMRFS) の IAM ロールを指定する場合、ロールマッピングを使用します。アプリケーションは、ロールマッピング設定に基づいて IAM ロールから S3 アクセス許可を継承します。

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

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-id および JSON ファイルパスを置き換えます。

**Amazon VPC コンソールを使用する **

次の手順を実行します。

  1. Amazon VPC コンソールを開きます。
  2. ナビゲーションペインで [エンドポイント] を選択します。
  3. EMR クラスターのサブネットルートテーブルにある Amazon S3 エンドポイントを選択します。
  4. [ポリシー] タブを選択します。
  5. [ポリシーの編集] を選択します。

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

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

バケットポリシーを変更するには、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「Slow Down」AmazonS3Exception で失敗する理由を知りたいです

Amazon EMR アプリケーションが HTTP 404「Not Found」AmazonS3Exception で失敗する理由を知りたいです

エラー応答

Amazon S3 からの 403 アクセス拒否エラーをトラブルシューティングする方法を教えてください

AWS公式
AWS公式更新しました 4ヶ月前
コメントはありません