VPCフローログをAthenaで確認する

2021.01.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AthenaでVPCフローログを検索する方法を紹介します。

VPCフローログとは

VPCフローログは、VPCのネットワークインターフェースでやり取りされるトラフィックをキャプチャする機能です。CloudWatch LogまたはS3にログを配信できます。ログの配信にCloudWatch Logsの場合は0.76USD/GB。S3の場合は0.38USD/GBかかります。(※東京リージョンかつ最初の10TBの場合の価格)VPCフローログを有効化しておきたいがコストを抑えておきたい場合はS3に配信しておくと良いでしょう。

VPCにデフォルトで存在するAmazon DNS サーバーWindowsライセンスのアクティベーションなどに関するトラフィックは記録されません。詳しくはフローログの制限事項をご覧ください。

以下の例ではVPCにフローログを設定しています。フィルタにALLを指定し、許可および拒否された通信のログをS3に配信します。

ログの確認方法

フローログが配信されると、S3バケットに「bucket-name/AWSLogs/AWS-AccountID/vpcflowlogs/ap-northeast-1/2021/01/18/」といったフォルダが作成され、gzファイルが格納されます。01/18のフォルダには1月18日のAM9:00からのログが格納されます。

gzファイルを手元にダウンロードして確認することもできますが、Amazon Athenaを使うと確認が楽です。Athenaを使うとS3にあるログに対して、SQLクエリを実行できます。

Athenaでテーブルとパーティションを作る

Athenaの使い方はユーザーガイドに一通り記載されています。補足する形で紹介します。

Athenaコンソールを開き、データベースを選択します。以下の例ではdefaultを選択しています。右側のクエリエディターにSQLを入力し実行します。

「's3://your_log_bucket/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/'」は実際のS3のパスを指定します。{region_code}は東京の場合はap-northeast-1です。

CREATE EXTERNAL TABLE IF NOT EXISTS vpc_flow_logs (
  version int,
  account string,
  interfaceid string,
  sourceaddress string,
  destinationaddress string,
  sourceport int,
  destinationport int,
  protocol int,
  numpackets int,
  numbytes bigint,
  starttime int,
  endtime int,
  action string,
  logstatus string
)
PARTITIONED BY (`date` date)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
LOCATION 's3://your_log_bucket/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/'
TBLPROPERTIES ("skip.header.line.count"="1");

パーティションを作成しスキャンするデータ量を制限します。YYYY-MM-ddを2021-01-18のように変更します。また、locationを実際のS3に合わせて変更します。

ALTER TABLE vpc_flow_logs
ADD PARTITION (`date`='YYYY-MM-dd')
location 's3://your_log_bucket/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/YYYY/MM/dd';

テーブルの三点リーダー>テーブルをプレビューを選択すると、テーブルの内容が表示されます。

ログはAthenaコンソールで表示することもできますし、CSVファイルとしてダウンロードもできます。フローログの各項目の意味はユーザーガイドをご覧ください。よく見るのは、送信元/宛先IPとポート、actionかと思います。actionがACCEPTのときは、セキュリティグループとNACLで許可されています。REJECTでは、セキュリティグループまたはNACLで許可されていません。

クエリの例

SELECT文を書いてログを検索します。私がよく使う例を紹介します。

宛先IPアドレスが192.0.2.1でUDP:123(NTP)のログは以下で検索できます。 protocolはUDPの場合は17、TCPは6を指定します。

SELECT * FROM "default"."vpc_flow_logs"
WHERE destinationaddress = '192.0.2.1' AND destinationport = 123 AND protocol = 17;

192.0.2.1から192.0.2.10へのHTTP接続は以下のクエリで検索できます。疎通確認の調査などで使えるかと思います。

SELECT * FROM "default"."vpc_flow_logs"
WHERE sourceaddress='192.0.2.1' AND destinationaddress= '192.0.2.10' AND destinationport = 80 AND protocol = 6;

192.0.2.1から192.0.2.10への通信について、ポートごとにログ件数を表示するクエリは以下の通りです。サーバー間でどのような通信が行われているか確認したいとき役立つと思います。

SELECT SUM(numpackets) AS
  packetcount,
  destinationaddress,
  destinationport,
  protocol
FROM vpc_flow_logs
WHERE sourceaddress = '192.0.2.1'  AND destinationaddress = '192.0.2.10'
GROUP BY destinationaddress,destinationport,protocol
ORDER BY packetcount DESC

おわりに

VPCフローログをAthenaで確認する方法を紹介しました。疎通確認やサーバー間の通信状況を確認する際などに使ってみてください。

参考