Skip to content

AWS で VPC Flow Log を S3 に保存し Athena で解析する

AWS VPC でトラフィックフローを取得する際、ログの保存先は以下から選択できます。

  1. CloudWatch Logs
  2. S3

今回は「S3 上にログを保存し、Athena 上から SQL でクエリーする」までの手順をメモしておきます。

S3

まず始めにログを保存しておく S3 Bucket を作成しておきます。

Step.1

S3 の管理画面から バケットを作成 をクリックします。

file

Step.2

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

file

Step.3

これで S3 Bucket が作成されました。

file

VPC

次は VPC で Flow Log を有効化します。

Step.4

VPC の管理画面からトラフィックログを取得したい VPC を選択し、フローログを作成 をクリックします。

file

Step.5

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

file

尚、デフォルトのログ形式は以下の通りです。

${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 の管理画面へアクセス、クエリエディタから 設定管理 をクリックします。

file

Step.7

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

file

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

file

Step.8

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

file

Step.9

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

file

Step.10

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

file

Step.11

次はテーブルを作成します。 先程作成したデータベースを選択した後、以下のクエリを入力して 実行 をクリックします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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");

file

Step.12

これでテーブルが作成されました。

file

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