Amazon Athena に CloudTrailのログを取り込んでみた

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

カスタマーサポート課の伊藤です。
re:InventでAmazon Athenaが発表されました。

お客さまのサポート対応の中でCloudTrailのログを確認したいというシーンはよくあるのですが、CloudTrailは通常のテキストログではなくJSON形式なので人間にとってはなかなか読みづらく、かといって専用のツールを勝手に導入するわけにもいかずAWSの中でなんとか解析出来ないかなと、常々考えていたので早速試してみました。

データ読み込み

Amazon Athenaは様々なデータ形式に対応しており、公式Blogでも次のように案内されています。

Athenaは分散SQLエンジンのPrestoをベースにしていて、JSON、CSV、ログファイル、カスタム区切りのテキスト、Apache ParquetApache ORC等を含む様々なフォーマットにクエリが実行できます。


そこでJSONならCloudTrailのログもそのまま読み込めるだろうと期待したのですが、残念ながらそのままではAthenaのカラムとしては認識してくれませんでした。 AWSに問い合わせをしたところ、CloudTrail ログは 1 行に複数の JSON を含むアレイ形式のデータなので、AthenaのGUIコンソールからJSONを選択した形では取り込めないとの回答でした。 以下のようなクエリ定義を実行して取り込む必要があると言う回答をいただきましたので早速試してみます。

CREATE EXTERNAL TABLE IF NOT EXISTS ctlogs
(
records array< struct< eventversion:string,
eventtime:string,
eventsource:string,
eventname:string,
awsregion:string,
sourceipaddress:string,
useragent:string,
responseelements:string,
requestid:string,
eventid:string,
requestparameters:map<string,string>,
useridentity:struct<type:string,principalid:string,arn:string,accountid:string,accesskeyid:string,username:string,sessioncontext:struct<attributes:struct<mfaauthenticated:string,creationdate:string>>>
>
>
)
row format serde 'org.openx.data.jsonserde.JsonSerDe'
location 's3://yyyyyyyyyyyyyyyy/AWSLogs/xxxxxxxxxxxx/CloudTrail/'


データベースを選択し、クエリを貼り付けて、[Run Query]を実行します。
location 's3://yyyyyyyyyyyyyyyy/AWSLogs/xxxxxxxxxxxx/CloudTrail/'の部分で、対象のCloudTrailログが保存されているバケットのパスを選択します。
yyyyyyyyyyyyyyyyの部分がバケット名、xxxxxxxxxxxxの部分がアカウントIDになります。 2016-12-06_17h22_17 これにより配列型のカラムとして、CloudTrailのログを読み込むとことが出来ました。2016-12-07_18h30_312016-12-06_17h25_02

データ抽出

配列型のカラムなので、検索する場合には次のようなunnest文を使う必要があります。
select record from ctlogs cross join unnest(records) as t(record) where record.eventname='SwitchRole' limit 10

select record from ctlogs cross join unnest(records) as t(record) where record.eventtime like '%2016-12-05%' limit 10

これにより、CloudTrailの内容をそのまま検索することが出来るようになりました。
eventname='SwitchRole' の部分を変更することで、特定の操作ログだけを表示させたり、
eventtime like '%2016-12-05%'の部分を変更することで、特定の日時のログだけを表示させることができます。

Amazon Athena自体は、現在US East (Northern Virginia)とUS West (Oregon)でしか提供されていませんが、データソースとしては東京リージョンのS3も問題無く利用ができますので是非お試し下さい。

ただし、データソースが東京リージョンだからなのか、それともデータ量の問題なのか、私の環境ではそれほど早くはありませんでした。
だいたい、100MBのデータをSelectするのに200秒程度の時間がかかる印象です。

2016-12-06_17h32_50

まとめ

Amazon Athenaの登場によりAWSサービス内で完結する形で、CloudTrailのログを分析することが出来るようになりました。
生のCloudTrailログを見ようとした場合、そもそも5分毎の分割ファイルになるのでどのファイルを読むべきかから悩むことになりますが、Athenaを使うことで分割ファイルを気にせずにログの内容だけを考える事ができるようになったので、これだけでも大きな進歩です。
まだまだ、癖があるという印象はありますが、Amazon サービス同士なので、今後さらに連携しやすくなってくれることを期待しています。