仕事でVPCフローログを解析する必要があったのでATHENAを使用してみました。
手動でエクセルにまとめて解析するよりずっと早く便利です。
最初は戸惑いますがあとはやり方がわかれば簡単にログ解析が可能です。
ATHENA設定
データベース作成
まずデータベースの作成が必要です。
CREATE DATABASE VPCFlowLogsDB
テーブル作成
次にテーブルを作成します。
CREATE EXTERNAL TABLE IF NOT EXISTS VPCFlowLogsTB (
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 (date string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
LOCATION 's3://{S3バケット名}/AWSLogs/{AWSアカウント番号}/vpcflowlogs/ap-northeast-1/'
TBLPROPERTIES ("skip.header.line.count"="1");
LOCATIONのS3パスはVPCフローログ保管場所を指定します。
パーティション作成
ATHENAはSELECT分を実行毎にコストがかかります。
実行結果のデータ量ではなく、スキャンしたテーブル全体のデータ量がコストにかかわってきます。
(2024年時点、1TBあたり5USドル)
そのため、対象データをパーティションで設定することでスキャンする範囲を絞ります。絞ることで料金を抑えることが可能です。
ALTER TABLE VPCFlowLogsTB
ADD PARTITION (date='2024-11-1')
location 's3://{S3バケット名}/AWSLogs/{AWSアカウント番号}/vpcflowlogs/ap-northeast-1/2024/11/01';
作成したテーブルにパーティションを追加します。
【注意点1】
ADD PARTITION (date='2024-11-01')に関して間は「/」ではなく「-」を使用する
〇 ADD PARTITION (date='2024/11/01')
× ADD PARTITION (date='2024-11-01')
※date=YYYY/MM/DDと指定するとパーティションが生成されない
【注意点2】
日付ごとに実行する必要があります。
〇 ADD PARTITION (date='2024-11-01')
× ADD PARTITION (date='2024-11')
SQLを実行してみる
準備は整ったのでSELECT文を実行してみます。
SELECT
from_unixtime(starttime, 9, 0) AS starttime_jst,
from_unixtime(endtime, 9, 0) AS endtime_jst,
interfaceid,
sourceaddress,
destinationaddress,
sourceport,
destinationport,
protocol,
numpackets,
numbytes,
action,
logstatus
FROM vpc_flow_logs
WHERE from_unixtime(starttime, 9, 0) >= cast('2024-11-01 12:00:00 +09:00' as timestamp with time zone)
AND from_unixtime(starttime, 9, 0) < cast('2020-11-01 13:00:00 +09:00' as timestamp with time zone)
ORDER BY starttime;
ATHENAを使うにあたっての注意点
・SELECT文で実行した結果CSVファイルは、「s3://{S3バケット名}/」配下に保存されます。
SELECTを実行するごとに結果CSVデータがたまっていくので主導で削除が必要です。
・ダウンロードした結果CSVファイルはUTF-8のため、エクセルで開くと日本語が文字化けします。