AWS Glue ジョブが 403 アクセス拒否エラーを返すのはなぜですか?

所要時間3分
0

AWS Glue ジョブが Amazon Simple Storage Service (Amazon S3) バケットへの読み取り/書き込みを試みると 403 アクセス拒否エラーが返されます。

簡単な説明

通常、「Access Denied」(アクセス拒否) エラーは次の理由で発生します。

  • AWS Identity and Access Management (IAM) ロールにバケットへのアクセスに必要なアクセス許可がない。
  • Amazon S3 バケットポリシーで IAM ロールに必要なアクセス権限が許可されていない。
  • オブジェクトの所有者が Amazon S3 バケット所有者と異なる。
  • Amazon Virtual Private Cloud (Amazon VPC) エンドポイントポリシーに S3 バケットへのアクセスに必要なアクセス許可が含まれていない。
  • オブジェクトが AWS Key Management Service (AWS KMS) によって暗号化されていて、キーを使用するための IAM ロールに最低限必要なアクセス許可が AWS KMS ポリシーで付与されていない。
  • S3 バケットでリクエスタ支払いがオンになっている。
  • S3 バケットへのアクセスが AWS Organizations サービスコントロールポリシーによって制限されている。

注: 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 ユーザーまたはロールの [アクセス権限] タブで各ポリシーを展開し、その JSON ポリシードキュメントを表示します。

4.    JSON ポリシードキュメントで、バケット名を持つポリシーを探します。次に、そのポリシーがバケットに対する正しい S3 アクションを許可することを確認します。

5.    IAM ロールがバケットへの必要なアクセス権を付与しない場合は、正しい許可を付与するポリシーを追加します。例えば、次の IAM ポリシーは、オブジェクト (s3:PutObject) を S3 バケット DOC-EXAMPLE-BUCKET に配置するためのアクセス権を IAM ロールに付与します。

{
  "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.    バケットのリストから、確認するバケットを開きます。

4.    [Permissions] (許可) を選択し、[Bucket policy] (バケットポリシー) セクションまで下方向にスクロールします。

5.    バケットポリシーで、バケットへのロールのアクセスを拒否するステートメントがないかを確認します。

6.    バケットポリシーを変更して、IAM ロールのバケットへのアクセスを拒否するステートメントを編集または削除します。

バケットポリシーのサンプルについては、「バケットポリシーの例」を参照してください。

S3 バケット所有者がオブジェクトにアクセスできることを確認する

デフォルトでは、S3 オブジェクトの所有者はそれをアップロードした AWS アカウントになります。これは、バケットが他のアカウントによって所有されている場合にも当てはまります。他のアカウントが自分のバケットにオブジェクトをアップロードできる場合は、自分のユーザー/ロールがアクセスできないオブジェクトを所有するアカウントを確認します。オブジェクト所有者を確認するには、GetObjectAcl コマンドを実行します。

他のアカウントの IAM ユーザー/ロールが S3 バケットにオブジェクトをアップロードする場合は、S3 オブジェクトの所有権を設定します。その後、bucket-owner-full-control アクセスコントロールリスト (ACL) を使用してオブジェクトをアップロードするバケットポリシーを追加します。バケットポリシーを追加することにより、bucket-owner-full-control ACL を使用してオブジェクトがアップロードされると、オブジェクトの所有者がバケット所有者に自動的に変更されます。詳細については、「他の AWS アカウントが私の Amazon S3 バケットにオブジェクトをアップロードするときに、それらのアカウントがオブジェクトの完全なコントロールを私に付与することを義務付けるにはどうすればよいですか?」を参照してください。

Amazon VPC エンドポイントポリシーで S3 バケットに必要なアクションが許可されていることを確認します。

次の条件が両方とも該当する場合は、VPC エンドポイントポリシーに S3 バケットとオブジェクトにアクセスするために必要なアクセス権限が含まれていることを確認してください。

  • AWS Glue ジョブは S3 に対するオブジェクトの読み取りまたは書き込みを行います。
  • 接続は VPC エンドポイントを使用して 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 に対する読み取りまたは書き込みを行う場合は、次の点を確認してください。

  • AWS KMS アクションに必要なアクセス権限が IAM ロールのポリシーに含まれている。
  • IAM ロールに必要なアクセス権限が AWS KMS キーのポリシーに含まれている。

IAM ロールのポリシーに次のアクセス権限を含めて、必要な AWS KMS アクションを許可します。

{
  "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"
  }
}

ポリシー内の ARN を実際の ARN に置き換えてください。

詳細については、「AWS Glue での暗号化のセットアップ」をご参照ください。

KMS キーポリシーを確認し、AWS Glue ジョブがロールにアクセスすることが許可されているかどうかを確認します。キーポリシーの詳細については、「AWS KMS でのキーポリシーの使用」を参照してください。

バケットでリクエスタ支払いがオンになっている場合は、リクエスタ支払いヘッダーを含めてください。

S3 バケットでリクエスタ支払いがオンになっている場合、AWS Glue ジョブからバケットへのすべてのリクエストにリクエスタ支払いヘッダーを含める必要があります。デフォルトでは、Amazon S3 への AWS Glue リクエストにリクエスタ支払いヘッダーは含まれていません。このヘッダーがない場合、リクエスタ支払いバケットへの API コールはアクセス拒否例外で失敗します。ETL スクリプトにリクエスタ支払いヘッダーを追加するには、hadoopConfiguration().set() を使用して、GlueContext 変数または Apache Spark セッション変数に fs.s3.useRequesterPaysHeader を含めます。

詳細については、「AWS Glue、Amazon EMR、または Amazon Athena から Amazon S3 リクエスタ支払いバケットにアクセスするにはどうすればよいですか?」を参照してください。

AWS Organizations のサービスコントロールポリシーで S3 へのアクセスが許可されていることを確認してください。

AWS Organizations を使用している場合は、サービスコントロールポリシーで Amazon S3 へのアクセスが許可されていることを確認します。例えば、次のポリシーは、Amazon S3 へのアクセスを明示的に拒否して、アクセス拒否エラーを表示します。

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

詳細については、「組織内のすべての機能の有効化」をご参照ください。


関連情報

Amazon S3 からの 403 Access Denied エラーをトラブルシューティングするにはどうすればよいですか?

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

関連するコンテンツ