Knowledge Center Monthly Newsletter - March 2025
Stay up to date with the latest from the Knowledge Center. See all new and updated Knowledge Center articles published in the last month and re:Post’s top contributors.
Amazon Athena でクエリを実行したときに「アクセスが拒否されました」というアクセス権限エラーを解決する方法を教えてください。
Amazon Athena クエリを実行すると、「アクセスが拒否されました」というエラーが表示されます。
簡単な説明
アクセス拒否クエリのエラーは通常、Athena が操作する他の AWS サービスや AWS アカウントの権限の問題に関連しています。Athena がよく利用するサービスの例としては、AWS ID およびアクセス管理 (IAM)、Amazon Simple Storage Service (Amazon S3)、AWS Key Management Service (AWS KMS) などがあります。
次の理由により、アクセス拒否エラーが発生する可能性があります。
- AWS Glue データカタログポリシーでは、IAM エンティティ (ユーザーまたはロール) へのアクセスは許可されません。
- IAM エンティティには、S3 ソースデータバケットを読み取ったり、クエリ結果バケットに結果を書き込んだりする権限がありません。
- Athena テーブルとバケットが異なるアカウントにある場合、S3 バケットポリシーは IAM エンティティに必要なアクセス権限を許可しません。
- オブジェクト所有者は Amazon S3 バケット所有者とは異なります。
- 暗号化されたデータの読み取りまたは書き込みに使用される AWS KMS キーへのアクセス権はありません。
解決策
アクセス拒否エラーのトラブルシューティングを行うには、ユースケースに応じて以下の権限を確認してください。詳細については、「Athena のトラブルシューティング」を参照してください。
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
Glue データカタログポリシーが IAM エンティティへのアクセスを許可していることを確認する
Glue Data Catalog ポリシーを使用する場合は、そのポリシーで IAM エンティティへのアクセスが許可されていることを確認してください。たとえば、データカタログに次のポリシーがある場合、athena_user IAM エンティティはデータカタログへのアクセスを拒否されます。
{ "Version": "2012-10-17", "Statement": [ { "Principal": { "AWS": [ "arn:aws:iam::1111222233334444:user/athena_user" ] }, "Effect": "Deny", "Action": [ "glue:*" ], "Resource": [ "arn:aws:glue:us-east-1:1111222233334444:*" ] } ] }
ポリシーの例については、「AWS Glue のリソースベースのポリシーの例」を参照してください。
前述のポリシーがデータカタログにある場合、ユーザーが実行する Athena クエリは次のエラー応答で失敗することがあります。
「Insufficient permissions to execute the query.User: arn:aws:iam:: 1111222233334444:user/athena_user is not authorized to perform: glue:GetTable on resource: arn:aws:glue:us-east-1:1111222233334444:database/doc_example_database with an explicit deny Query Id: example_query_ID」
クエリを実行する IAM エンティティに、AWS Glue リソースへのアクセスに必要な権限があることを確認してください。必要な AWS Glue アクセス権限の完全なリストについては、「AWS マネージドポリシー: AmazonAthenaFullAccess」を参照してください。
データカタログリソースポリシーが、必要な AWS Glue アクションを拒否していないことを確認してください。詳細については、AWS Glue データカタログの「AWS Glue データカタログのデータベースとテーブルへのきめ細かなアクセス」を参照してください。
IAM エンティティに、ソースデータバケットとクエリ結果バケットへのアクセスに必要な権限があることを確認します。
ソースデータバケットにアクセスできない場合、次のようなエラー応答が表示されます。
「Your query has the following errors:com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 72VA5FB0ASWCQFPD; S3 Extended Request ID: cykX1CZ/KfxpL/h8/DOQoCBJ88qFGYqt6J52Jqh87qBfyN8c2P2azRiYjjJE1HL7i0Mg9xxxxxx=; Proxy: null), S3 Extended Request ID: cykX1CZ/KfxpL/h8/DOQoCBJ88qFGYqt6J52Jqh87qBfyN8c2P2azRiYjjJE1HL7i0Mg9xxxxxx= (Path: s3://my-athena-source-bucket/athena_data.csv)」
クエリ結果バケットにアクセスできない場合、次のようなエラー応答が返されます。
「Your query has the following errors:Access denied when writing output to url: s3://my-athena-result-bucket/Unsaved/2021/05/07/example_query_ID.csv .Please ensure you are allowed to access the S3 bucket.If you are encrypting query results with KMS key, please ensure you are allowed to access your KMS key」
クエリを実行する IAM エンティティは、ソースデータバケットとクエリ結果バケットにアクセスできる必要があります。IAM エンティティに必要なアクセス権限を付与するには、IAM ポリシーを IAM エンティティにアタッチします。
IAM ポリシーの例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::my-athena-source-bucket" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::my-athena-source-bucket/data/*" ] }, { "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:AbortMultipartUpload", "s3:PutObject", "s3:ListMultipartUploadParts" ], "Resource": [ "arn:aws:s3:::my-athena-result-bucket", "arn:aws:s3:::my-athena-result-bucket/*" ] } ] }
前述のポリシーで、次の変数を置き換えます。
- my-athena-source-bucket をお使いのソースデータバケットの名前に
- my-athena-source-bucket/data/ をソースデータの場所に
- my-athena-result-bucket をクエリ結果バケットの名前に
ポリシーの完全なリストについては、「Amazon Athena の AWS 管理ポリシー」を参照してください。
クロスアカウントクエリに必要なアクセス権限を含む Amazon S3 バケットポリシーをアタッチする
Athena テーブルと S3 バケットが同じアカウントにある場合は、S3 バケットポリシーをアタッチする必要はありません。ただし、バケットポリシーをすでにアタッチしている場合は、データをクエリしている IAM エンティティに S3 権限が付与されていることを確認してください。
Athena テーブルと S3 バケットが異なるアカウントにある場合は、IAM エンティティへのアクセスを許可する S3 バケットポリシーをアタッチします。
S3 バケットを持つアカウントに、他のアカウントの athena_user へのアクセスを許可する S3 バケットポリシーをアタッチします。以下のポリシー例では、アカウント A の IAM ユーザーがアカウント B の my-athena-source-bucket S3 バケットにアクセスすることを明示的に許可しています。
{ "Version": "2012-10-17", "Id": "Policy1620692934647", "Statement": [ { "Sid": "Stmt1620692932186", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::1111222233334444:user/athena_user" }, "Action": [ "s3:*" ], "Resource": [ "arn:aws:s3:::my-athena-source-bucket", "arn:aws:s3:::my-athena-source-bucket/data/*" ] } ] }
前述のポリシー例で、次の変数を置き換えます。
- my-athena-source-bucket をお使いのソースデータバケットの名前に
- my-athena-source-bucket/data/ をソースデータの場所に
- **1111222233334444 ** を IAM ユーザーアカウント (アカウント A) の ID に
- athena_user を IAM ユーザー (アカウント A) の名前に
他のアカウントのすべてのユーザーにバケットへのアクセスを許可するには、プリンシパルキーをroot ルートを指定するキー (「arn:aws:iam::1111222233334444:root」) に置き換えます。
**注:**前述のポリシーでは、my-athena-source-bucket へのすべての S3 アクションを許可しています。S3 バケットがソースバケットかクエリ結果バケットかに応じて S3 アクションを更新します。詳細については、「バケットオブジェクトへのクロスアカウントアクセス」をご覧ください。
S3 バケットポリシーに、アカウント A またはその IAM ユーザーへのアクセスを明示的に拒否するステートメントが含まれていないことを確認します。また、ポリシーにリクエストを拒否する可能性のある条件が含まれていないことを確認してください。詳細については、「Amazon S3 からの 403 Access Denied エラーをトラブルシューティングするにはどうすればよいですか?」を参照してください。
AWS KMS キーポリシーの更新
ソースデータが暗号化されている場合、または Athena クエリが AWS KMS キーを使用して暗号化された結果を書き込む場合は、次の権限を確認してください。
- IAM ユーザーのポリシーでは、必要な AWS KMS アクションが許可されます。
- AWS KMS キーポリシーは、ユーザーへのアクセスを許可します。
次の AWS KMS キーポリシーの例では、アカウント 1111222233334444 のすべてのユーザーにすべての AWS KMS アクションを許可しています。
{ "Sid": "Enable IAM policies", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::1111222233334444:root" }, "Action": "kms:*", "Resource": "*" }
**注:**前述のポリシーで、サンプル変数をご使用の変数に置き換えます。
詳細については、「AWS KMS のキーポリシー」および「Amazon S3 の暗号化されたデータへのアクセス許可」を参照してください。
S3 バケット所有者がオブジェクトにアクセスできることを確認する
デフォルトでは、S3 オブジェクトをバケットにアップロードするアカウントがオブジェクトを所有しています。これは、バケットの所有者が他のアカウントである場合にも当てはまります。他のアカウントのユーザーがあなたのバケットにオブジェクトをアップロードできる場合は、あなたのユーザーがアクセスできないオブジェクトを所有しているアカウントを確認します。GetObjectAcl コマンドを実行して、オブジェクトの所有者を確認します。
S3 バケット所有者とオブジェクト所有者が異なる場合、オブジェクト所有者はあなたにオブジェクトのフルコントロールを付与できます。これを行うには、オブジェクト所有者が bucket-owner-full-control パラメータを指定して PutObjectAcl コマンドを実行します。
オブジェクトの所有権を S3 バケットを所有するアカウントに変更するには、AWS CLI cp コマンドを実行します。必ず、バケットのアカウントから cp コマンドを実行して、オブジェクトをそれ自体にコピーしてください。
詳細については、「別の AWS アカウントにより自分の Amazon S3 バケットにアップロードされたオブジェクトにアクセスできないのはなぜですか?」を参照してください。
関連情報
関連するコンテンツ
- 質問済み 2年前lg...
- 質問済み 4ヶ月前lg...
- AWS公式更新しました 4年前
- AWS公式更新しました 2年前
- AWS公式更新しました 1年前
- AWS公式更新しました 1年前