CloudWatch Logs の S3 Tables 連携を行って Athena からクエリしてみた

CloudWatch Logs の S3 Tables 連携を行って Athena からクエリしてみた

2026.04.19

アップデート概要

re:Invent 2025 で CloudWatch ログに S3 Tables との連携機能が追加されました。

https://dev.classmethod.jp/articles/cloudwatch-unified-log-management-analytics/

上記アップデートには CloudWatch ログに関する複数のアップデートが含まれており、S3 Tables 連携はその中の一つとなります。
この機能により、CloudWatch に取り込まれたログを AWS マネージドな形で S3 Tables に連携し、Athena や Redshift などの Apache Iceberg 互換ツールでクエリしやすくなりました。
ちょっとした分析であれば CloudWatch Insights を利用しつつ、複雑な分析を行う場合は Athena 等で SQL ベースのクエリを行うようなことが簡単にできるわけです.

Untitled(85).png

従来 CloudWatch ログのデータを S3 Tables に連携するには Kinesis Data Firehose などを利用したパイプライン構築が必要でしたが、本機能を使えばフルマネージドで連携可能です。
また、この統合を行った場合は追加のストレージ料金がかからない点も大きなメリットです。

この統合によって作成された S3 テーブルには、既存の CloudWatch の取り込みとストレージ料金以外に、追加のストレージやテーブルのメンテナンス料金はかかりません。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/s3-tables-integration.html#3-tables-integration-when-to-use

この際、S3 Tables に連携されたログの保持期間は CloudWatch ロググループの保持期間と同じになります。

S3 テーブルバケットのデータ保持は、ロググループに設定されている保持ポリシーと一致します。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/s3-tables-integration.html#understanding-s3-tables-integration

やってみる

CloudWatch ロググループをデータソースとして認識させる

まず、ロググループをデータソースとして認識させる必要があります。
多くの AWS ログは自動で検出されてデータソースとして認識されます。
今回は ECS Express Mode でデプロイした Nginx コンテナのログをカスタムデータソースとして認識させます。

スクリーンショット 2026-04-19 17.03.19.png

データソース名を nginx、データソースタイプを access として、データソースをマッピングします。

スクリーンショット 2026-04-19 17.03.32.png

この作業を行うことで、ロググループに cw:datasource:namecw:datasource:type のタグを付与することができます。
もちろんロググループ作成時にタグを付与しておいても構いません。
後からタグを付与した際、データソースとして認識されるまでは大分ラグがあったので気長に待って下さい。
あくまで私の環境の場合ですが、1 時間程度待たないと認識されませんでした。
また、今回 public.ecr.aws/nginx/nginx:1.29-alpine を特に設定を変えず利用しており、アクセスログは combined フォーマットになっています。

10.0.1.217 - - [19/Apr/2026:08:01:06 +0000] "GET / HTTP/1.1" 200 896 "-" "ELB-HealthChecker/2.0" "-"

これだと Athena でクエリし辛いので、JSON フォーマットに変更します。
Nginx 側で設定しても良いのですが、せっかくなので CloudWatch パイプラインで扱ってみます。
%{NGINX_ACCESS_LOG} でパースすると末尾の X-Forward-For を上手く扱えずにエラーになってしまうので、%{NGINX_ACCESS_LOG} %{DATA} でパースします。
また、status_code が double 型になってしまうので、タイプ変換プロセッサを利用して整数型に変換します。

スクリーンショット 2026-04-19 20.18.18.png

パイプラインを作成する際の細かい手順は下記ブログに記載しましたので、今回は省略します。

https://dev.classmethod.jp/articles/cloudwatch-log-management-custom-log-ingestion/

S3 Tables 連携の作成

CloudWatch コンソールで S3 テーブル統合 > 統合を管理 を選択します。

スクリーンショット 2026-04-19 17.18.35.png

Create integration をクリックします。

スクリーンショット 2026-04-19 17.19.22.png

Create S3 Tables integration をクリックします。

スクリーンショット 2026-04-19 17.19.31.png

Integration status が Active になったことを確認して、Associate data source をクリックします。

スクリーンショット 2026-04-19 18.03.05.png

データソースを選択して、Associate data source(s) をクリックします。

スクリーンショット 2026-04-19 18.03.14.png

ここまで完了すると、AWS マネージドな形で S3 テーブルバケットとテーブルが作成されます。

スクリーンショット 2026-04-19 18.05.05.png

Lake Formation での権限付与

Athena から S3 Tables にアクセスするためには Lake Formation での権限付与が必要です。 
Lake Formation のコンソールに移動して、 Permissions > Data permissions から Grant をクリックします。

スクリーンショット 2026-04-19 18.08.06.png

Principal に Athena を実行する IAM ユーザー もしくは IAM ロールを指定します。
IAM Identity Center 連携もできるようですが、今回は一旦 IAM ロールを指定します。

スクリーンショット 2026-04-19 18.10.26.png

カタログとして aws-cloudwatch、Database として logs を選択します。
テーブルは細かく設定できますが、今回は All tables を選択します。

スクリーンショット 2026-04-19 18.14.23.png

SelectDescribe の権限を付与して、「Grant」をクリックします。

スクリーンショット 2026-04-19 18.14.43.png

Athena でクエリする

ここまで実行すると、Athena から S3 Tables にアクセスしてクエリを実行することができます。
事前のテーブル作成も不要です。

スクリーンショット 2026-04-19 20.38.56.png

最後に

CloudWatch Logs の S3 Tables 連携を行って Athena からクエリしてみました。
Data Firehose が必要だった所からかなり手軽になりましたので、是非試してみて下さい!

この記事をシェアする

関連記事