スキップしてコンテンツを表示

AWS Glue ジョブが「403 Access Denied」エラーを返す理由を知りたいです。

所要時間3分
0

AWS Glue ジョブが Amazon Simple Storage Service (Amazon S3) バケットへの読み取りまたは書き込みを試みると、「403 Access Denied」エラーが返されます。

簡単な説明

「Access Denied」エラー発生する一般的な原因の例を次に示します。

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

解決策

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「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 アクションが許可されていることを確認します。IAM ロールでバケットへの必要なアクセス許可が付与されていない場合は、適切なアクセス許可を付与するポリシーを追加します。たとえば次の IAM ポリシーは、S3 バケット DOC-EXAMPLE-BUCKET にオブジェクトを配置 (s3:PutObject) するためのアクセス許可を 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. ナビゲーションペインで [バケット] を選択します。
  3. 該当する S3 バケットを選択します。
  4. [アクセス許可] ページの [バケットポリシー] でバケットポリシーを参照し、ロールによるバケットへのアクセスを拒否するステートメントがないか確認します。
  5. バケットポリシーを変更し、IAM ロールによるバケットへのアクセスを拒否するステートメントをすべて編集するか削除します。

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

オブジェクトの所有者を更新する

デフォルトでは、オブジェクトをアップロードする AWS アカウントが S3 オブジェクトの所有者となります。この設定は、別のアカウントがバケットを所有している場合にも適用されます。他のアカウントがバケットにオブジェクトをアップロードできる場合は、IAM ID がアクセスできないオブジェクトの所有者であるアカウントを特定してください。オブジェクトを所有するアカウントを特定するには、GetObjectAcl コマンドを実行します。

他のアカウントに属する IAM ID が S3 バケットにオブジェクトをアップロードする場合は、S3 Object Ownership を設定します。次に、オブジェクトのアップロードには bucket-owner-full-control アクセスコントロールリスト (ACL) を必須とするバケットポリシーを追加します。このバケットポリシーを追加すると、オブジェクトが bucket-owner-full-control ACL を使用してアップロードされた際に、このポリシーにより、オブジェクトの所有者は自動的にバケット所有者に変更されます。詳細については、「他の AWS アカウントにより Amazon S3 バケットにオブジェクトがアップロードされた際、バケット所有者がそのオブジェクトに対するフルコントロールを取得することを義務づける方法を教えてください」を参照してください。

Amazon VPC エンドポイントポリシーを更新する

次の両方の条件に当てはまる場合は、VPC エンドポイントポリシーを更新し、S3 バケットとオブジェクトにアクセスするために必須のアクセス許可を含めてください。

  • AWS Glue ジョブは Amazon S3 に対するオブジェクトの読み書きを行う場合。
  • この接続は VPC エンドポイントを使用して Amazon 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 に対し、暗号化されたデータの読み書きを行う場合、そのジョブには次の設定が必要です。

  • IAM ロールのポリシーには、AWS KMS アクションに必要なアクセス許可が含まれていること。
  • AWS KMS キーのポリシーには、IAM ロールに必要なアクセスアクセス許可が含まれていること。

必要な AWS KMS アクションを許可するには、IAM ロールのポリシーに次のアクセス許可を含めてください。

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

注: ポリシー内の Amazon リソースネーム (ARN) を任意の ARN に置き換えてください。

詳細については、「AWS Glue で暗号化を設定する」を参照してください。

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

S3 バケットでのリクエスタ支払いオプションを確認する

S3 バケットでリクエスタ支払いオプションが有効である場合、AWS Glue ジョブからバケットへのすべてのリクエストには、リクエスタ支払いヘッダーを含める必要があります。Amazon S3 に対する AWS Glue リクエストでは、デフォルトではリクエスタ支払いヘッダーが含まれません。このヘッダーが欠けている場合、リクエスタ支払いバケットへの API コールは失敗し、「Access Denied」例外が発生します。リクエスタ支払いヘッダーを ETL スクリプトに追加するには、hadoopConfiguration().set() を使用し、GlueContext 変数または Apache Spark セッション変数に fs.s3.useRequesterPaysHeader を含めます。詳細については、「AWS Glue、Amazon EMR、または Athena から Amazon S3 のリクエスタ支払いバケットにアクセスする方法を教えてください」を参照してください。

AWS Organizations のサービスコントロールポリシーを確認する

AWS Organizations を使用している場合は、サービスコントロールポリシーを参照し、ポリシーが Amazon S3 へのアクセスを許可していることを確認してください。たとえば、次のポリシーは Amazon S3 へのアクセスを明示的に拒否しているため、「Access Denied」エラーが発生します。

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

詳細については、「AWS Organizations の組織ですべての機能を有効にする」を参照してください。

関連情報

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

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

関連するコンテンツ