Athenaを使ってVPC Flow Logsを解析する

記事タイトルとURLをコピーする

実はSQL文が好きな鎌田です。 Athena、みなさんはもうご利用でしょうか。Athenaを使うとS3バケットの様々なログをSQLをかけて解析することができます。

今回は、VPC Flow LogsをAthenaで検索する方法をご紹介します。

VPC Flow LogsのログをS3に出力するように設定する

まず、解析対象のVPC Flow LogsをS3に出力するように設定しておきます。 VPCの画面から、S3にログを出力したいVPCを選び、下のペインから「フローログ」のタグを選んで「フローログ」の作成をクリックします。

下記のような形で、フローログの設定をします。 アクセスログを吐き出すS3バケットは、空で良いので先に作っておきましょう。 ※この画面では作成できません S3バケットに書き込む必要なバケットポリシーは、自動でアタッチされます。

設定項目 設定値
フィルタ すべて
Maximum aggregation interval 10 minutes
送信先 S3バケットへの送信
S3バケットARN arn:aws:s3:::(バケット名)
Format AWS default format

フローログが無事設定されました。

Athenaの準備

では本題のAthenaです。マネジメントコンソールでAthenaにアクセスしましょう。 「今すぐ始める」をクリックします。

クエリを保存するバケットの指定

クエリの画面になります。 まずは、クエリを保存するバケットの設定が必要です。 設定をクリックします。

下記のようにs3://の形式で、S3バケットを指定します。 S3のバケットと、Athenaを実行したいリージョンが一致していないとエラーになりますのでご注意ください。 入力できたら「保存」をクリックします。

データベースを作成する

データベースを作りましょう。 以下のクエリを新しいクエリのエリアに記載し、「クエリの実行」をクリックします。

CREATE DATABASE default

エラーが出ますが、データベースは作成できていますのでご安心を。

VPC Flow Logs用のテーブルを作成する

次に、VPC Flow Logs用のテーブルを作成します。 以下のSQLを実行するのですが、LOCATIONの部分のS3バケット名や、リージョンなどは、環境に応じて適宜変更してください。 ※AWSドキュメントには、こちらに記載があります。

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 (dt string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
LOCATION 's3://(S3バケット名)/AWSLogs/{subscribe_account_id}/vpcflowlogs/ap-northeast-1/'
TBLPROPERTIES ("skip.header.line.count"="1");

新しいクエリで、こちらもまた実行します。

実行が完了すると、テーブルが出来上がります。

パーティションを設定する

クエリを実行する際は、日付をパーティションと呼ばれる設定をしておく必要があります。 以下は2020年2月の例です。 日付やバケット名などを変更して実行してください。

ALTER TABLE vpc_flow_logs
ADD PARTITION (dt='2020-02')
location 's3://(S3バケット名)/AWSLogs/{subscribe_account_id}/vpcflowlogs/ap-northeast-1/2020/02';

クエリを実行してみる

では実際に、クエリを実行してみましょう。 下記のSQLは、VPC Flow Logsの中から、送信元:ポート/送信先:ポートを、許可された通信だけリスト化しています。 Limit 10を付けて10件の出力に絞っています。 10の数字を変えることで、100件の出力なども可能です。 これまでと同じように、クエリをコピーして、実行してみてください。

SELECT dt,
         sourceaddress,
         sourceport,
         destinationaddress,
         destinationport,
         interfaceid,
         action,
         protocol
FROM vpc_flow_logs2
WHERE action = 'ACCEPT' LIMIT 10;

実行すると、以下のようにリストが出力されます。

このような形で、簡単にVPC Flow Logsの解析が出来ました!

まとめ

SQLを知らなくても、簡単にVPC Flow Logsの解析が行えたことが確認できたかと思います。 SQLをご存知の方であれば、ちょっとSQLを修正するだけでも簡単に様々な解析が可能です。 ぜひAthenaをお試しください!