VPC Flow Logs ハンズオン

VPC フローログを CloudWatch Logs に記録し Logs Insights で通信を分析する

VPC Flow Logs CloudWatch Logs Logs Insights メトリクスフィルター マネコン操作 所要時間 60〜75 分 v1.0

📋 概要

VPC Flow Logs は VPC 内のネットワークインターフェイスを通過する IP トラフィックを記録する機能です。このハンズオンでは VPC フローログを CloudWatch Logs に送信し、Logs Insights で通信パターンを分析、さらにメトリクスフィルターで拒否トラフィックをモニタリングします。

項目内容
対象サービスVPC Flow Logs、CloudWatch Logs、CloudWatch Logs Insights、CloudWatch Alarms
主な学習内容フローログの有効化・ロールの作成・Logs Insights クエリ・メトリクスフィルター
所要時間60〜75 分(待機時間含む)
難易度★★☆☆☆(初〜中級者向け)
前提知識VPC・セキュリティグループの基礎知識
費用目安約 0〜1 USD(無料枠内で完結可能)
ℹ️ VPC Flow Logs の主なユースケース
  • セキュリティグループ / NACL のルール検証
  • 不審な通信(ポートスキャン・DDoS)の検知
  • ネットワーク障害のトラブルシューティング
  • コンプライアンス要件でのアクセスログ保管

🏗️ アーキテクチャ

🌐 インターネット / 他 EC2 インスタンス
テスト通信元(curl / ping)
↓ ネットワークトラフィック
☁️ VPC (ENI を通過するすべてのトラフィック)
VPC Flow Logs が記録
↓ フローログ送信(IAM ロール経由)
📋 CloudWatch Logs
ロググループ: /vpc/flow-logs/<vpc-id>
↓ クエリ分析
🔍 CloudWatch Logs Insights
通信量・拒否トラフィック・Top IP など
↓ メトリクスフィルター
🔔 CloudWatch Alarms → SNS 通知
REJECT 数が閾値超過で通知

フローログのフィールド構造

VPC Flow Logs のデフォルトフォーマット(v2)は以下のフィールドを含みます。

version account-id interface-id srcaddr dstaddr srcport dstport protocol packets bytes start end action log-status
ℹ️ 重要フィールド
フィールド説明
srcaddr送信元 IP203.0.113.5
dstaddr送信先 IP10.0.1.42
srcport / dstportポート番号443 / 80
protocolプロトコル番号6=TCP, 17=UDP, 1=ICMP
actionACCEPT / REJECTREJECT
bytes転送バイト数1024

✅ 前提条件

⚠️ リージョン確認

作業リージョンを固定してください。このハンズオンでは ap-northeast-1(東京) を使用します。コンソール右上でリージョンを確認してください。

🔐 ステップ 1 ― Flow Logs 用 IAM ロールの作成

VPC Flow Logs が CloudWatch Logs にログを書き込むための IAM ロールを作成します。

1-1. IAM コンソールを開く

AWS マネジメントコンソールで 「IAM」 を検索して開きます。左メニューから 「ロール」→「ロールを作成」 をクリックします。

1-2. 信頼ポリシーの設定

「カスタム信頼ポリシー」を選択し、以下の JSON を入力します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "vpc-flow-logs.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

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

1-3. 許可ポリシーのアタッチ

「許可ポリシー」画面で 「ポリシーの作成」 をクリックし、新しいタブでインラインポリシーを定義します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogGroups",
        "logs:DescribeLogStreams"
      ],
      "Resource": "*"
    }
  ]
}

ポリシー名に VPCFlowLogsPolicy と入力してポリシーを作成します。元のタブに戻り、作成したポリシーを選択して「次へ」をクリックします。

1-4. ロール名を設定して作成
ロール名VPCFlowLogsRole
説明Role for VPC Flow Logs to write to CloudWatch Logs

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

✅ 確認ポイント

IAM ロール一覧に VPCFlowLogsRole が表示されれば成功です。ロールの ARN をメモしておいてください(次のステップで使用します)。

🌊 ステップ 2 ― VPC Flow Logs を有効化する

対象 VPC にフローログを設定し、CloudWatch Logs へ送信します。

2-1. VPC コンソールを開く

AWS マネジメントコンソールで 「VPC」 を検索して開きます。左メニューから 「お使いの VPC」 を選択します。

2-2. 対象 VPC を選択

フローログを有効にしたい VPC を選択します(デフォルト VPC や既存の VPC どちらでも可)。「アクション」→「フローログを作成」 をクリックします。

2-3. フローログの設定
設定項目設定値
フィルターすべて(ACCEPT と REJECT 両方を記録)
最大集計間隔1 分
送信先CloudWatch Logs に送信
送信先ロググループ/vpc/flow-logs/<your-vpc-id>
IAM ロールVPCFlowLogsRole
ログレコード形式AWS のデフォルト形式

