継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

Athena のマネージドクエリ結果を Terraform で設定するメモ✍

タダです.

以前の記事で Athena のクエリ結果を S3 に保存しないマネージドクエリ結果オプションについて紹介しました.この記事では,この設定を Terraform で行う方法を整理します.

sadayoshi-tada.hatenablog.com

マネージドクエリ結果とは

Amazon Athena のマネージドクエリ結果は,クエリ結果を S3 バケットに保存する代わりに Athena が管理するストレージに保存するオプションです.これにより,クエリ結果用の S3 バケットを別途用意する必要がなくなります.クエリ結果は24時間保持されます.

また,マネージドクエリ結果を使うことで S3 バケットのプロビジョニングや管理,アクセス制御が不要になるため,IAM ポリシーで S3 バケットへの権限(s3:PutObject, s3:GetObject, s3:GetBucketLocation など)を付与する必要がなくなります.ワークグループレベルで GetQueryResultsGetQueryResultsStream の権限管理ができるため,IAM 権限の管理がシンプルになるのもメリットです.

Terraform での設定

aws_athena_workgroup リソース

Terraform の aws_athena_workgroup リソースでは,configuration ブロック内の managed_query_results_configuration でマネージドクエリ結果を設定できます.

基本的な設定例

マネージドクエリ結果を有効にする最小限の設定は以下の通りです.

resource "aws_athena_workgroup" "example" {
  name = "example"

  configuration {
    managed_query_results_configuration {
      enabled = true
    }
  }
}

KMS 暗号化を指定する場合

マネージドクエリ結果に対して KMS キーで暗号化を行う場合は,encryption_configuration ブロックを追加します.

resource "aws_athena_workgroup" "example" {
  name = "example"

  configuration {
    managed_query_results_configuration {
      enabled = true

      encryption_configuration {
        kms_key = aws_kms_key.example.arn
      }
    }
  }
}

KMS キーを指定する場合,Athena のサービスプリンシパルがキーを使用できるよう KMS キーポリシーの設定が必要です.ドキュメントに記載されているポリシー例を参考に,以下のように設定します.

特定のワークグループに限定する場合

{
    "Sid": "Allow athena service principal to use the key",
    "Effect": "Allow",
    "Principal": {
        "Service": "encryption.athena.amazonaws.com"
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey",
        "kms:Describe*"
    ],
    "Resource": "arn:aws:kms:{region-name}:{account-id}:key/{key-id}",
    "Condition": {
        "ArnLike": {
            "kms:EncryptionContext:aws:athena:arn": "arn:aws:athena:{region-name}:{account-id}:workgroup/{workgroup-name}",
            "aws:SourceArn": "arn:aws:athena:{region-name}:{account-id}:workgroup/{workgroup-name}"
        },
        "StringEquals": {
            "aws:SourceAccount": "{account-id}"
        }
    }
}

なお,クエリを実行するユーザーの IAM ポリシーにも KMS キーへの kms:GenerateDataKey および kms:Decrypt アクションの実行権限が必要です.

まとめ

Athena のマネージドクエリ結果を Terraform で設定する方法を整理しました.managed_query_results_configuration ブロックで enabled = true とするだけで有効化できるため,クエリ結果用の S3 バケット管理を省略したい場合に活用してみてください.