[JAWS-UG CLI] S3:#7 CloudTrail用バケットの作成

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

AWS CLIを利用して、CloudTrailのログ保存用のバケットを作成してみます。

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

## S3への権限

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

```json:権限
    {
      "Effect": "Allow",
      "Action": [
        "s3:CreateBucket",
        "s3:GetBucketAcl",
        "s3:GetBucketLocation",
        "s3:GetBucketNotification",
        "s3:GetBucketPolicy",
        "s3:GetObject",
        "s3:ListAllMyBuckets",
        "s3:ListBucket",
        "s3:PutBucketPolicy"
      ],
      "Resource": "arn:aws:s3:::trail-*"
    }
```

## AWS CLIのバージョン

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

* AWS CLI 1.7.0

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


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

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

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

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


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

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

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


1. バケットの作成
====================


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


バケット名を決めます。

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

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


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

1.2. バケット名の未使用確認
----------------------------

バケット名が空いていることを確認します。

```bash:コマンド:
aws s3 ls s3://${S3_BUCKET_NAME}
```

```text:結果:
A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not exist
```

1.3. バケットの作成
----------------------------

S3バケットを作成します。

```bash:コマンド:
aws s3 mb s3://${S3_BUCKET_NAME}
```

```text:結果:
make_bucket: s3://trail-ap-northeast-1-example-jp/
```




2. バケットポリシーファイルの作成
=================================

バケットポリシーファイルを作成します。

```bash:コマンド:
FILE_S3_BUCKET_POLICY='BucketPolicy-CloudTrail-ap-northeast-1.json'
```


```bash:コマンド:
cat << EOF > ${FILE_S3_BUCKET_POLICY}
{
        "Version": "2012-10-17",
        "Statement": [
                {
                        "Sid": "AWSCloudTrailAclCheck20131101",
                        "Effect": "Allow",
                        "Principal": {
                                "AWS": [
                                        "arn:aws:iam::903692715234:root",
                                        "arn:aws:iam::035351147821:root",
                                        "arn:aws:iam::859597730677:root",
                                        "arn:aws:iam::814480443879:root",
                                        "arn:aws:iam::216624486486:root",
                                        "arn:aws:iam::086441151436:root",
                                        "arn:aws:iam::388731089494:root",
                                        "arn:aws:iam::284668455005:root",
                                        "arn:aws:iam::113285607260:root"
                                ]
                        },
                        "Action": "s3:GetBucketAcl",
                        "Resource": "arn:aws:s3:::${S3_BUCKET_NAME}"
                },
                {
                        "Sid": "AWSCloudTrailWrite20131101",
                        "Effect": "Allow",
                        "Principal": {
                                "AWS": [
                                        "arn:aws:iam::903692715234:root",
                                        "arn:aws:iam::035351147821:root",
                                        "arn:aws:iam::859597730677:root",
                                        "arn:aws:iam::814480443879:root",
                                        "arn:aws:iam::216624486486:root",
                                        "arn:aws:iam::086441151436:root",
                                        "arn:aws:iam::388731089494:root",
                                        "arn:aws:iam::284668455005:root",
                                        "arn:aws:iam::113285607260:root"
                                ]
                        },
                        "Action": "s3:PutObject",                        "Resource": "arn:aws:s3:::${S3_BUCKET_NAME}/AWSLogs/${AWS_ID}/*",
                        "Condition": {
                                "StringEquals": {
                                        "s3:x-amz-acl": "bucket-owner-full-control"
                                }
                        }
                }
        ]
}
EOF
```

JSONファイルを作成したら、フォーマットが壊れてないか必ず確認します。

```bash:コマンド:
$ cat ${FILE_S3_BUCKET_POLICY} | json_verify
```

```text:結果:
JSON is valid
```

json_verifyでエラーが出たときはjsonlintでチェックします。

```bash:コマンド:
$ cat ${FILE_S3_BUCKET_POLICY}| jsonlint
```

3. バケットポリシーの適用
==============================

S3バケットにバケットポリシーを適用します。

```bash:コマンド:
aws s3api put-bucket-policy \
  --bucket ${S3_BUCKET_NAME} \
  --policy file://${FILE_S3_BUCKET_POLICY}
```

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

4. バケットポリシーの確認
============================

```bash:コマンド:
aws s3api get-bucket-policy --bucket ${S3_BUCKET_NAME}
```

```json:結果:
{
    "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"AWSCloudTrailAclCheck20131101\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"arn:aws:iam::903692715234:root\",\"arn:aws:iam::035351147821:root\",\"arn:aws:iam::859597730677:root\",\"arn:aws:iam::814480443879:root\",\"arn:aws:iam::216624486486:root\",\"arn:aws:iam::086441151436:root\",\"arn:aws:iam::388731089494:root\",\"arn:aws:iam::284668455005:root\",\"arn:aws:iam::113285607260:root\"]},\"Action\":\"s3:GetBucketAcl\",\"Resource\":\"arn:aws:s3:::trail-ap-northeast-1-example-jp\"},{\"Sid\":\"AWSCloudTrailWrite20131101\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"arn:aws:iam::903692715234:root\",\"arn:aws:iam::035351147821:root\",\"arn:aws:iam::859597730677:root\",\"arn:aws:iam::814480443879:root\",\"arn:aws:iam::216624486486:root\",\"arn:aws:iam::086441151436:root\",\"arn:aws:iam::388731089494:root\",\"arn:aws:iam::284668455005:root\",\"arn:aws:iam::113285607260:root\"]},\"Action\":\"s3:PutObject\",\"Resource\":\"arn:aws:s3:::trail-ap-northeast-1-example-jp/AWSLogs/XXXXXXXXXXXX/*\",\"Condition\":{\"StringEquals\":{\"s3:x-amz-acl\":\"bucket-owner-full-control\"}}}]}"
}
```


完了
=====

次に、CloudTrail通知用のSNSトピックを作成します。
http://qiita.com/tcsh/items/8e86e021acbe80d85138