CloudWatch Contributor InsightsによるDNSクエリのトップコントリビューター分析

目次

概要

VPC内のリソースがどのドメインにDNSクエリを送信しているかを把握することは、セキュリティ監視や異常検知において重要です。Route 53 Resolverクエリログを有効にすることでDNSクエリの記録は可能ですが、大量のログデータから「最も多くクエリされているドメインは何か」「どのEC2インスタンスが最も多くDNSクエリを発行しているか」といったパターンを即座に把握するのは容易ではありません。

この課題を解決するのが CloudWatch Contributor Insights です。Contributor Insightsは、CloudWatch Logsのログデータをリアルタイムで分析し、上位のコントリビューター(寄与者)を時系列のグラフで可視化する機能です。Route 53 Resolverクエリログと組み合わせることで、DNSアクティビティの傾向を素早く把握できます。

本記事では、Route 53 Resolverクエリログの送信先としてCloudWatch Logsを設定し、Contributor Insightsルールを作成してDNSクエリのトップコントリビューターを分析する手順を解説します。

Route 53 Resolverクエリログ → CloudWatch Logs → Contributor Insightsの分析フローを示す図解
Route 53 Resolverクエリログ → CloudWatch Logs → Contributor Insightsの分析フローを示す図解

この記事のメリット

  • CloudWatch Contributor Insightsの概念と用途を理解できる
  • Route 53 ResolverクエリログのJSON構造を把握し、分析に必要なキーフィールドを特定できる
  • Contributor Insightsルールの作成方法と、ログフォーマットに基づくキー指定の手順を習得できる
  • 「最もクエリされたドメイン」「最もDNSクエリを発行したインスタンス」をリアルタイムで可視化できる
  • SCS試験で「DNSクエリの分析方法」に関する問いに正確に答えられるようになる

執筆者とキャラクター紹介

執筆者:土肥(とひ)

株式会社ジェニュインの代表であり元エンジニア。これまでオンプレミスと AWS 環境のインフラ業務を担当。AWS 認定資格の学習で得た知識を、ハンズオンとともに解説するのが得意。直近では新人の教育も行っており、これから技術を学ぶ方が納得できる解説を心がけています。基礎編・Cloud Practitioner の記事では、解説役としても登場します。

土肥

クラウドおさる

クラウドおさる

はじめましてでござる。弊猿はクラウドおさる。IT インフラが異常に発達した猿山から、雲に乗って地上の AWS を学びに降りてきたのでござる。

クラウドおさる

基礎編や Cloud Practitioner の記事では、とひさんに素朴な疑問をぶつける役でござるな。Security - Specialty などの記事では、要所でワンポイントや注意点をひとこと添えるでござる。

クラウドおさる

猿山にもデータセンターや監視当番があって、地上で起きることはだいたい猿山にも同じ仕組みがあるのでござる。例え話がつい猿山に寄るのは、弊猿の癖でござる。

技術解説

CloudWatch Contributor Insightsとは

CloudWatch Contributor Insightsは、CloudWatch Logsのログデータを分析し、システムパフォーマンスに影響を与えている上位のコントリビューターを特定する機能です。ルールを定義することで、ログの特定のフィールドを集計キーとして指定し、上位N件のコントリビューターを時系列グラフで表示できます。

主な特徴は以下の通りです。

  • リアルタイム分析: ログデータが到着するたびに自動的に集計される
  • カスタムルール: 任意のログフィールドをキーとして指定できる
  • 時系列可視化: トップコントリビューターの推移をグラフで確認できる
  • アラーム連携: 特定のコントリビューターが閾値を超えた場合にCloudWatchアラームをトリガーできる

Route 53 Resolverクエリログの構造

Route 53 Resolverクエリログは、VPC内のリソースが行ったDNSクエリの詳細をJSON形式で記録します。Contributor Insightsで分析する際に重要なフィールドは以下の通りです。

フィールド説明分析での用途
query_nameクエリ対象のドメイン名最も多くクエリされたドメインの特定
srcaddrクエリ送信元のIPアドレス最も多くDNSクエリを発行したインスタンスの特定
query_typeクエリタイプ(A、AAAA、MXなど)クエリタイプ別の傾向分析
rcodeレスポンスコード(NOERROR、NXDOMAINなど)エラーの多いドメインの特定
srcids.instanceクエリ送信元のEC2インスタンスIDインスタンスID別の分析

