😆

AthenaでS3データをクエリする際に必要なIAM権限まとめ

2024/12/21に公開

AWS Athenaを利用してS3上のデータをクエリしようとした際に、「Access Denied」などのエラーが出てしまう経験をされた方は少なくないと思います。
本記事では、AthenaがS3データをクエリするために必要となるIAM権限と、その具体的な設定方法をまとめます。

1. 前提:AthenaがS3にアクセスする仕組み

Athenaは、以下の2つのタイミングでS3にアクセスします。

  1. クエリ対象のS3バケットへのアクセス
    Athenaはクエリ対象のデータを読み込む必要があるため、クエリ先のS3バケットのオブジェクトにアクセスします。
  2. クエリ結果の保存先バケットへのアクセス
    Athenaのクエリ結果は指定したS3バケットに保存されます。
    デフォルトでは aws-athena-query-results-<YourAccountID>-<Region> といった形式のバケットが自動生成されますが、
    もちろん任意のバケットを設定することもできます。

これらの処理を行うために必要な権限を付与していないと、以下のようなエラーが発生します。

com.amazonaws.services.s3.model.AmazonS3Exception: 
Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; ...)

2. 必要となる最小限のS3権限

AthenaがS3のバケットをクエリするために必要な権限は、大きく分けて2つです。

  1. s3:GetObject
    クエリ対象となるオブジェクトを読み取る権限。
    バケット配下の全オブジェクト(例: arn:aws:s3:::<YOUR_TARGET_BUCKET>/*)に対して付与する必要があります。
  2. s3:ListBucket
    バケット内のオブジェクト一覧を取得する権限。
    バケット自体(例: arn:aws:s3:::<YOUR_TARGET_BUCKET>)に対して付与する必要があります。

クエリ結果を保存するバケットに対する権限

Athenaはクエリ結果をS3バケットに書き込みます。そのため、クエリ結果保存用のバケットに対しても以下の権限が必要です。

  • s3:PutObject(クエリ結果の書き込み)
  • s3:GetBucketLocation(必要に応じてリージョン情報を取得)

デフォルトのクエリ結果バケットをそのまま利用している場合でも、必要に応じて確認・設定しましょう。

3. IAMポリシーの例

下記はAthenaがクエリ対象バケット「my-sample-data-bucket」へアクセスし、かつクエリ結果を「my-athena-query-results-bucket」へ書き込むための最小限のポリシー例です。
実際にご利用の際は「<YOUR_TARGET_BUCKET>」「<YOUR_QUERY_RESULTS_BUCKET>」「<YOUR_ACCOUNT_ID>」「<YOUR_ROLE_NAME>」などに置き換えてください。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      // クエリ対象バケットに対する権限
      "Sid": "AllowAthenaReadAccess",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion"
      ],
      "Resource": "arn:aws:s3:::my-sample-data-bucket/*"
    },
    {
      "Sid": "AllowAthenaListBucket",
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::my-sample-data-bucket"
    },
    {
      // クエリ結果バケットに対する権限
      "Sid": "AllowAthenaWriteAccess",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetBucketLocation"
      ],
      "Resource": [
        "arn:aws:s3:::my-athena-query-results-bucket",
        "arn:aws:s3:::my-athena-query-results-bucket/*"
      ]
    }
  ]
}

上記のポリシーを、Athenaが利用するIAMロールやユーザーにアタッチしてください。
ロール名の例:

arn:aws:iam::<YOUR_ACCOUNT_ID>:role/<YOUR_ROLE_NAME>

4. ロールにポリシーをアタッチする手順

  1. IAMコンソールを開く
    IAMの管理画面 にアクセスします。
  2. 対象のロールを選択
    例: arn:aws:iam::<YOUR_ACCOUNT_ID>:role/<YOUR_ROLE_NAME>
  3. ポリシーのアタッチ
    先ほどのJSONポリシーをカスタムポリシーとして登録し、ロールにアタッチします。

5. Athenaの設定を確認

  • ワークグループのクエリ結果の保存先
    Athenaのコンソールから「ワークグループ」を選択し、クエリ結果のS3バケットが正しく指定されているか確認します。
  • クエリ結果バケットが正しく作成されているか
    アクセス権限は問題ないか、S3コンソールからも念のためチェックしましょう。

6. エラーが解消しない場合

  • CloudTrailの確認
    どのリソースに対してどんなアクションが拒否されたか、CloudTrailのイベント履歴から確認してみてください。
  • バケットポリシーの確認
    S3バケットにバケットポリシーを設定している場合、Athenaの利用するIAMエンティティ(ユーザー/ロール)に対してアクセス許可が設定されているか確認しましょう。
  • 最小権限の原則
    セキュリティの観点から、必要以上に権限を与えないように注意してください。

まとめ

AthenaがS3のデータをクエリする際は、以下のポイントを押さえておくことが重要です。

  • クエリ対象バケットに対する s3:GetObjects3:ListBucket 権限
  • クエリ結果保存バケットに対する s3:PutObjects3:GetBucketLocation 権限
  • これらの権限をまとめたIAMポリシーを、Athenaが利用するロールまたはユーザーにアタッチ
  • バケットポリシーを利用している場合は、そこでもアクセスを許可する設定が必要

適切な権限を設定することで、Athenaを使ったビッグデータ分析をスムーズに進められるようになります。ぜひ参考にしてみてください。

Discussion