AWS re:Invent2013参加レポート #6 AWS CloudTrailを使ってサーバーを起動した時刻と接続元を確認する
AWS CloudTrailでどんなデータが取得できるのか?
先ほど、AWS re:Inventのキーノートで発表されていたAWS CloudTrailですが、実際に使えるようになったので試してみました。今回は、EC2インスタンスを起動したのは、誰がいつどこからアクセスして起動したのか確認したいと思います。
セットアップ
メニューに追加されていますね。
追加・更新画面です。
Amazon SNSのトピックを指定します。指定したトピックを購読すればイベント駆動でメールを飛ばしたりできますね。
しばらく待つとS3バケットにオブジェクトが追加されました!
中身の確認をする
それではオブジェクトを取得して解析してみましょう
$ aws s3 ls s3://satoshidemo PRE AWSLogs/ $ aws s3 ls s3://satoshidemo/AWSLogs/************/CloudTrail/us-east-1/2013/11/13/ 2013-11-13 13:25:31 2263 ************_CloudTrail_us-east-1_20131113T2115Z_kFqMBiiOHK6pWPrc.json.gz $ gunzip -d ************_CloudTrail_us-east-1_20131113T2115Z_kFqMBiiOHK6pWPrc.json,gz $ mv ************_CloudTrail_us-east-1_20131113T2115Z_kFqMBiiOHK6pWPrc.json sample.json
jsonファイルをパースします。ここではjqを使って実行されたコマンドを全て列挙してみましょう。
$ cat sample.json | jq '.[]' | jq '.[]' | jq '.eventName' "DescribeNetworkAcls" "DescribeTrails" "DescribeInternetGateways" "DescribeNetworkAcls" "DescribeVolumeStatus" "DescribeVpcs" "DescribeTrails" "DescribeTrails" "DescribeCustomerGateways" "DescribePlacementGroups" "DescribeTrails" "DescribeSecurityGroups" "DescribeAvailabilityZones" "RunInstances" "CreateSecurityGroup" "DescribeAddresses" "DescribeSecurityGroups" "DescribeVpnConnections" "DescribeInstanceStatus" "DescribeRouteTables" "DescribeVpnGateways" "DescribeInstances" ・・・ $ cat sample.json | jq '.[]' | jq '.[]' | jq '.eventName' | grep 'RunInstance' "RunInstances"
EC2インスタンスが起動された時間を取得する
ちょっと応用編としてやってみたいと思います。以下は、AWS管理コンソールからEC2を起動した時刻と接続元IPアドレスを抽出しています。
$ cat sample.json | jq '.[]' | jq '.[] | select(.eventName== "RunInstances")'| jq '.userAgent, .eventName, .eventTime ,.sourceIPAddress' "EC2ConsoleBackend" "RunInstances" "2013-11-13T21:21:00Z" "65.160.18.XXX"
まとめ
リリースしたばかりのAWS CloudTrailですが、アウトプットはS3バケット内にJSONファイルが置かれるだけですので、実際の運用では、そのままデータベースに入れるとか、EMRで集計するとか何かしらの処理を行って利用者にとって分かりやすい形にする必要がありますね。かなり細かいデータが取れますので、エンタープライズ利用においてクラウド利用のガバナンスのためには必須な機能になりそうです。