Amazon Athena でクエリを実行したとき「Access Denied (アクセスが拒否されました) 」というエラーが表示される理由を教えてください。

最終更新日: 2021 年 5 月 19 日

Amazon Athena クエリを実行すると「Access Denied (アクセスが拒否されました)」というエラーが発生します。

簡単な説明

通常、次の理由により、「Access Denied (アクセスが拒否されました) 」エラーが発生します。

  • AWS Identity and Access Management (IAM) のユーザーに、次のアクセス許可のどちらか、または両方がない。
    • ソースデータバケットの読み取り
    • 結果のクエリ結果バケットへの書き込み
  • Amazon Simple Storage Service (Amazon S3) バケットポリシーで、IAM ユーザーに必要なアクセス許可が付与されていない。
  • オブジェクトの所有者が、Amazon S3 バケット所有者と異なる。
  • 暗号化されたデータの読み書きに使用される AWS Key Management Service (AWS KMS) キーにアクセスできない。
  • AWS Glue データカタログポリシーで、IAM ユーザーへのアクセスが許可されていない。

解決方法

「Access Denied (アクセスが拒否されました)」エラーをトラブルシューティングするには、以下を確認します。

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 S3 バケットポリシーをアタッチ

Athena テーブルと S3 バケットが同じアカウントにある場合は、S3 バケットポリシーをアタッチする必要はありません。ただし、S3 バケットポリシーがある場合は、必要な S3 アクションを IAM ユーザー/ロールに許可してください。Athena テーブルと S3 バケットが異なるアカウントにある場合は、IAM ユーザーに必要なアクセスを許可する S3 バケットポリシーをアタッチする必要があります。

アカウント B で次のような S3 バケットポリシーをアタッチして、アカウント A の IAM ユーザー athena_user にアクセス権を付与できます。このポリシー例では、IAM ユーザーがアカウント B の S3 バケット my-athena-source-bucket にアクセスすることを明示的に許可しています。

{
    "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 をアカウント A のアカウント ID に
  • athena_user をアカウント A の IAM ユーザーの名前に

アカウント A のすべてのユーザーにバケットへのアクセスを許可するには、Principal キーを root (例: arn:aws:iam::1111222233334444:root) を指定するキーに置き換えます。

注: 上記のポリシーでは、すべての S3 アクションを my-athena-source-bucket に許可しています。S3 バケットがソースバケットかクエリ結果バケットかに基づいて、S3 アクションを更新できます。詳細については、「Amazon S3 バケットへの Athena のクロスアカウントアクセス」の「バケットポリシーまたはIAM ユーザーポリシー」セクションを参照してください。

S3 バケットポリシーに、アカウント A またはその IAM ユーザーへのアクセスを明示的に拒否するステートメントが含まれていないことを確認します。また、ポリシーに、リクエストを拒否する可能性のある条件が含まれていないことを確認してください。詳細については、「Amazon S3 からの 403 Access Denied エラーをトラブルシューティングするにはどうすればよいですか?」を参照してください。 S3 バケットの最小限のアクセス許可を定義するには、「How to define least-privileged permissions for actions called by AWS services (AWS サービスによって呼び出されるアクションの最小限のアクセス許可を定義する方法)」を参照してください。

AWS KMS キーポリシーを更新

ソースデータが暗号化されている場合、または Athena クエリが AWS KMS キーを使用して暗号化された結果を書き込む場合は、次のことを確認してください。

  • IAM ユーザーのポリシーで、必要な AWS KMS アクションが許可されている。
  • AWS KMS キーのポリシーで、ユーザーへのアクセスが許可されている。

次に示すのは、アカウント ID 1111222233334444 のすべてのユーザーにすべての KMS アクションを許可する AWS KMS キーポリシーの例です。

{
  "Sid": "Enable IAM policies",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::1111222233334444:root"
   },
  "Action": "kms:*",
  "Resource": "*"
}

ご利用のユースケースに基づいて、必ずこのポリシーを更新してください。詳細については、「AWS KMS でのキーポリシーの使用」および「Permissions to encrypted data in Amazon S3 (Amazon S3 での暗号化されたデータへのアクセス許可)」を参照してください。

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

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

S3 バケット所有者とオブジェクト所有者が異なる場合、オブジェクト所有者はオブジェクトのフルコントロールを許可できます。オブジェクト所有者は、bucket-owner-full-control パラメータを指定して PutObjectAcl コマンドを実行すると、これを行うことができます。オブジェクトの所有権を S3 バケットを所有しているアカウントに変更するには、バケットのアカウントから AWS コマンドラインインターフェイス(AWS CLI)コマンド cp を実行して、オブジェクトをそれ自体にコピーします。

注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

詳細については、「別の AWS アカウントで 自分の Amazon S3 バケットにアップロードされたオブジェクトにアクセスできないのはなぜですか?」を参照してください

AWS Glue データカタログポリシーで IAM ユーザー/ロールへのアクセスが許可されていることを確認

既存の AWS Glue データカタログポリシーがある場合は 、そのポリシーで IAM ユーザー/ロールへのアクセスが許可されていることを確認します。例えば、データカタログに次のポリシーがある場合、IAM ユーザー athena_user はデータカタログへのアクセスが拒否されます。

{
    "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 アクセス許可の一覧については、「 AmazonAthenaFullAccess 管理ポリシー」を参照してください 。必要な AWS Glue アクションがデータカタログリソースポリシーによって拒否されないことを確認してください。詳細については、「AWS Glue データカタログ」の「AWS Glue データカタログのデータベースとテーブルへのきめ細かなアクセス」を参照してください。


この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?