「フローログを作成」をクリックします。

2-4. ロググループを確認

「CloudWatch」→「ログ」→「ロググループ」 を開き、/vpc/flow-logs/<vpc-id> が作成されているか確認します。

ログが届くまで 1〜5 分 ほど待機が必要です。その間に次のステップでテスト通信を行います。

ℹ️ 最大集計間隔について

デフォルトは「10 分」ですが、今回は分析をすぐ確認できるよう「1 分」に設定します。1 分間隔は追加コストが発生しますが、テスト後はクリーンアップします。

🔬 ステップ 3 ― テスト通信の実施

フローログにデータが記録されるよう、VPC 内で通信を発生させます。

3-1. EC2 インスタンスに接続

EC2 コンソールから対象インスタンスに Session Manager または EC2 Instance Connect で接続します。

3-2. ACCEPT されるトラフィックを発生させる

外部への HTTP/HTTPS アクセスを行います(セキュリティグループで許可されている場合)。

curl -s https://checkip.amazonaws.com curl -s http://example.com ping -c 5 8.8.8.8
3-3. REJECT されるトラフィックを発生させる

セキュリティグループで許可されていないポートへのアクセスを試みて REJECT ログを生成します。別のターミナルから以下を実行します(EC2 のパブリック IP に対して)。

# 別の端末 / Cloud Shell から curl -m 3 http://<EC2-Public-IP>:8080 || true nc -zv <EC2-Public-IP> 3389 2>&1 || true
⚠️ 注意

自分のアカウント内のリソースに対するテストのみ行ってください。他者のリソースへのポートスキャンは不正アクセスにあたります。

3-4. CloudWatch Logs でログを確認

CloudWatch コンソールで 「ロログ」→「ロググループ」→ フローログのグループ を開きます。ログストリームを選択し、フローログのレコードが記録されていることを確認します。

2 123456789012 eni-0a1b2c3d4e 203.0.113.5 10.0.1.42 12345 80 6 10 2048 1700000000 1700000060 ACCEPT OK
2 123456789012 eni-0a1b2c3d4e 203.0.113.8 10.0.1.42 54321 8080 6 1 40 1700000010 1700000070 REJECT OK
✅ 確認ポイント

action フィールドに ACCEPTREJECT の両方が確認できればテスト成功です。

🔍 ステップ 4 ― CloudWatch Logs Insights で通信を分析する

Logs Insights を使って VPC 内のトラフィックパターンを可視化します。

4-1. Logs Insights を開く

CloudWatch コンソール左メニューから 「ログ」→「Logs Insights」 を開きます。ロググループとして /vpc/flow-logs/<vpc-id> を選択します。

クエリ例

① REJECT されたトラフィックを確認する

fields @timestamp, srcaddr, dstaddr, dstport, protocol, action, bytes
| filter action = "REJECT"
| sort @timestamp desc
| limit 50

② 送信元 IP のアクセス頻度ランキング

fields srcaddr
| filter action = "ACCEPT"
| stats count() as request_count by srcaddr
| sort request_count desc
| limit 20

③ ポート別トラフィック量(上位 10 件)

fields dstport, bytes
| filter action = "ACCEPT"
| stats sum(bytes) as total_bytes by dstport
| sort total_bytes desc
| limit 10

④ 5 分ごとの REJECT 数推移(時系列グラフ用)

fields @timestamp, action
| filter action = "REJECT"
| stats count() as reject_count by bin(5m)
| sort @timestamp asc

⑤ 大量通信を行っている IP を特定する

fields srcaddr, bytes, packets
| stats sum(bytes) as total_bytes, sum(packets) as total_packets by srcaddr
| sort total_bytes desc
| limit 10

⑥ プロトコル別通信量

fields protocol, bytes
| stats sum(bytes) as total_bytes by protocol
| sort total_bytes desc
ℹ️ プロトコル番号の対応表
番号プロトコル用途
1ICMPping など
6TCPHTTP/HTTPS/SSH など
17UDPDNS/NTP など
4-2. クエリを実行して結果を確認

クエリを入力し、時間範囲を「過去 30 分」または「カスタム(テスト実施時刻を含む範囲)」に設定して「クエリの実行」をクリックします。

結果タブで表形式の集計が確認でき、「可視化」タブで時系列グラフを表示できます。

✅ 確認ポイント

REJECT クエリにステップ 3 で発生させた拒否通信が表示されれば成功です。

📊 ステップ 5 ― メトリクスフィルターの作成

REJECT トラフィックの数をカウントするメトリクスフィルターを作成し、CloudWatch メトリクスとして可視化します。