以下は、Route 53 Resolverクエリログのレコード例です。

{
    "version": "1.100000",
    "account_id": "123456789012",
    "region": "ap-northeast-1",
    "vpc_id": "vpc-0abc1234def56789",
    "query_timestamp": "2026-03-22T10:00:00Z",
    "query_name": "example.com.",
    "query_type": "A",
    "query_class": "IN",
    "rcode": "NOERROR",
    "answers": [
        {
            "Rdata": "93.184.216.34",
            "Type": "A",
            "Class": "IN"
        }
    ],
    "srcaddr": "10.0.1.50",
    "srcport": "12345",
    "transport": "UDP",
    "srcids": {
        "instance": "i-0abc1234def56789"
    }
}

Contributor Insightsルールの仕組み

Contributor Insightsルールは、以下の要素で構成されます。

要素説明
ロググループ分析対象のCloudWatch Logsロググループ
ログフォーマットログの形式(JSON またはCLF)
コントリビューションのキー(Keys)集計に使用するフィールド(最大4つ)。この組み合わせが「寄稿者(コントリビューター)」になる
フィルター分析対象を絞り込む条件(オプション)
集計(AggregateOn)「カウント」=出現回数でランク付け/「合計」=指定したログフィールドの数値の合計でランク付け

Route 53 Resolverクエリログの場合、ログフォーマットは JSON を選択し、キーには query_name や srcaddr などのフィールドを指定します。

フリーランス案件
クラウドおさる
クラウドキャリアフリーランス

AWS の実務経験があるなら、単価を上げにいく

AWS に特化したフリーランスエージェントです。以下は取り扱い案件の一例です。設計・SRE・セキュリティ・生成 AI の領域で、専門を掛け合わせるほど単価が上がります。

横にスクロールできます。掲載時点の情報のため、募集が終了している場合があります。条件の近い案件をご紹介しますので、お気軽にご相談ください。

実践

ここでは、Route 53 ResolverクエリログをCloudWatch Logsに送信し、Contributor Insightsルールを作成してDNSクエリのトップコントリビューターを分析する手順を説明します。

前提条件

  • リージョン: ap-northeast-1(東京)
  • VPCが1つ存在し、EC2インスタンスが起動済みの状態を前提とします
  • Route 53 Resolverクエリログの基本的な設定手順については、別記事「Route 53 Resolverクエリログの有効化とDNSアクティビティ監視」を参照してください
リソース種別リソース名用途
CloudWatch Logsロググループ/aws/route53resolver/query-logsResolverクエリログの送信先
Route 53 Resolverクエリログ設定vpc-dns-query-logVPCのDNSクエリを記録
Contributor InsightsルールTopDNSQueries最もクエリされたドメインの分析
Contributor InsightsルールTopDNSClients最もDNSクエリを発行したインスタンスの分析

CloudWatch Logsロググループの作成

AWSマネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。

上部の検索バーに CloudWatch と入力し、表示された「CloudWatch」を選択します。

左側ナビゲーションの「ログ」→「ログ管理」を選択します。

「ロググループを作成」をクリックし、以下を入力します。

  • ロググループ名: /aws/route53resolver/query-logs
  • 保持期間の設定: 1 週間 (7 日)
ロググループ作成画面(ロググループ名と保持期間を入力した状態)
ロググループ作成画面(ロググループ名と保持期間を入力した状態)

「作成」をクリックします。

ロググループ一覧に /aws/route53resolver/query-logs が表示されることを確認します。

Route 53 Resolverクエリログの設定

Route 53 Resolverクエリログを設定し、先ほど作成したCloudWatch Logsロググループにログを送信します。

上部の検索バーに Route 53 と入力し、表示された「Route 53」を選択します。

左側ナビゲーションの「VPC リゾルバー」→「クエリのログ記録」を選択します。

