

# S3 Tables でのアクセスログのクエリ
<a name="sal-cw-querying-s3tables"></a>

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 を使用したログのクエリ](sal-cw-querying-insights.md)」を参照してください。

## 前提条件
<a name="sal-cw-s3tables-prerequisites"></a>

S3 Tables でアクセスログをクエリする前に、以下を完了する必要があります。

1. **S3 Tables 統合を有効にします。**「[S3 Tables 統合の有効化 (オプション)](sal-cw-enabling.md#sal-cw-tables-integration)」を参照してください。

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

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

## Amazon Athena の接続
<a name="sal-cw-s3tables-athena-setup"></a>

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

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

1. ログテーブルは、`logs` 名前空間のデータベースリストに表示されます。

サーバーアクセスログのテーブル名は `amazon_s3__server_access` です。完全修飾のテーブル参照は次のとおりです。

```
"s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
```

## トラフィック分析
<a name="sal-cw-s3tables-traffic"></a>

**Example 時間の経過に伴うリクエストボリューム**  

```
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;
```

**Example オペレーションタイプ別のリクエストミックス**  

```
SELECT operation, COUNT(*) AS cnt
FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
GROUP BY operation
ORDER BY cnt DESC;
```

**Example バケット別のトラフィック**  

```
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;
```

## エラーのトラブルシューティング
<a name="sal-cw-s3tables-errors"></a>

**Example エラー率の内訳**  

```
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;
```

**Example 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;
```

**Example 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;
```

**Example 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;
```

## アクセスパターン
<a name="sal-cw-s3tables-access"></a>

**Example ソース 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;
```

**Example リクエスタ別のオペレーション**  

```
SELECT requester, operation, COUNT(*) AS requests
FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
GROUP BY requester, operation
ORDER BY requests DESC;
```

**Example 最もアクセスされたキー**  

```
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;
```

## レイテンシー分析
<a name="sal-cw-s3tables-latency"></a>

**Example オペレーションタイプ別のレイテンシー**  

```
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;
```

**Example 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;
```

**Example 時間の経過に伴うレイテンシー**  

```
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;
```

## 原価配分
<a name="sal-cw-s3tables-cost"></a>

**Example オペレーション別のデータ転送**  

```
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;
```

**Example 提供されている最大サイズのオブジェクト**  

```
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;
```

## セキュリティ分析
<a name="sal-cw-s3tables-security"></a>

**Example エラー率の高い 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;
```

**Example キー別のアクセス試行の失敗**  

```
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;
```

**Example 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 サーバーアクセスログのクエリ
<a name="sal-cw-s3tables-ai-agents"></a>

MCP 互換 AI エージェントは、Amazon S3 サーバーアクセスログを含む S3 テーブルを検出し、SQL クエリを生成して、結果を分析できます。Amazon S3 サーバーアクセスログは `aws-cloudwatch` テーブルバケットの Iceberg テーブルとしてエクスポートされるため、エージェントは Amazon Athena、Amazon EMR、Amazon Redshift、または Iceberg 互換ツールで使用するのと同じ S3 Tables カタログを介してクエリを実行できます。

[Agent Toolkit for AWS](https://github.com/aws/agent-toolkit-for-aws) は、エージェントが AWS データを操作するための検証済み手順を提供するスキルを提供します。[CloudWatch Logs システムテーブルのクエリ](https://github.com/aws/agent-toolkit-for-aws/tree/main/skills/specialized-skills/system-table-skills/querying-aws-cloudwatch)のスキルでは、`aws-cloudwatch` テーブルバケット内の Amazon S3 サーバーアクセスログなど、S3 テーブルにエクスポートされた CloudWatch Logs データに対して SQL クエリを実行します。これを使用するには、GitHub のリポジトリからスキルをダウンロードし、エージェントのスキルディレクトリに追加します。

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