はじめに
昨日参加した JAWS-UG 鹿児島 Vol.04 で @yoshidashingo さんが紹介されていたAWS の新サービス CloudTrail を試してみる。また、合わせてログを elasticsearch に放り込んでみる。
AWS CloudTrail とは
以下はざっくりとした自分の認識。
- AWS CloudTrail(ベータ)
- アカウントの AWS API の呼び出しを記録して Management Console や CLI や SDK 等全ての動作をログとして記録するサービス
全ての動作ログが取れるというのは第三者認証を受ける際に重要なポイントとなるので、今後、AWS を企業へ導入にするにあたって高いセールスポイントになるのではないかと思われる。(自分もこの辺りを切り口に自社サービスへの導入を推したいと企んでいる...ムフフ)
参考
- 【AWS発表】 AWS CloudTrail - AWS APIコールの記録を保存
- 新サービス『AWS CloudTrail』のユーザーガイドを読んでみた / 概要・対応サービス及びリージョン
- AWSの操作履歴を記録するCloudTrailを試してみた
- CloudTrailのログを検索してみた
- mostlygeek / cloudtrail-elasticsearch-import
準備
Management Console から CloudTrail を有効にする

ちなみに現在(2013/12/07 時点)では Tokyo Region では提供されていないので注意する。

"Get Started" をクリックして次の画面に進む。
ログを貯めるバケツを用意する
次のステップとしてログは S3 に保存される為、ログを保存する為のバケットを作成する。

バケットの作成が正常に終了すると以下のような表示となる。

ちなみに Turn off をクリックするとログの採取を止めることが出来る。
ぐちゃぐちゃ弄っていると...
ログが出力された
ログの採取を開始した後でインスタンスの作成ウィザードを弄っていると...

上記のように指定したバケットに gz で固めらたログが保存される。ちなみに、ログのディレクトリは日毎に作成される。また、ログの出力のタイミングは 5 分ごとのようだ(要調査)。また、モザイク部分は account ID が設定されている。
ログを見てみると...
以下のような JSON で出力されている。
むむ... JSON ということは...
elasticsearch に突っ込んでみる
ログが JSON 形式で出力されているということで、ログを elasticsearch に突っ込んでみる。既に MongoDB に突っ込んで検索しやすくされている方がいらっしゃったので、そちらを参考にさせて頂いた。
突っ込むまでの流れ
- バケットから aws s3 cp でログをとってきて展開
jqを使ってJSONを展開するcurlを使ってelasticsearchへ突っ込む
とりあえず突っ込んでみる
aws s3 cp --recursive gzip -d 123456789012_CloudTrail_us-east-1_20131207T0505Z_ZbdkeKdlzp6vikJl.json.gz cat 123456789012_CloudTrail_us-east-1_20131207T0505Z_ZbdkeKdlzp6vikJl.json | jq .Records[] | curl -v -H "Accept: application/json" -H "Content-type: application/json" --data-binary @- -X POST 'http://xxx.xxx.xxx.xx:9200/testpost/test3'
とりあえずやってみると...
* About to connect() to xxx.xxx.xxx.xx port 9200 (#0)
* Trying xxx.xxx.xxx.xx...
* Adding handle: conn: 0x143bc10
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x143bc10) send_pipe: 1, recv_pipe: 0
* Connected to xxx.xxx.xxx.xx (xxx.xxx.xxx.xx) port 9200 (#0)
> POST /testpost/test3 HTTP/1.1
> User-Agent: curl/7.32.0
> Host: xxx.xxx.xxx.xx:9200
> Accept: application/json
> Content-type: application/json
> Content-Length: 11483
> Expect: 100-continue
>
< HTTP/1.1 100 Continue
< HTTP/1.1 201 Created
< Content-Type: application/json; charset=UTF-8
< Content-Length: 91
<
* Connection #0 to host xxx.xxx.xxx.xx left intact
{"ok":true,"_index":"testpost","_type":"test3","_id":"V19vsoD9SC6RDTTvfflKkQ","_version":1}
登録できたっぽい!
確認と課題

おお。とりあえず 1 レコード登録出来てるけど...以下のような幾つか自分では解決が難しい問題が発生している。
- 一つのログファイル内に複数の
JSONレコードがある elasticsearchのBulk APIでログを登録しようとしているけど上手くログが登録出来ずBulk APIで登録する場合フォーマットを少し工夫必要がある
既に node でインポートの処理を実装されている方もいらっしゃるようでもう少し調査が必要ということで続く。
最後に
CloudTrailを使えばAWS上の全ての操作ログが取れるCloudTrailは 5 分間隔でS3のバケットに放り込んでいると思われるCloudTrailのログはJSON形式なので後の加工や保存に自由度がある- ただし、
elasticsearchに放り込む際には工夫が必要かもしれない
そして続く...