mcpField
Q
querying-aws-cloudwatch

querying-aws-cloudwatch

github.com/awsデータ・データベース3.3k5.6k 回インストール今日更新
リポジトリ

querying-aws-cloudwatch について

CloudWatch Logs を S3 Tables の Iceberg テーブルに出力し、Athena で分析する手順を案内するスキルです。ログの履歴分析や他テーブルとの照合を行うユーザー向けに、設定、権限、クエリ、セキュリティを扱います。

主な機能

  1. 01ログデータソースの関連付け
  2. 02Athena での SQL クエリ実行
  3. 03ログと他テーブルの結合
  4. 04スキーマと権限の確認
  5. 05連携とクエリのトラブル対応

活用シーン

  1. 01VPC Flow Logs や WAF ブロックの分析
  2. 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 Logsamazon_vpc__flowネットワークトラフィック分析、拒否された接続の調査
WAF Logsaws_waf__logsブロックされたリクエスト、ルールのヒット分析
CloudFront Access Logsamazon_cloudfront__accessCDN トラフィックの傾向、エラー率
Route 53 Resolver Query Logsamazon_route53resolver__queryDNS クエリ分析
Network Firewall Logsaws_networkfirewall__logsファイアウォールルールのヒット、破棄されたトラフィック
EKS Audit Logsamazon_eks__auditKubernetes API の監査証跡
Verified Access Logsamazon_verifiedaccess__logsゼロトラストのアクセス判断
SES Mail Logsamazon_ses__mailメールの配信/バウンス追跡
VPC Lattice Access Logsamazon_vpclattice__accessサービス間のアクセス傾向
Step Functions Logsaws_stepfunctions__logsワークフロー実行のデバッグ
Global Accelerator Flow Logsaws_globalaccelerator__flowグローバルネットワークトラフィック
NLB Access Logselastic_load_balancing__nlb_accessロードバランサーのリクエスト追跡
Shield Logsaws_shield__logsDDoS 緩和イベント
Cognito Logsamazon_cognito__logs認証/ID 操作
ElastiCache Logsamazon_elasticache__logsRedis のスローログ、エンジンログ
SageMaker Logsamazon_sagemaker__logsML のトレーニング/推論イベント
WorkMail Audit Logsamazon_workmail__auditメールのセキュリティ/コンプライアンス
Bedrock Agent Logsaws_bedrock_agent_core__logsAI エージェントの呼び出し
Client VPN Logsaws_client_vpn__connectionsVPN 接続の追跡
Entity Resolution Logsaws_entity_resolution__logsレコード照合操作
MediaPackage Access Logsaws_elemental_mediapackage__accessストリーミング配信メトリクス
MediaTailor Logsaws_elemental_mediatailor__logs広告挿入イベント
Transfer Family Logsaws_transfer_family__logsSFTP/FTPS ファイル転送の追跡
Site-to-Site VPN Logsaws_site_to_site_vpn__logsVPN トンネルの診断

注:この表には、最もよくクエリされる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 ログ記録を有効にし、誰がどのデータをクエリしたかの監査証跡を維持します。

追加リソース

コメント