「クエリログ記録の設定」をクリックし、以下を入力します。

  • 名前: vpc-dns-query-log
  • クエリログの送信先: 「CloudWatch Logs のロググループ」を選択(デフォルト。ほかに「S3 バケット」「Amazon Data Firehose 配信ストリーム」があります)
  • CloudWatch Logs ログのグループ: /aws/route53resolver/query-logs を選択
  • 「クエリをログ記録する VPC – オプション」で「VPC を追加」をクリックし、開いたダイアログで対象のVPCにチェックを入れて「追加」をクリック
クエリログ記録の設定画面(送信先にCloudWatch Logsロググループを選択した状態)
クエリログ記録の設定画面(送信先にCloudWatch Logsロググループを選択した状態)

「クエリログの設定」をクリックします。

ステータスが「作成済み」になることを確認します。

クエリログ設定の詳細画面(ステータスが「作成済み」の状態)
クエリログ設定の詳細画面(ステータスが「作成済み」の状態)

Note: クエリログが実際にCloudWatch Logsに到着するまで数分かかります。EC2インスタンスにSSH接続してDNSクエリを発生させると、ログの確認が早くなります。以下のコマンドでDNSクエリを発生させることができます。

>

“bash # 複数のドメインにDNSクエリを送信 nslookup example.com nslookup amazon.com nslookup google.com nslookup aws.amazon.com # 同じドメインに繰り返しクエリを送信(トップコントリビューター確認用) for i in $(seq 1 20); do nslookup example.com; done for i in $(seq 1 10); do nslookup amazon.com; done “

Contributor Insightsルールの作成(トップクエリドメイン)

CloudWatch Contributor Insightsルールを作成し、最もクエリされたドメインを分析します。

上部の検索バーに CloudWatch と入力し、表示された「CloudWatch」を選択します。

左側ナビゲーションの「インサイト」→「Contributor Insights」を選択します。

「ルールを作成」をクリックすると、3ステップのウィザードが開きます。

ステップ1: ルールの定義

  • 「ウィザード」タブが選択されていることを確認します(「構文」タブではルール定義のJSONを直接書けます)
  • 「ロググループを選択」の検索ボックスに /aws/route53resolver/query-logs と入力し、候補から選択します
  • ルールタイプ: 「カスタムルール」を選択します
  • ログの形式: 「JSON」を選択します
ステップ1のルール定義画面(ロググループとルールタイプを選択した状態)
ステップ1のルール定義画面(ロググループとルールタイプを選択した状態)
  • 「コントリビューション」セクションで「新しいキーを追加」をクリックし、キーに query_name を入力します
  • 「フィルター – オプション」は設定しません
  • 「集計」は「カウント」(デフォルト)のままにします
コントリビューションと集計の設定(キーに query_name を設定した状態)
コントリビューションと集計の設定(キーに query_name を設定した状態)

「次へ」をクリックします。

ステップ2: ルールの詳細を指定

  • ルール名: TopDNSQueries
  • ルールの状態: 「有効化」にチェックが入っていることを確認します

「次へ」をクリックします。

ステップ3: プレビューと作成

ルール定義の内容(ロググループ・ログの形式・フィールド $.query_name・集計)を確認し、「ルールを作成」をクリックします。

ルール一覧に TopDNSQueries が有効な状態で表示されることを確認します。データのレポートが表示されるまでに最大5分かかります。

Contributor Insightsルールの作成(トップDNSクライアント)

同様の手順で、最もDNSクエリを発行したクライアントIPを分析するルールを作成します。

Contributor Insights画面で「ルールを作成」をクリックし、ステップ1で以下を設定します。

  • ロググループ: /aws/route53resolver/query-logs
  • ルールタイプ: 「カスタムルール」
  • ログの形式: JSON
  • コントリビューションのキー: srcaddr
  • 集計: 「カウント」

ステップ2でルール名に TopDNSClients を入力し、ステップ3で「ルールを作成」をクリックします。

Contributor Insightsダッシュボードでの確認

ルール作成後、DNSクエリログが蓄積されると、Contributor Insightsダッシュボードにトップコントリビューターが表示されます。

Contributor Insights画面で TopDNSQueries ルールを選択します。

画面上部の「時間範囲」で 30分 を選択します(5分 / 30分 / 1時間 / 3時間 / 12時間 / カスタム から選べます)。

