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

従来 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 コンテナのログをカスタムデータソースとして認識させます。

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

この作業を行うことで、ロググループに cw:datasource:name と cw: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 型になってしまうので、タイプ変換プロセッサを利用して整数型に変換します。

パイプラインを作成する際の細かい手順は下記ブログに記載しましたので、今回は省略します。
S3 Tables 連携の作成
CloudWatch コンソールで S3 テーブル統合 > 統合を管理 を選択します。

Create integration をクリックします。

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

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

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

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

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

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

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

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

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

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









