S3 Tables でのアクセスログのクエリ
Amazon S3 Tables 統合を有効にすると、Amazon CloudWatch Logs はサーバーアクセスログを Apache Iceberg 形式で aws-cloudwatch マネージドテーブルバケットに配信します。データは Iceberg 形式であるため、Apache Iceberg をサポートする任意のツールを使用してクエリを実行できます。
-
Amazon Athena – S3 Tables カタログを使用して、Athena コンソールから直接 SQL クエリを実行します。
-
Amazon SageMaker Unified Studio – 組み込みの SQL エディタを使用して、他の分析ワークロードと統合してログデータをクエリします。
-
Amazon Redshift – Redshift Spectrum または直接統合を使用して Iceberg テーブルをクエリします。
-
Amazon EMR 上の Apache Spark – Iceberg コネクタで Spark SQL または DataFrame API を使用します。
-
オープンソースツール – Trino、DuckDB、PyIceberg など、Apache Iceberg REST カタログをサポートする任意のツール。
注記
CloudWatch Logs Insights (SQL なし) でインタラクティブにログをクエリする方法については、「CloudWatch Logs Insights を使用したログのクエリ」を参照してください。
前提条件
S3 Tables でアクセスログをクエリする前に、以下を完了する必要があります。
-
S3 Tables 統合を有効にします。「S3 Tables 統合の有効化 (オプション)」を参照してください。
-
S3 Tables と分析サービスの統合を有効にします。Amazon S3 コンソールで、[テーブルバケット] に移動し、[統合を有効にする] を選択します。これにより、Data Catalog に
s3tablescatalogフェデレーションカタログが作成され、テーブルが分析サービスに対して表示可能になります。デフォルトでは、アクセスは IAM アクセス許可によって制御されます。オプションで AWS Lake Formation を使用して、きめ細かなアクセスコントロールを行うことができます。詳細については、「S3 Tables と AWS 分析サービスの統合」を参照してください。 -
データが入力されるまで待ちます。通常、データは CloudWatch Logs への最初の配信から 1 時間以内に表示されます。
Amazon Athena の接続
-
https://console.aws.amazon.com/athena/
で Athena コンソールを開きます。 -
クエリエディタで、データソースドロップダウンから [Amazon S3 Tables] カタログを選択します。
-
ログテーブルは、
logs名前空間のデータベースリストに表示されます。
サーバーアクセスログのテーブル名は amazon_s3__server_access です。完全修飾のテーブル参照は次のとおりです。
"s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
トラフィック分析
例時間の経過に伴うリクエストボリューム
SELECT date_trunc('minute', request_time) AS interval, COUNT(*) AS requests FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" GROUP BY date_trunc('minute', request_time) ORDER BY interval ASC;
例オペレーションタイプ別のリクエストミックス
SELECT operation, COUNT(*) AS cnt FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" GROUP BY operation ORDER BY cnt DESC;
例バケット別のトラフィック
SELECT bucket_arn, COUNT(*) AS requests, SUM(bytes_sent_size) AS bytes_out FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" GROUP BY bucket_arn ORDER BY requests DESC;
エラーのトラブルシューティング
例エラー率の内訳
SELECT http_status, error_code, operation, COUNT(*) AS error_count FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" WHERE http_status >= 400 GROUP BY http_status, error_code, operation ORDER BY error_count DESC;
例 403 Access Denied リクエスト
SELECT key_name, remote_ip, requester, COUNT(*) AS denied_count FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" WHERE http_status = 403 GROUP BY key_name, remote_ip, requester ORDER BY denied_count DESC;
例 404 Not Found リクエスト
SELECT key_name, error_code, remote_ip, COUNT(*) AS miss_count FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" WHERE http_status = 404 GROUP BY key_name, error_code, remote_ip ORDER BY miss_count DESC;
例 503 SlowDown (スロットリング) イベント
SELECT key_name, remote_ip, COUNT(*) AS throttle_count FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" WHERE http_status = 503 GROUP BY key_name, remote_ip ORDER BY throttle_count DESC;
アクセスパターン
例ソース IP 別のトラフィック
SELECT remote_ip, COUNT(*) AS total_requests, SUM(CASE WHEN http_status >= 400 THEN 1 ELSE 0 END) AS errors, SUM(bytes_sent_size) AS bytes_transferred FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" GROUP BY remote_ip ORDER BY total_requests DESC;
例リクエスタ別のオペレーション
SELECT requester, operation, COUNT(*) AS requests FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" GROUP BY requester, operation ORDER BY requests DESC;
例最もアクセスされたキー
SELECT key_name, COUNT(*) AS access_count, SUM(bytes_sent_size) AS bytes_out FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" WHERE operation IN ('REST.GET.OBJECT', 'REST.PUT.OBJECT') GROUP BY key_name ORDER BY access_count DESC LIMIT 10;
レイテンシー分析
例オペレーションタイプ別のレイテンシー
SELECT operation, AVG(total_duration) AS avg_ms, APPROX_PERCENTILE(total_duration, 0.5) AS p50_ms, APPROX_PERCENTILE(total_duration, 0.95) AS p95_ms, MAX(total_duration) AS max_ms, COUNT(*) AS requests FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" WHERE operation IN ('REST.GET.OBJECT', 'REST.PUT.OBJECT') GROUP BY operation;
例 p95 レイテンシーが最も遅いキー
SELECT key_name, AVG(total_duration) AS avg_ms, APPROX_PERCENTILE(total_duration, 0.95) AS p95_ms, COUNT(*) AS requests FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" WHERE operation = 'REST.GET.OBJECT' GROUP BY key_name ORDER BY p95_ms DESC LIMIT 10;
例時間の経過に伴うレイテンシー
SELECT date_trunc('minute', request_time) AS interval, AVG(total_duration) AS avg_ms, APPROX_PERCENTILE(total_duration, 0.95) AS p95_ms FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" WHERE operation IN ('REST.GET.OBJECT', 'REST.PUT.OBJECT') GROUP BY date_trunc('minute', request_time) ORDER BY interval ASC;
原価配分
例オペレーション別のデータ転送
SELECT operation, SUM(bytes_sent_size) AS total_bytes_out, SUM(object_size) AS total_object_bytes, COUNT(*) AS request_count FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" WHERE operation IN ('REST.GET.OBJECT', 'REST.PUT.OBJECT', 'REST.DELETE.OBJECT') GROUP BY operation ORDER BY total_bytes_out DESC;
例提供されている最大サイズのオブジェクト
SELECT key_name, MAX(object_size) AS max_size, AVG(object_size) AS avg_size, COUNT(*) AS reads FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" WHERE operation = 'REST.GET.OBJECT' AND bytes_sent_size > 0 GROUP BY key_name ORDER BY max_size DESC LIMIT 10;
セキュリティ分析
例エラー率の高い IP
SELECT remote_ip, COUNT(*) AS total, SUM(CASE WHEN http_status >= 400 THEN 1 ELSE 0 END) AS errors FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" GROUP BY remote_ip HAVING SUM(CASE WHEN http_status >= 400 THEN 1 ELSE 0 END) > 10 ORDER BY errors DESC;
例キー別のアクセス試行の失敗
SELECT remote_ip, key_name, operation, http_status, COUNT(*) AS attempts FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" WHERE http_status >= 400 GROUP BY remote_ip, key_name, operation, http_status ORDER BY attempts DESC LIMIT 20;
例 TLS バージョンのディストリビューション
SELECT tls_version, COUNT(*) AS cnt FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access" GROUP BY tls_version ORDER BY cnt DESC;
AI エージェントを使用した Amazon S3 サーバーアクセスログのクエリ
MCP 互換 AI エージェントは、Amazon S3 サーバーアクセスログを含む S3 テーブルを検出し、SQL クエリを生成して、結果を分析できます。Amazon S3 サーバーアクセスログは aws-cloudwatch テーブルバケットの Iceberg テーブルとしてエクスポートされるため、エージェントは Amazon Athena、Amazon EMR、Amazon Redshift、または Iceberg 互換ツールで使用するのと同じ S3 Tables カタログを介してクエリを実行できます。
Agent Toolkit for AWSaws-cloudwatch テーブルバケット内の Amazon S3 サーバーアクセスログなど、S3 テーブルにエクスポートされた CloudWatch Logs データに対して SQL クエリを実行します。これを使用するには、GitHub のリポジトリからスキルをダウンロードし、エージェントのスキルディレクトリに追加します。
例えば、過去 24 時間の S3 サーバーアクセスログのリクエスト数で上位 10 のソース IP アドレスを表示するようにエージェントに依頼できます。エージェントはスキルを使用してアクセスログテーブルを見つけ、Athena でクエリを実行します。