S3に格納されているVPCフローログをAthenaでサクっと抽出する手順

# はじめに
外部環境⇒自社管理のAWS環境内リソースへの通信がうまくいかないことがあり、
VPCフローログでアクセス拒否されているのか調査したい場面がありました。
ログが少なければ「該当しそうなログをダウンロードしてGrep検索」で乗り切れますが、
大量のログが吐かれていたので、Athenaで対象のログを抽出しました。
備忘として記載します。

# やりたいこと & 前提
・IPアドレス(xxx.xxx.xxx.xx)⇒IPアドレス(△△.△△.△.△△)の通信を、VPCフローログから抽出したい。
・VPCフローログはS3に格納されている。

# 事前確認
対象のVPCフローログをコンソールで確認し、保存先のS3バケットを特定します。

### VPCフローログの設定確認 & 保存先S3バケット確認
VPC画面にて、対象VPCの詳細画面に遷移します。
「フローログ」タブを開き、「送信先タイプ」「送信先名」を確認します。
「tst」というS3バケットに保存されていることが分かりました。
![athena1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740559/21ba8a5c-276a-cc92-27b6-8143d25539d4.png)

### S3バケットのディレクトリ構成確認
「フローログ」タブの「送信先」を押下し、保存先のS3バケットに移動します。
確認したい日付のフォルダまで遷移し、画面上部のディレクトリ構成を確認します。
![athena2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740559/d8cff2c1-6b7e-fff6-b4fb-428a91a51786.png)

# Athenaでの抽出手順
Athena画面に遷移します。
![athena3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740559/e6ecb002-dfb1-cd63-cb95-4fffa638f2bb.png)


### データベース作成
クエリ画面にて、データベースを作成します。
下記SQLをコピペして実行します。
正常終了すると、データベースのドロップダウンリストに「VPCFlowLogs」が追加されます。
データベースのドロップダウンリストから「VPCFlowLogs」を選択します。
データベース名は、任意の名前で指定可能です(今回は「VPCFlowLogs」と指定しています)。

　※「実行」ボタンがグレーアウトされていて押下できない場合、Athena自身のログ格納先(S3バケット)設定をしてください。
![athena4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740559/26965624-5080-ca21-4f8f-f062c357e06e.png)

```sql
CREATE DATABASE VPCFlowLogs;
```

### テーブル作成
クエリ画面にて、テーブルを作成します。
（データベース作成のSQLは削除してしまって大丈夫です。）
下記SQLをコピペし、事前に確認したディレクトリ情報に書き換えた後、実行します。
基本的には、S3バケット名・AWSアカウント番号の書き換えのみになります。
![athena5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740559/b52af27f-cfba-e152-035f-ea57a9392fd2.png)

```sql
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/{AWSアカウント番号}/vpcflowlogs/ap-northeast-1/'
TBLPROPERTIES ("skip.header.line.count"="1");
```

### S3バケットのVPCフローログをAthenaに取り込む
クエリ画面にて、S3バケットに格納されているVPCフローログをAthenaに取り込みます。
日付毎に取り込む必要がある為、下記日付部分を変更しつつ必要な日数分、実行します。
　・dt=YYYY-MM-DD
　・s3://{S3バケット名}/AWSLogs/{AWSアカウント番号}/vpcflowlogs/ap-northeast-1/YYYY/MM/DD

　※dt=YYYY/MM/DDと指定するとパーティションが壊れ、やり直しになるのでご注意ください。
![athena6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740559/fc849b6d-1b26-13a0-0aa0-3dda8f55609c.png)

```sql
ALTER TABLE vpc_flow_logs
ADD PARTITION (dt='2023-04-01')
location 's3://{S3バケット名}/AWSLogs/{AWSアカウント番号}/vpcflowlogs/ap-northeast-1/2023/04/01';
```

セットアップは以上になります。

### 対象ログを抽出してみる
クエリ画面にて、下記SQLをコピペし、実際のIPアドレスに書き換えた後、実行します。
画面下部のクエリ結果を確認します。
確認したかったログが抽出できました！
![athena8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740559/83b6daae-6097-eea1-23fa-8e4f4ac6cc52.png)

```sql
SELECT *
FROM vpc_flow_logs
WHERE sourceaddress = 'xxx.xxx.xxx.xx' and 	destinationaddress = '△△.△△.△.△△';
```

他者に当該ログを共有したい場合は、結果をCSVでダウンロードすることも可能です。

# 参考にさせて頂いた記事
https://dev.classmethod.jp/articles/vpc-flow-logs-athena/