querying-aws-cloudwatch について
CloudWatch Logs を S3 Tables の Iceberg テーブルに出力し、Athena で分析する手順を案内するスキルです。ログの履歴分析や他テーブルとの照合を行うユーザー向けに、設定、権限、クエリ、セキュリティを扱います。
主な機能
- 01ログデータソースの関連付け
- 02Athena での SQL クエリ実行
- 03ログと他テーブルの結合
- 04スキーマと権限の確認
- 05連携とクエリのトラブル対応
活用シーン
- 01VPC Flow Logs や WAF ブロックの分析
- 02ログと S3 メタデータの照合
MCP 対応
隔離実行と監査ログのため、AWS MCP server との併用を推奨しています。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ aws/ agent-toolkit-for-aws --skill querying-aws-cloudwatchインストール後、Claude Code で/querying-aws-cloudwatchを入力して読み込まれたか確認します。
詳細
AWS CloudWatch システムテーブルのクエリ
概要
サンドボックス化された実行と監査ログには、AWS MCP サーバーが最適です。 以下のすべてのコマンドでは AWS CLI を使用しており、AWS 認証情報が設定されている環境であればどこでも動作します。
CloudWatch Logs S3 Tables 統合では、ログデータを AWS 管理の aws-cloudwatch テーブルバケットに Apache Iceberg テーブルとしてエクスポートします。これにより、Amazon Athena を介した SQL 分析や、ログデータと CloudWatch 以外のデータ(S3 メタデータ、ビジネステーブルなど)との相関分析が可能になります。CloudWatch の取り込み料金以外に、追加のストレージ料金はかかりません。
判断ツリー
| ユーザーの目的 | このスキルを使いますか? | 代替手段 |
|---|---|---|
| 大量のログデータに対して SQL を実行する | はい | — |
| ログを S3 メタデータや他のテーブルと関連付ける | はい — カタログ間で結合します | — |
| ログをすばやく検索する/パターンに一致するログを検索する | いいえ | CloudWatch Logs Insights(アドホックな検索により高速) |
| リアルタイムでログをストリーミングする/末尾を追跡する | いいえ | CloudWatch Logs コンソールまたは logs filter-log-events |
| ログパターンに対するアラームを設定する | いいえ | CloudWatch Metric Filters / Alarms |
| 統合を有効にする前の過去のログをクエリする | いいえ | CloudWatch Logs(S3 Tables にはバックフィルがありません) |
対応データソース
以下のデータソースを S3 Tables 統合で利用できます。各データソースには、SQL クエリで使用する名前空間パターンがあります。AWS が提供するすべてのデータソースをすべてのリージョンで利用できるとは限りません。最新の提供状況は、CloudWatch コンソールの Data Sources タブで確認してください。
| データソース | 名前空間パターン | 主な用途 |
|---|---|---|
| VPC Flow Logs | amazon_vpc__flow | ネットワークトラフィック分析、拒否された接続の調査 |
| WAF Logs | aws_waf__logs | ブロックされたリクエスト、ルールのヒット分析 |
| CloudFront Access Logs | amazon_cloudfront__access | CDN トラフィックの傾向、エラー率 |
| Route 53 Resolver Query Logs | amazon_route53resolver__query | DNS クエリ分析 |
| Network Firewall Logs | aws_networkfirewall__logs | ファイアウォールルールのヒット、破棄されたトラフィック |
| EKS Audit Logs | amazon_eks__audit | Kubernetes API の監査証跡 |
| Verified Access Logs | amazon_verifiedaccess__logs | ゼロトラストのアクセス判断 |
| SES Mail Logs | amazon_ses__mail | メールの配信/バウンス追跡 |
| VPC Lattice Access Logs | amazon_vpclattice__access | サービス間のアクセス傾向 |
| Step Functions Logs | aws_stepfunctions__logs | ワークフロー実行のデバッグ |
| Global Accelerator Flow Logs | aws_globalaccelerator__flow | グローバルネットワークトラフィック |
| NLB Access Logs | elastic_load_balancing__nlb_access | ロードバランサーのリクエスト追跡 |
| Shield Logs | aws_shield__logs | DDoS 緩和イベント |
| Cognito Logs | amazon_cognito__logs | 認証/ID 操作 |
| ElastiCache Logs | amazon_elasticache__logs | Redis のスローログ、エンジンログ |
| SageMaker Logs | amazon_sagemaker__logs | ML のトレーニング/推論イベント |
| WorkMail Audit Logs | amazon_workmail__audit | メールのセキュリティ/コンプライアンス |
| Bedrock Agent Logs | aws_bedrock_agent_core__logs | AI エージェントの呼び出し |
| Client VPN Logs | aws_client_vpn__connections | VPN 接続の追跡 |
| Entity Resolution Logs | aws_entity_resolution__logs | レコード照合操作 |
| MediaPackage Access Logs | aws_elemental_mediapackage__access | ストリーミング配信メトリクス |
| MediaTailor Logs | aws_elemental_mediatailor__logs | 広告挿入イベント |
| Transfer Family Logs | aws_transfer_family__logs | SFTP/FTPS ファイル転送の追跡 |
| Site-to-Site VPN Logs | aws_site_to_site_vpn__logs | VPN トンネルの診断 |
注:この表には、最もよくクエリされる24種類のデータソースを記載しています。この統合では、AWS が提供する合計43種類以上のデータソースに対応しています。
aws-cloudwatchバケットでlist-namespacesを使用すると、アカウントで利用可能なすべてのデータソースを確認できます。名前空間パターンは<service>__<type>の規則に従います。
一般的なタスク
1. 設定済みかどうかを確認する
# Check if the aws-cloudwatch table bucket exists
aws s3tables list-table-buckets --region <REGION> \
--query "tableBuckets[?name=='aws-cloudwatch']"
- 結果が空 → インテグレーションは有効になっていません。セットアップを案内してください。
- バケットは存在するが名前空間がない → インテグレーションは有効ですが、まだログデータがありません(関連付け後のイベントのみをキャプチャします)。
利用可能なテーブルを一覧表示します。
aws s3tables list-namespaces --table-bucket-arn arn:aws:s3tables:<REGION>:<ACCOUNT>:bucket/aws-cloudwatch --region <REGION>
aws s3tables list-tables --table-bucket-arn arn:aws:s3tables:<REGION>:<ACCOUNT>:bucket/aws-cloudwatch --namespace <NAMESPACE> --region <REGION>
2. 有効化/設定する
インテグレーションを作成します:
aws observabilityadmin create-s3-table-integration \
--region <REGION> \
--encryption '{"SseAlgorithm": "aws:kms", "KmsKeyArn": "<KMS_KEY_ARN>"}' \
--role-arn <SERVICE_ROLE_ARN>
特定のデータソースを関連付けます(推奨):
aws logs associate-source-to-s3-table-integration \
--region <REGION> \
--integration-arn <INTEGRATION_ARN> \
--data-source '{"name": "<source-name>", "type": "<source-type>"}'
すべてのデータソースを関連付けます(ワイルドカード):
⚠️ 警告:ワイルドカードによる関連付けでは、現在および将来のすべてのデータソースが S3 Tables に配信されます。クエリ可能なテーブルに取り込むログデータをより厳密に管理するには、個別に関連付けてください。
aws logs associate-source-to-s3-table-integration \
--region <REGION> \
--integration-arn <INTEGRATION_ARN> \
--data-source '{"name": "*", "type": "*"}'
IAM の要件(サービスロールの信頼ポリシー、権限ポリシー、条件キー)については、以下のセキュリティに関する考慮事項を参照してください。
3. クエリに必要な権限を確認する
以下が必要です。
- Glue に登録された S3 Tables フェデレーテッドカタログ(
s3tablescatalog) - テーブルに対する Lake Formation の SELECT および DESCRIBE 権限(または、対応リージョンでの IAM のみのモード)
- Athena の実行権限
アクセス権を付与します。
aws lakeformation grant-permissions \
--principal DataLakePrincipalIdentifier=<ROLE_ARN> \
--resource '{"Table": {"CatalogId": "<ACCOUNT>:s3tablescatalog/aws-cloudwatch", "DatabaseName": "<NAMESPACE>", "Name": "<TABLE>"}}' \
--permissions DESCRIBE SELECT \
--region <REGION>
4. クエリを実行する
クエリの構文:
"s3tablescatalog/aws-cloudwatch"."<namespace>"."<table>"
制約事項:
-
SQL クエリを作成する前に、対象の名前空間で必ず
get-tablesを実行し、そのコマンドを回答に含めてください。スキーマはデータソースによって異なります。想定されるスキーマをすでに把握している場合でも、この手順を省略しないでください。対象の名前空間でget-tablesを一度実行してください(1 回の呼び出しですべてのテーブル、列、型、説明が返されます)。aws glue get-tables --catalog-id "<ACCOUNT>:s3tablescatalog/aws-cloudwatch" --database-name "<namespace>" --region <REGION> -
実行前にワークグループと出力先を必ず確認してください。
-
関連付け後に受信したログのみが利用可能であり、バックフィルは行われないことを必ずユーザーに伝えてください。
例 — VPC Flow Logs の拒否されたトラフィック:
SELECT srcaddr, dstaddr, dstport, protocol, packets, bytes
FROM "s3tablescatalog/aws-cloudwatch"."amazon_vpc__flow"."<table>"
WHERE action = 'REJECT'
ORDER BY bytes DESC
LIMIT 50;
例 — WAF のブロックされたリクエスト:
SELECT timestamp, action, terminatingRuleId, httpSourceId
FROM "s3tablescatalog/aws-cloudwatch"."aws_waf__logs"."<table>"
WHERE action = 'BLOCK'
ORDER BY timestamp DESC
LIMIT 50;
例 — VPC Flow Logs と S3 オブジェクトのメタデータの関連付け:
SELECT f.srcaddr, f.dstaddr, f.bytes, j.key, j.record_type
FROM "s3tablescatalog/aws-cloudwatch"."amazon_vpc__flow"."<table>" f
JOIN "s3tablescatalog/aws-s3"."b_<bucket>"."journal" j
ON f.srcaddr = j.source_ip_address
WHERE j.record_type = 'CREATE'
AND f.action = 'ACCEPT';
主な動作
- バックフィルなし — S3 Tables に配信されるのは、関連付け後の新しいログイベントのみです。
- 保持期間はロググループに従います — ロググループの保持期間が過ぎると、データはテーブルから削除されます。
- ロググループを削除すると、そのデータは S3 テーブルから削除されます。
- 追加のストレージ料金なし — CloudWatch の料金に含まれています。
- スキーマはデータソースごとに異なります — 複雑なクエリを作成する前に、対象の名前空間で必ず
get-tablesを実行してください。
トラブルシューティング
| エラー | 原因 | 対処方法 |
|---|---|---|
aws-cloudwatch バケットが見つからない | インテグレーションが作成されていない | create-s3-table-integration を実行します |
| バケットは存在するが名前空間がない | データソースが関連付けられていない、または関連付け後にログトラフィックがない | ソースを関連付けて、トラフィックを発生させます |
Athena で CATALOG_NOT_FOUND が発生する | S3 Tables が Glue に登録されていない | インテグレーションを有効にします:S3 コンソール > テーブルバケット > インテグレーションを有効化 |
クエリで AccessDenied が発生する | Lake Formation の権限付与または IAM 権限が不足している | 以下の「セキュリティに関する考慮事項」を参照してください |
| 結果が空 | ログが流れるのは関連付け後のみで、バックフィルは行われない | 関連付けが存在し、ログソースがデータを生成中であることを確認します |
| スキーマの不一致/列が見つからない | AWS によってログタイプのスキーマが更新された | 名前空間で get-tables を実行し、最新の列を取得します |
セキュリティに関する考慮事項
サービスロールの信頼ポリシー
サービスロールでは、logs.amazonaws.com にロールの引き受けを許可する必要があります。混乱した代理人攻撃を防ぐため、条件キーに aws:SourceAccount と aws:SourceArn を必ず含めてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "logs.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "<ACCOUNT>"
},
"ArnLike": {
"aws:SourceArn": ["arn:aws:logs:<REGION>:<ACCOUNT>:log-group:<LOG_GROUP_NAME>"]
}
}
}
]
}
サービスロールの権限ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["logs:integrateWithS3Table"],
"Resource": ["arn:aws:logs:<REGION>:<ACCOUNT>:log-group:<LOG_GROUP_NAME>"],
"Condition": {
"StringEquals": {
"aws:ResourceAccount": "<ACCOUNT>"
}
}
}
]
}
KMS キーポリシー(暗号化データの場合)
カスタマーマネージド KMS キーを使用する場合は、両方のサービスプリンシパルにアクセス権を付与してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EnableSystemTablesKeyUsage",
"Effect": "Allow",
"Principal": {"Service": "systemtables.cloudwatch.amazonaws.com"},
"Action": ["kms:DescribeKey", "kms:GenerateDataKey", "kms:Decrypt"],
"Resource": "arn:aws:kms:<REGION>:<ACCOUNT>:key/<KEY_ID>",
"Condition": {"StringEquals": {"aws:SourceAccount": "<ACCOUNT>"}}
},
{
"Sid": "EnableS3TablesMaintenanceKeyUsage",
"Effect": "Allow",
"Principal": {"Service": "maintenance.s3tables.amazonaws.com"},
"Action": ["kms:GenerateDataKey", "kms:Decrypt"],
"Resource": "arn:aws:kms:<REGION>:<ACCOUNT>:key/<KEY_ID>",
"Condition": {"StringLike": {"kms:EncryptionContext:aws:s3:arn": "<TABLE_OR_TABLE_BUCKET_ARN>/*"}}
}
]
}
データの機密性
ログデータには、IP アドレス、ユーザーエージェント、リクエストパラメーター、認証トークンなどの PII が含まれる場合があります。エクスポートされたログテーブルはすべて、デフォルトで機密情報として扱ってください。
アクセス制御のベストプラクティス
- Lake Formation の列レベルのセキュリティを使用して、機密性の高い列 (例:
srcaddr、source_ip_address、httpRequest) へのアクセスを制限します。ワイルドカードではなく、特定のテーブルと列に権限を付与してください。 - Athena ワークグループの出力バケットで SSE-KMS 暗号化を設定し、保存時のクエリ結果を保護します。
- ワイルドカード (
*/*) ではなく特定のデータソースの関連付けを優先し、クエリ可能なテーブルにエクスポートされるデータソースを制限します。
監査証跡
Athena (StartQueryExecution、GetQueryResults) および Lake Formation (GrantPermissions、RevokePermissions) の API 呼び出しに対して CloudTrail ログ記録を有効にし、誰がどのデータをクエリしたかの監査証跡を維持します。