実は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をお試しください!