タダです.
以前の記事で Athena のクエリ結果を S3 に保存しないマネージドクエリ結果オプションについて紹介しました.この記事では,この設定を Terraform で行う方法を整理します.
マネージドクエリ結果とは
Amazon Athena のマネージドクエリ結果は,クエリ結果を S3 バケットに保存する代わりに Athena が管理するストレージに保存するオプションです.これにより,クエリ結果用の S3 バケットを別途用意する必要がなくなります.クエリ結果は24時間保持されます.
また,マネージドクエリ結果を使うことで S3 バケットのプロビジョニングや管理,アクセス制御が不要になるため,IAM ポリシーで S3 バケットへの権限(s3:PutObject, s3:GetObject, s3:GetBucketLocation など)を付与する必要がなくなります.ワークグループレベルで GetQueryResults と GetQueryResultsStream の権限管理ができるため,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 バケット管理を省略したい場合に活用してみてください.