VPC フローログを CloudWatch Logs に記録し Logs Insights で通信を分析する
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 のデフォルトフォーマット(v2)は以下のフィールドを含みます。
version account-id interface-id srcaddr dstaddr srcport dstport protocol packets bytes start end action log-status
| フィールド | 説明 | 例 |
|---|---|---|
| srcaddr | 送信元 IP | 203.0.113.5 |
| dstaddr | 送信先 IP | 10.0.1.42 |
| srcport / dstport | ポート番号 | 443 / 80 |
| protocol | プロトコル番号 | 6=TCP, 17=UDP, 1=ICMP |
| action | ACCEPT / REJECT | REJECT |
| bytes | 転送バイト数 | 1024 |
作業リージョンを固定してください。このハンズオンでは ap-northeast-1(東京) を使用します。コンソール右上でリージョンを確認してください。
VPC Flow Logs が CloudWatch Logs にログを書き込むための IAM ロールを作成します。
AWS マネジメントコンソールで 「IAM」 を検索して開きます。左メニューから 「ロール」→「ロールを作成」 をクリックします。
「カスタム信頼ポリシー」を選択し、以下の JSON を入力します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "vpc-flow-logs.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
「次へ」をクリックします。
「許可ポリシー」画面で 「ポリシーの作成」 をクリックし、新しいタブでインラインポリシーを定義します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"logs:DescribeLogGroups",
"logs:DescribeLogStreams"
],
"Resource": "*"
}
]
}
ポリシー名に VPCFlowLogsPolicy と入力してポリシーを作成します。元のタブに戻り、作成したポリシーを選択して「次へ」をクリックします。
「ロールを作成」をクリックします。
IAM ロール一覧に VPCFlowLogsRole が表示されれば成功です。ロールの ARN をメモしておいてください(次のステップで使用します)。
対象 VPC にフローログを設定し、CloudWatch Logs へ送信します。
AWS マネジメントコンソールで 「VPC」 を検索して開きます。左メニューから 「お使いの VPC」 を選択します。
フローログを有効にしたい VPC を選択します(デフォルト VPC や既存の VPC どちらでも可)。「アクション」→「フローログを作成」 をクリックします。
| 設定項目 | 設定値 |
|---|---|
| フィルター | すべて(ACCEPT と REJECT 両方を記録) |
| 最大集計間隔 | 1 分 |
| 送信先 | CloudWatch Logs に送信 |
| 送信先ロググループ | /vpc/flow-logs/<your-vpc-id> |
| IAM ロール | VPCFlowLogsRole |
| ログレコード形式 | AWS のデフォルト形式 |
「フローログを作成」をクリックします。
「CloudWatch」→「ログ」→「ロググループ」 を開き、/vpc/flow-logs/<vpc-id> が作成されているか確認します。
ログが届くまで 1〜5 分 ほど待機が必要です。その間に次のステップでテスト通信を行います。
デフォルトは「10 分」ですが、今回は分析をすぐ確認できるよう「1 分」に設定します。1 分間隔は追加コストが発生しますが、テスト後はクリーンアップします。
フローログにデータが記録されるよう、VPC 内で通信を発生させます。
EC2 コンソールから対象インスタンスに Session Manager または EC2 Instance Connect で接続します。
外部への HTTP/HTTPS アクセスを行います(セキュリティグループで許可されている場合)。
curl -s https://checkip.amazonaws.com curl -s http://example.com ping -c 5 8.8.8.8セキュリティグループで許可されていないポートへのアクセスを試みて REJECT ログを生成します。別のターミナルから以下を実行します(EC2 のパブリック IP に対して)。
# 別の端末 / Cloud Shell から curl -m 3 http://<EC2-Public-IP>:8080 || true nc -zv <EC2-Public-IP> 3389 2>&1 || true自分のアカウント内のリソースに対するテストのみ行ってください。他者のリソースへのポートスキャンは不正アクセスにあたります。
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 フィールドに ACCEPT と REJECT の両方が確認できればテスト成功です。
Logs Insights を使って VPC 内のトラフィックパターンを可視化します。
CloudWatch コンソール左メニューから 「ログ」→「Logs Insights」 を開きます。ロググループとして /vpc/flow-logs/<vpc-id> を選択します。
fields @timestamp, srcaddr, dstaddr, dstport, protocol, action, bytes | filter action = "REJECT" | sort @timestamp desc | limit 50
fields srcaddr | filter action = "ACCEPT" | stats count() as request_count by srcaddr | sort request_count desc | limit 20
fields dstport, bytes | filter action = "ACCEPT" | stats sum(bytes) as total_bytes by dstport | sort total_bytes desc | limit 10
fields @timestamp, action | filter action = "REJECT" | stats count() as reject_count by bin(5m) | sort @timestamp asc
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
| 番号 | プロトコル | 用途 |
|---|---|---|
| 1 | ICMP | ping など |
| 6 | TCP | HTTP/HTTPS/SSH など |
| 17 | UDP | DNS/NTP など |
クエリを入力し、時間範囲を「過去 30 分」または「カスタム(テスト実施時刻を含む範囲)」に設定して「クエリの実行」をクリックします。
結果タブで表形式の集計が確認でき、「可視化」タブで時系列グラフを表示できます。
REJECT クエリにステップ 3 で発生させた拒否通信が表示されれば成功です。
REJECT トラフィックの数をカウントするメトリクスフィルターを作成し、CloudWatch メトリクスとして可視化します。
CloudWatch コンソールで 「ロログ」→「ロググループ」→ フローログのグループ を開きます。「メトリクスフィルター」タブ→「メトリクスフィルターを作成」 をクリックします。
フィルターパターンに以下を入力します。
[version, account, eni, source, destination, srcport, destport, protocol, packets, bytes, windowstart, windowend, action="REJECT", log_status]
「パターンのテスト」をクリックし、ステップ 3 で記録されたサンプルデータでテストします。REJECT ログが一致すれば「次へ」をクリックします。
「次へ」→「メトリクスフィルターを作成」をクリックします。
メトリクスフィルター一覧に VPC-Reject-Traffic が表示されれば成功です。数分後に CloudWatch メトリクスの VPCFlowLogs/RejectCount にデータが反映されます。
REJECT トラフィックが急増した場合に通知するアラームを設定します。
CloudWatch コンソール左メニューから 「アラーム」→「アラームを作成」 をクリックします。
「メトリクスの選択」をクリックし、「VPCFlowLogs」→「RejectCount」 を選択して「メトリクスの選択」をクリックします。
| 設定項目 | 設定値 |
|---|---|
| 統計 | 合計(Sum) |
| 期間 | 5 分 |
| 閾値タイプ | 静的 |
| 条件 | より大きい (>) |
| 閾値 | 10 |
「次へ」をクリックします。
SNS トピックを新規作成して通知先メールアドレスを設定するか、「通知の削除」でスキップできます。
SNS を設定した場合は確認メールのリンクをクリックしてサブスクリプションを有効化してください。
「アラームを作成」をクリックします。
アラーム一覧に VPC-High-Reject-Traffic が表示され、状態が「データ不足」または「OK」になっていれば設定完了です。
CloudWatch ダッシュボードに RejectCount メトリクスのグラフを追加すると、REJECT トラフィックの推移を一目で把握できます。「ダッシュボード」→「ダッシュボードを作成」→「ウィジェットを追加」→「メトリクス」 から追加できます。
VPC Flow Logs の保存コスト(CloudWatch Logs への書き込み・保管)や SNS 通知コストが発生します。
VPC-High-Reject-Traffic を選択 → 「アクション」→「削除」
vpc-flow-logs-alert を削除
VPC-Reject-Traffic を削除
/vpc/flow-logs/<vpc-id> を選択 → 「アクション」→「ロググループの削除」
VPCFlowLogsRole を削除VPCFlowLogsPolicy を削除
/vpc/flow-logs/<vpc-id> が消えたVPC-High-Reject-Traffic が消えた| 習得したスキル | 実践内容 |
|---|---|
| VPC Flow Logs の有効化 | IAM ロール作成 → フローログ設定 → CloudWatch Logs 送信 |
| ネットワーク通信の可視化 | ACCEPT / REJECT トラフィックの記録・確認 |
| Logs Insights 分析 | 6 種類のクエリで通信パターン・Top IP・時系列を集計 |
| メトリクスフィルター | REJECT パターンをメトリクスとして抽出 |
| 自動アラーム通知 | 閾値超過で SNS メール通知 |