本記事は、「2025 Japan AWS Jr. Champions夏のQiitaリレー🌻」
46日目の記事となります!
これまでの投稿は、以下のリンクにまとめられているので、
ぜひ他の記事も読んでいただければと思います
https://qiita.com/natsumi_a/items/80539843482fed4cd648
1.背景
オンプレミス環境からAWSへクラウド移行したとき、
トラフィックレポート、クラウドではどうやって作成するの?
という壁にぶつかりました。
そこで今回は、VPC Flow Logsを使ってトラフィックログを取得し、
Athenaで分析する方法を試してみました!
ログはS3に保存し、Athenaでクエリ分析をすることで、
通信の傾向を簡単にチェックし、トラフィックの可視化に繋がります。
この記事では、こんな方におすすめです:
- オンプレミスからAWSへのシステム移行を検討している方
- VPC Flow Logsを使ってみたいけど、どう始めればいいか迷っている方
- Athenaでのログ分析に興味がある方
2.使うAWSサービスはこの3つだけ!
今回の構成はとってもシンプル。使うのはこの3つだけです:
🧩 VPC Flow Logs
VPC内の通信(IP、ポート、プロトコルなど)をログとして記録するサービス。
📦 Amazon S3
取得したログを保存するストレージ。
Athenaで分析するためには、S3バケットに保存しておく必要があります。
🔍 Amazon Athena
S3に保存されたログに対して、クエリを実行できるサーバーレス分析サービス。
Glueなどを使わなくても、手動でテーブル定義すればすぐに使えます!
3.VPC Flow Logsを有効化してみよう
まずは、VPC内のトラフィックを記録するために、VPC Flow Logsを有効化します。
✅ 手順(コンソールから設定する場合)
- VPCコンソールを開く
- 対象のVPCを選択
- 「Flow Logs」タブを開き、「Create flow log」をクリック
- 以下の項目を設定:
-
Filter:
ALL
(すべてのトラフィックを記録) -
Destination:
Send to an S3 bucket
- Destination bucket:任意のS3バケット(事前に作成しておく)
-
Log format:
custom format
-
Filter:
- 「Create flow log」で完了!
💡 補足ポイント
-
Filterの選び方:
ALL
を選ぶと送受信両方のログが取得できます。 -
ログ形式:
custom format
を選択することで、柔軟な分析が可能です。
今回は、V2属性のフィールドと、flow-direction
を指定します。
Flow Logsの設定が完了すると、数分以内にログファイルが保存され始めます。
次はこのログをAthenaで分析する準備をしていきます!
4. Athenaで分析する準備
ログをAthenaで分析するには、データベースとテーブル定義が必要です。
✅ 手順(コンソールから設定する場合)
- Athenaコンソールを開く
- 「Editor」タブを開き、SQLクエリを実行してデータベースを作成
- 作成したデータベースを選択
- テーブル定義を作成
- パーティションを追加
🏗️ データベースの作成
まずは、Athenaでクエリを実行するためのデータベースを作成します。
以下のSQLをクエリエディタで実行します:
CREATE DATABASE test_vpc_flowlogs;
🛠 テーブル定義の作成
次に、S3に保存されたVPC Flow Logsを参照するためのテーブル定義を作成します。
以下のSQLをクエリエディタで実行します:
※{your-bucket-name}
実際のS3バケットのパスに置き換えてください。
※{AWS ID}
ご自身のAWSアカウントID(12桁)に置き換えてください。
CREATE EXTERNAL TABLE IF NOT EXISTS test_vpc_flowlogs.test_table_vpc_flowlogs (
version INT,
accountid STRING,
interfaceid STRING,
srcaddr STRING,
dstaddr STRING,
srcport INT,
dstport INT,
protocol INT,
packets INT,
bytes BIGINT,
start INT,
endtime INT,
action STRING,
logstatus STRING,
flowdirection STRING
)
PARTITIONED BY (dt STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
LOCATION 's3://{your-bucket-name}/AWSLogs/{AWS ID}/vpc-flow-logs/ap-northeast-1/'
TBLPROPERTIES ("skip.header.line.count"="1");
📅 パーティション追加
テーブル定義を作成後、パーティション設定を変更します。
パーティション(dt) を使うことで、日付ごとの絞り込みが可能になり、
クエリの効率が向上します。
以下のSQLをクエリエディタで実行します:
※{yyyy/mm/dd}
任意の日付に置き換えてください。
※{your-bucket-name}
実際のS3バケットのパスに置き換えてください。
※{AWS ID}
ご自身のAWSアカウントID(12桁)に置き換えてください。
ALTER TABLE
test_vpc_flowlogs.test_table_vpc_flowlogs
ADD PARTITION (dt='{yyyy/mm/dd}')
location 's3://{your-bucket-name}/AWSLogs/{AWS ID}/vpcflowlogs/ap-northeast-1/yyyy/mm';
5. クエリ例と分析結果
ここからが本番!Athenaで実行できるクエリ例を紹介します。
📥 受信トラフィック量(合計)
SELECT
date_trunc('hour', from_unixtime(start)) AS hour,
SUM(bytes) AS received_bytes
FROM
test_vpc_flowlogs.test_table_vpc_flowlogs
WHERE
action = 'ACCEPT'
AND flowdirection = 'ingress'
GROUP BY
1
ORDER BY
1;
📤 送信トラフィック量(合計)
SELECT
date_trunc('hour', from_unixtime(start)) AS hour,
SUM(bytes) AS sent_bytes
FROM
test_vpc_flowlogs.test_table_vpc_flowlogs
WHERE
action = 'ACCEPT'
AND flowdirection = 'egress'
GROUP BY
1
ORDER BY
1;
📈 最大受信量(1時間単位)
SELECT
date_trunc('hour', from_unixtime(start)) AS hour,
MAX(bytes) AS max_bytes
FROM
test_vpc_flowlogs.test_table_vpc_flowlogs
WHERE
action = 'ACCEPT'
AND flowdirection = 'ingress'
GROUP BY
1
ORDER BY
1;
📉 最大送信量(1時間単位)
SELECT
date_trunc('hour', from_unixtime(start)) AS hour,
MAX(bytes) AS max_bytes
FROM
test_vpc_flowlogs.test_table_vpc_flowlogs
WHERE
action = 'ACCEPT'
AND flowdirection = 'egress'
GROUP BY
1
ORDER BY
1;
✅ クエリ結果の確認とCSVダウンロード
以下の手順で、分析結果をCSVファイルとしてダウンロードできます。:
- クエリ結果の右上にある 「Download results」 をクリック
- 「Download CSV of results」 を選択
- ローカルに保存!
📊 グラフで可視化してみた!
分析結果をグラフ化すると、傾向が一目でわかります!
6. まとめ
今回の検証では、VPC Flow Logs × Athena によって、
トラフィック分析ができることを確認しました!
また、Athenaのクエリ結果をCSVで出力→グラフ化することで、
トラフィックの変動を視覚的に把握できるようになります。
今回は22時間分のログを対象に分析しましたが、対象範囲を拡大することで、
月次レポートの作成など運用業務に役立つはずです!
🔮今後の展望
次回は、QuickSightを使ってダッシュボード化に挑戦予定です!
Athenaの分析結果を “見える化” して、運用にもっと活かしていきます!