ダッシュボードには以下の情報が表示されます。

  • 時系列グラフ: 上位の寄稿者ごとのクエリ数の推移
  • ランキング表: $.query_name ごとの「データポイントの合計」(選択した期間内のクエリ数)

「寄稿者」「期間」「順序」「ウィジェットタイプ」のプルダウンで、表示する上位件数・集計間隔・並び順・グラフ種別を変更できます。

TopDNSQueries ルールのダッシュボード(トップコントリビューターと時系列グラフが表示された状態)
TopDNSQueries ルールのダッシュボード(トップコントリビューターと時系列グラフが表示された状態)

続いて、TopDNSClients ルールを選択して確認します。

送信元IPアドレス別のDNSクエリ数のランキングと推移が表示されます。特定のインスタンスが異常に多くのDNSクエリを発行している場合、マルウェア感染やDNSトンネリングの兆候として検知に活用できます。

TopDNSClients ルールのダッシュボード(送信元IPアドレスのランキングが表示された状態)
TopDNSClients ルールのダッシュボード(送信元IPアドレスのランキングが表示された状態)

ルール定義の確認(JSON構文)

作成したルールの定義は、JSON構文でも確認できます。ルール作成ウィザードのステップ1で「構文」タブに切り替えると、以下のようなJSON定義を直接編集できます。

{
    "Schema": {
        "Name": "CloudWatchLogRule",
        "Version": 1
    },
    "AggregateOn": "Count",
    "Contribution": {
        "Filters": [],
        "Keys": [
            "$.query_name"
        ]
    },
    "LogFormat": "JSON",
    "LogGroupARNs": [
        "arn:aws:logs:ap-northeast-1:<アカウントID>:log-group:/aws/route53resolver/query-logs"
    ]
}

キーは $.query_name のように JSON プロパティ形式($ 始まり)で指定します。ロググループの指定は LogGroupNames(ロググループ名)と LogGroupARNs(ARN)のどちらか一方だけを使用します。ウィザードで作成すると LogGroupARNs が使われます。

このJSON定義を直接編集してルールを作成することも可能です。たとえば、レスポンスコードが NXDOMAIN(ドメインが存在しない)のクエリだけを分析したい場合、Filters にフィルター条件を追加できます。

"Filters": [
    {
        "Match": "$.rcode",
        "EqualTo": "NXDOMAIN"
    }
]

この応用により、存在しないドメインへのクエリが多いインスタンスを検出し、マルウェアやDGAドメイン(Domain Generation Algorithm)による不審なDNSアクティビティの兆候を捉えることができます。

まとめ

  • CloudWatch Contributor Insights は、CloudWatch Logsのログデータから上位のコントリビューターをリアルタイムで可視化する機能である
  • Route 53 ResolverクエリログをCloudWatch Logsに送信することで、Contributor Insightsによる分析が可能になる
  • query_name をキーに指定することで、最も多くクエリされたドメインを特定できる
  • srcaddr をキーに指定することで、最も多くDNSクエリを発行したインスタンスを特定できる
  • フィルター条件を組み合わせることで、NXDOMAINレスポンスの分析など、セキュリティ監視に応用できる
  • 異常なDNSクエリパターンの検出は、マルウェア感染やDNSトンネリングの早期発見に有効である

参照先

フリーランス案件
クラウドおさる
クラウドキャリアフリーランス

AWS の実務経験があるなら、単価を上げにいく

AWS に特化したフリーランスエージェントです。以下は取り扱い案件の一例です。設計・SRE・セキュリティ・生成 AI の領域で、専門を掛け合わせるほど単価が上がります。

横にスクロールできます。掲載時点の情報のため、募集が終了している場合があります。条件の近い案件をご紹介しますので、お気軽にご相談ください。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社ジェニュイン(https://genuine-pt.jp)の代表取締役.

2018年〜インフラエンジニアとしてキャリアをスタートし、オンプレミスのネットワーク・サーバ環境で3年半、クラウド環境で4年半の8年間エンジニアとして従事。
2021年に佐藤氏の創業した株式会社Luxyを引き継ぎ、代表に就任。
その後アガルートグループ内の株式会社ジェニュインと合併。
合併後同社代表に就任。

目次