5-1. メトリクスフィルターを作成する

CloudWatch コンソールで 「ロログ」→「ロググループ」→ フローログのグループ を開きます。「メトリクスフィルター」タブ→「メトリクスフィルターを作成」 をクリックします。

5-2. フィルターパターンを設定

フィルターパターンに以下を入力します。

[version, account, eni, source, destination, srcport, destport, protocol, packets, bytes, windowstart, windowend, action="REJECT", log_status]

「パターンのテスト」をクリックし、ステップ 3 で記録されたサンプルデータでテストします。REJECT ログが一致すれば「次へ」をクリックします。

5-3. メトリクスの詳細を設定
フィルター名VPC-Reject-Traffic
メトリクス名前空間VPCFlowLogs
メトリクス名RejectCount
メトリクス値1
単位Count

「次へ」→「メトリクスフィルターを作成」をクリックします。

✅ 確認ポイント

メトリクスフィルター一覧に VPC-Reject-Traffic が表示されれば成功です。数分後に CloudWatch メトリクスの VPCFlowLogs/RejectCount にデータが反映されます。

🔔 ステップ 6 ― CloudWatch アラームの設定

REJECT トラフィックが急増した場合に通知するアラームを設定します。

6-1. アラームを作成する

CloudWatch コンソール左メニューから 「アラーム」→「アラームを作成」 をクリックします。

6-2. メトリクスを選択

「メトリクスの選択」をクリックし、「VPCFlowLogs」→「RejectCount」 を選択して「メトリクスの選択」をクリックします。

設定項目設定値
統計合計(Sum)
期間5 分
閾値タイプ静的
条件より大きい (>)
閾値10

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

6-3. 通知の設定(オプション)

SNS トピックを新規作成して通知先メールアドレスを設定するか、「通知の削除」でスキップできます。

SNS トピック名vpc-flow-logs-alert
メールアドレスyour-email@example.com

SNS を設定した場合は確認メールのリンクをクリックしてサブスクリプションを有効化してください。

6-4. アラーム名を設定して作成
アラーム名VPC-High-Reject-Traffic
説明VPC Flow Logs の REJECT 数が 5 分間で 10 件超過

「アラームを作成」をクリックします。

✅ 確認ポイント

アラーム一覧に VPC-High-Reject-Traffic が表示され、状態が「データ不足」または「OK」になっていれば設定完了です。

ℹ️ ダッシュボードへの追加

CloudWatch ダッシュボードに RejectCount メトリクスのグラフを追加すると、REJECT トラフィックの推移を一目で把握できます。「ダッシュボード」→「ダッシュボードを作成」→「ウィジェットを追加」→「メトリクス」 から追加できます。

🧹 クリーンアップ

⚠️ 課金防止のためクリーンアップを必ず実施してください

VPC Flow Logs の保存コスト(CloudWatch Logs への書き込み・保管)や SNS 通知コストが発生します。

削除手順(逆順で実施)

  1. CloudWatch アラームを削除
    CloudWatch → アラーム → VPC-High-Reject-Traffic を選択 → 「アクション」→「削除」
  2. SNS サブスクリプション・トピックを削除(設定した場合)
    SNS → サブスクリプション → 対象を削除 → トピック → vpc-flow-logs-alert を削除
  3. メトリクスフィルターを削除
    CloudWatch → ロログ → ロググループ → フローログのグループ → メトリクスフィルタータブ → VPC-Reject-Traffic を削除
  4. VPC フローログを無効化
    VPC コンソール → お使いの VPC → 対象 VPC → フローログタブ → フローログを選択 → 「アクション」→「フローログの削除」
  5. CloudWatch ロググループを削除
    CloudWatch → ロログ → ロググループ → /vpc/flow-logs/<vpc-id> を選択 → 「アクション」→「ロググループの削除」
  6. IAM ロールとポリシーを削除
    IAM → ロール → VPCFlowLogsRole を削除
    IAM → ポリシー → VPCFlowLogsPolicy を削除
✅ クリーンアップ完了の確認
  • VPC コンソール → フローログタブに表示がなくなった
  • CloudWatch → ロログ → /vpc/flow-logs/<vpc-id> が消えた
  • CloudWatch → アラーム一覧に VPC-High-Reject-Traffic が消えた

学習のまとめ

習得したスキル実践内容
VPC Flow Logs の有効化IAM ロール作成 → フローログ設定 → CloudWatch Logs 送信
ネットワーク通信の可視化ACCEPT / REJECT トラフィックの記録・確認
Logs Insights 分析6 種類のクエリで通信パターン・Top IP・時系列を集計
メトリクスフィルターREJECT パターンをメトリクスとして抽出
自動アラーム通知閾値超過で SNS メール通知