[JAWS-UG CLI] CloudTrail:#1 CloudTrail入門 (+ SNS通知テスト)


http://jawsug-cli.doorkeeper.jp/events/18569 でのハンズオン資料です。

AWS CLIを利用して、CloudTrailの設定をしてみます。


前提条件
========

## CloudTrailへの権限

概ね以下の権限が必要です。

```json:権限
    {
      "Effect": "Allow",
      "Action": [
        "cloudtrail:CreateTrail",
        "cloudtrail:DescribeTrails",
        "cloudtrail:GetTrailStatus",
        "cloudtrail:StartLogging",
        "cloudtrail:UpdateTrail"
      ],
      "Resource": "*"
    }
```

## AWS CLIのバージョン

以下のバージョンで動作確認済

* AWS CLI 1.7.0



0. 事前作業
=======================

0.1. リージョンの指定
-------------------------

リージョンを指定します。

```bash:コマンド:
export AWS_DEFAULT_REGION='ap-northeast-1'
```

このハンズオンでは、AWS標準のリージョン変数を利用していますが、regionオプションでコマンド毎に指定しても同様の結果になります。
( 「オペミスを回避するために明示的に実行する」という意味ではregionオプションの方が良いです。)


0.2. S3バケット名の決定
-------------------------

ここでは、trail-${AWS_DEFAULT_REGION}-${組織名}をバケット名とします。

```bash:コマンド:
ORG_NAME='example-jp'
```


```bash:コマンド:
S3_BUCKET_NAME="trail-${AWS_DEFAULT_REGION}-${ORG_NAME}" && echo ${S3_BUCKET_NAME}
```


0.3. S3キープレフィックスの決定
--------------------------------

今回は、デフォルトのままにします。

```bash:デフォルト:
/${キープレフィックス}/AWSLogs/XXXXXXXXXXXX/CloudTrail/${リージョン名}
```

0.4. SNSトピック名の決定
-------------------------

```bash:コマンド:
SNS_TOPIC_NAME="trail-${AWS_DEFAULT_REGION}" && echo ${SNS_TOPIC_NAME}
```

新規に作成する場合: http://qiita.com/tcsh/items/e05e21e7338668cbf3b8 1以降の手順




0.5. AWSアカウントIDの取得
----------------------------

S3のバケットポリシー作成のときに必要となります。

```bash:コマンド:
AWS_ID=`aws iam get-user --query 'User.Arn' --output text | sed 's/^.*:://' | sed 's/:.*$//'` \
  && echo ${AWS_ID}
```



1. Trailの作成
============================


1.1. Trail名の決定
----------------------------

```bash:コマンド:
TRAIL_NAME="trail-${AWS_DEFAULT_REGION}" && echo ${TRAIL_NAME}
```


1.2. Trailの作成
------------------------

```bash:コマンド:
aws cloudtrail create-trail \
  --name ${TRAIL_NAME} \
  --s3-bucket-name ${S3_BUCKET_NAME} \
  --sns-topic-name ${SNS_TOPIC_NAME}
```

```json:結果:
{
    "IncludeGlobalServiceEvents": true, 
    "Name": "trail-ap-northeast-1", 
    "SnsTopicName": "trail-ap-northeast-1", 
    "S3BucketName": "trail-ap-northeast-1-example-jp"
}
```

1.3. Trailの内容確認
------------------------

```bash:コマンド:
aws cloudtrail describe-trails --trail-name-list ${TRAIL_NAME}
```

```json:結果:
{
    "trailList": [
        {
            "IncludeGlobalServiceEvents": true, 
            "Name": "trail-ap-northeast-1", 
            "SnsTopicName": "trail-ap-northeast-1", 
            "S3BucketName": "trail-ap-northeast-1-example-jp"
        }
    ]
}
```



2. CloudTrailロギングの開始
============================

2.1. ロギングの状態確認
------------------------

```bash:コマンド:
aws cloudtrail get-trail-status --name ${TRAIL_NAME}
```


```json:結果:
{
    "IsLogging": false
}
```


2.2. ロギングの開始
------------------------

```bash:コマンド:
aws cloudtrail start-logging --name ${TRAIL_NAME}
```

```text:結果:
(戻り値なし)
```

2.3. ロギングの状態確認
------------------------


```bash:コマンド:
aws cloudtrail get-trail-status --name ${TRAIL_NAME}
```

ロギング開始直後は下記の内容が表示されます。


```json:結果:
{
    "IsLogging": true, 
    "StartLoggingTime": 1421652962.51
}
```


10分ほどまって、S3バケットにログが保存されると、以下の内容に変化します。

```json:結果:
{
    "StartLoggingTime": 1421652962.51, 
    "IsLogging": true, 
    "LatestDeliveryTime": 1421653022.589
}
```


3. SNS通知を確認
============================

SNSトピックを購読したメールアドレスに、通知が届いているはずなので確認しましょう。


4. ログの確認
============================

4.1. ログ確認
--------------------------------

S3バケットにログファイルが作成されていることを確認します。

```bash:コマンド:
aws s3 ls s3://${S3_BUCKET_NAME}/AWSLogs/${AWS_ID}/CloudTrail/${AWS_DEFAULT_REGION}/`date -u +%Y`/`date -u +%m`/`date -u +%d`/
```

```text:結果:
2015-01-19 14:29:42        980 XXXXXXXXXXXX_CloudTrail_ap-northeast-1_20150119T0530Z_XgjNcNlurtSBMnGv.json.gz
```




4.2. ログをローカルに転送
---------------------------

```bash:コマンド:
aws s3 sync "s3://${S3_BUCKET_NAME}/AWSLogs/${AWS_ID}/CloudTrail/${AWS_DEFAULT_REGION}/`date -u +%Y`/`date -u +%m`/`date -u +%d`/" .
```

```text:結果(例):
download: s3://trail-ap-northeast-1-example-jp/AWSLogs/XXXXXXXXXXXX/CloudTrail/ap-northeast-1/2015/01/19/XXXXXXXXXXXX_CloudTrail_ap-northeast-1_20150119T0530Z_XgjNcNlurtSBMnGv.json.gz to ./XXXXXXXXXXXX_CloudTrail_ap-northeast-1_20150119T0530Z_XgjNcNlurtSBMnGv.json.gz
```

4.3. ログを展開
-------------------

```bash:コマンド:
gunzip -d ${AWS_ID}*json.gz
```


4.4. ログの閲覧
-----------------

jsonlintを通すと読みやすくなります。

```bash:コマンド:
cat ${AWS_ID}*json | jsonlint
```



5. 通知の停止
===============

SNSトピックへの通知を停止しておきます。

```bash:コマンド:
aws cloudtrail update-trail --name ${TRAIL_NAME} --sns-topic-name "" 
```


完了
=====