AWS で VPC Flow Log を S3 に保存し Athena で解析する
AWS VPC でトラフィックフローを取得する際、ログの保存先は以下から選択できます。
- CloudWatch Logs
- S3
今回は「S3 上にログを保存し、Athena 上から SQL でクエリーする」までの手順をメモしておきます。
S3¶
まず始めにログを保存しておく S3 Bucket を作成しておきます。
Step.1¶
S3 の管理画面から バケットを作成 をクリックします。

Step.2¶
S3 Bucket のパラメータは基本的にデフォルトのままで問題ありません。

Step.3¶
これで S3 Bucket が作成されました。

VPC¶
次は VPC で Flow Log を有効化します。
Step.4¶
VPC の管理画面からトラフィックログを取得したい VPC を選択し、フローログを作成 をクリックします。

Step.5¶
今回は以下画像、赤線部分のように設定しました。 ログ保存先の S3 Bucket 名は arn:aws:s3:::BUCKET-NAME のように指定します。 ログレコード形式は AWS のデフォルト形式 でも良いのですが、今回は カスタム形式 を選択し、更に 全て選択 をクリックして全てのフィールドをログに記録するようにしました。

尚、デフォルトのログ形式は以下の通りです。
${version} ${account-id} ${interface-id} ${srcaddr} ${dstaddr} ${srcport} ${dstport} ${protocol} ${packets} ${bytes} ${start} ${end} ${action} ${log-status}
全てのフィールドを選択した場合は以下の通りです。
${account-id} ${action} ${az-id} ${bytes} ${dstaddr} ${dstport} ${end} ${flow-direction} ${instance-id} ${interface-id} ${log-status} ${packets} ${pkt-dst-aws-service} ${pkt-dstaddr} ${pkt-src-aws-service} ${pkt-srcaddr} ${protocol} ${region} ${srcaddr} ${srcport} ${start} ${sublocation-id} ${sublocation-type} ${subnet-id} ${tcp-flags} ${traffic-path} ${type} ${version} ${vpc-id}
Athena¶
最後は Athena で S3 Bucket 上のログを解析出来るように設定します。
Step.6¶
Athena の管理画面へアクセス、クエリエディタから 設定 → 管理 をクリックします。

Step.7¶
解析対象になる S3 Bucket を指定します。

今回は LOCATION 's3://[BUCKET-NAME]/AWSLogs/[ACCOUNT-ID]/vpcflowlogs/ のような形式で設定しました。 予想されるバケット所有者 には解析対象となる S3 Bucket のアカウント ID を入力しておきます。

Step.8¶
これで解析対象となる S3 Bucket の設定が保存されました。

Step.9¶
次はクエリエディタの エディタ からデータベースを作成します。 CREATE DATABASE [DB-NAME] のように入力したら画面下部の 実行 をクリックします。

Step.10¶
これでデータベースが作成されました。

Step.11¶
次はテーブルを作成します。 先程作成したデータベースを選択した後、以下のクエリを入力して 実行 をクリックします。
CREATE EXTERNAL TABLE IF NOT EXISTS `vpc_flow_logs` (
`version` int,
`account_id` string,
`interface_id` string,
`srcaddr` string,
`dstaddr` string,
`srcport` int,
`dstport` int,
`protocol` bigint,
`packets` bigint,
`bytes` bigint,
`start` bigint,
`end` bigint,
`action` string,
`log_status` string,
`vpc_id` string,
`subnet_id` string,
`instance_id` string,
`tcp_flags` int,
`type` string,
`pkt_srcaddr` string,
`pkt_dstaddr` string,
`region` string,
`az_id` string,
`sublocation_type` string,
`sublocation_id` string,
`pkt_src_aws_service` string,
`pkt_dst_aws_service` string,
`flow_direction` string,
`traffic_path` int
)
PARTITIONED BY (`date` date)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
LOCATION 's3://[BUCKET-NAME]/AWSLogs/[ACCOUNT-ID]/vpcflowlogs/ap-northeast-1/'
TBLPROPERTIES ("skip.header.line.count"="1");

Step.12¶
これでテーブルが作成されました。

後は任意の SQL を実行してトラフィックログを解析します。