View a markdown version of this page

S3 Tables でのアクセスログのクエリ - Amazon Simple Storage Service

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 でアクセスログをクエリする前に、以下を完了する必要があります。

  1. S3 Tables 統合を有効にします。S3 Tables 統合の有効化 (オプション)」を参照してください。

  2. S3 Tables と分析サービスの統合を有効にします。Amazon S3 コンソールで、[テーブルバケット] に移動し、[統合を有効にする] を選択します。これにより、Data Catalog に s3tablescatalog フェデレーションカタログが作成され、テーブルが分析サービスに対して表示可能になります。デフォルトでは、アクセスは IAM アクセス許可によって制御されます。オプションで AWS Lake Formation を使用して、きめ細かなアクセスコントロールを行うことができます。詳細については、「S3 Tables と AWS 分析サービスの統合」を参照してください。

  3. データが入力されるまで待ちます。通常、データは CloudWatch Logs への最初の配信から 1 時間以内に表示されます。

Amazon Athena の接続

  1. https://console.aws.amazon.com/athena/ で Athena コンソールを開きます。

  2. クエリエディタで、データソースドロップダウンから [Amazon S3 Tables] カタログを選択します。

  3. ログテーブルは、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 AWS は、エージェントが AWS データを操作するための検証済み手順を提供するスキルを提供します。CloudWatch Logs システムテーブルのクエリのスキルでは、aws-cloudwatch テーブルバケット内の Amazon S3 サーバーアクセスログなど、S3 テーブルにエクスポートされた CloudWatch Logs データに対して SQL クエリを実行します。これを使用するには、GitHub のリポジトリからスキルをダウンロードし、エージェントのスキルディレクトリに追加します。

例えば、過去 24 時間の S3 サーバーアクセスログのリクエスト数で上位 10 のソース IP アドレスを表示するようにエージェントに依頼できます。エージェントはスキルを使用してアクセスログテーブルを見つけ、Athena でクエリを実行します。