ようへいの日々精進XP

よかろうもん

AWS CloudTrail を試してログを elasticsearch に入れてみた

はじめに

昨日参加した JAWS-UG 鹿児島 Vol.04@yoshidashingo さんが紹介されていたAWS の新サービス CloudTrail を試してみる。また、合わせてログを elasticsearch に放り込んでみる。


AWS CloudTrail とは

以下はざっくりとした自分の認識。

  • AWS CloudTrail(ベータ)
  • アカウントの AWS API の呼び出しを記録して Management Console や CLI や SDK 等全ての動作をログとして記録するサービス

全ての動作ログが取れるというのは第三者認証を受ける際に重要なポイントとなるので、今後、AWS を企業へ導入にするにあたって高いセールスポイントになるのではないかと思われる。(自分もこの辺りを切り口に自社サービスへの導入を推したいと企んでいる...ムフフ)


参考


準備

Management Console から CloudTrail を有効にする

f:id:inokara:20131207135420p:plain

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

f:id:inokara:20131207135600p:plain

"Get Started" をクリックして次の画面に進む。

ログを貯めるバケツを用意する

次のステップとしてログは S3 に保存される為、ログを保存する為のバケットを作成する。

f:id:inokara:20131207140028p:plain

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

f:id:inokara:20131207140217p:plain

ちなみに Turn off をクリックするとログの採取を止めることが出来る。


ぐちゃぐちゃ弄っていると...

ログが出力された

ログの採取を開始した後でインスタンスの作成ウィザードを弄っていると...

f:id:inokara:20131207165331p:plain

上記のように指定したバケットに gz で固めらたログが保存される。ちなみに、ログのディレクトリは日毎に作成される。また、ログの出力のタイミングは 5 分ごとのようだ(要調査)。また、モザイク部分は account ID が設定されている。

ログを見てみると...

以下のような JSON で出力されている。

むむ... JSON ということは...


elasticsearch に突っ込んでみる

ログが JSON 形式で出力されているということで、ログを elasticsearch に突っ込んでみる。既に MongoDB突っ込んで検索しやすくされている方がいらっしゃったので、そちらを参考にさせて頂いた。

突っ込むまでの流れ

  1. バケットから aws s3 cp でログをとってきて展開
  2. jq を使って JSON を展開する
  3. 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}

登録できたっぽい!

確認と課題

f:id:inokara:20131207183921p:plain

おお。とりあえず 1 レコード登録出来てるけど...以下のような幾つか自分では解決が難しい問題が発生している。

  • 一つのログファイル内に複数の JSON レコードがある
  • elasticsearchBulk API でログを登録しようとしているけど上手くログが登録出来ず
  • Bulk API で登録する場合フォーマットを少し工夫必要がある

既に node でインポートの処理を実装されている方もいらっしゃるようでもう少し調査が必要ということで続く。


最後に

  • CloudTrail を使えば AWS 上の全ての操作ログが取れる
  • CloudTrail は 5 分間隔で S3 のバケットに放り込んでいると思われる
  • CloudTrail のログは JSON 形式なので後の加工や保存に自由度がある
  • ただし、elasticsearch に放り込む際には工夫が必要かもしれない

そして続く...