はじめに
昨日参加した 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
に放り込む際には工夫が必要かもしれない
そして続く...