[JAWS-UG CLI] IAM:#20 IAMロールの作成 (CloudTrail用)

AWS CLIを利用して、CloudWatchLogsに書き込み可能なIAMロールの作成をしてみます。


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


IAMへの権限
-----------

* IAMに対してフル権限があること。


AWS CLIのバージョン
-------------------

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

  * AWS CLI 1.7.26

```bash:コマンド:
aws --version
```

結果(例):

      aws-cli/1.7.26 Python/2.7.5 Darwin/13.4.0


0. 準備
=======


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

作成するユーザのデフォルトリージョンを決めます。

(カレントユーザが利用するカレントリージョンも切り変わります。)

```bash:コマンド(アイルランドリージョンの場合):
export AWS_DEFAULT_REGION='eu-west-1'
```


0.2. 変数の確認
---------------

プロファイルとリージョンが想定のものになっていることを確認します。

```bash:変数の確認:
aws configure list
```

結果(例):

            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile       iamFull-prjZ-mbp13iamFull-prjZ-mbp13              env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region                eu-west-1              env    AWS_DEFAULT_REGION


0.3. ログストリームのARN確認
----------------------------

```bash:変数の確認:
cat << ETX

        LOG_STREAM_ARN: ${LOG_STREAM_ARN}

ETX
```


1. 事前作業
===========


1.1. ロール名の決定
-------------------

```bash:コマンド:
IAM_ROLE_NAME="CloudTrail_CloudWatchLogs_Role-${AWS_DEFAULT_REGION}"
```

同名のロールが存在しないことを確認します。

```bash:コマンド:
aws iam get-role \
         --role-name ${IAM_ROLE_NAME}
```

結果(例):

      A client error (NoSuchEntity) occurred when calling the GetRole operation: The role with name CloudTrail_CloudWatchLogs_Role-eu-west-1 cannot be found.


1.2. ロールドキュメントの作成
-----------------------------

```bash:コマンド:
FILE_ROLE_DOC="iam-role-${IAM_ROLE_NAME}.json" \
        && echo ${FILE_ROLE_DOC}
```

```bash:コマンド:
cat << EOF > ${FILE_ROLE_DOC}
{
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Sid": "",
                  "Effect": "Allow",
                  "Principal": {
                      "Service": "cloudtrail.amazonaws.com"
                  },
                  "Action": "sts:AssumeRole"
              }
          ]
}
EOF
```

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

```bash:コマンド:
jsonlint -q ${FILE_ROLE_DOC}
```


1.3. ロールポリシードキュメントの作成
-------------------------------------

```bash:コマンド:
FILE_ROLE_POLICY_DOC="iam-role-${IAM_ROLE_NAME}-policy.json" \
        && echo ${FILE_ROLE_POLICY_DOC}
```

```bash:変数の確認:
cat << ETX

        LOG_STREAM_ARN: ${LOG_STREAM_ARN}

ETX
```

```bash:コマンド:
cat << EOF > ${FILE_ROLE_POLICY_DOC}
{
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Sid": "AWSCloudTrailCreateLogStream20141101",
                  "Effect": "Allow",
                  "Action": [
                      "logs:CreateLogStream"
                  ],
                  "Resource": [
                      "${LOG_STREAM_ARN}*"
                  ]
              },
              {
                  "Sid": "AWSCloudTrailPutLogEvents20141101",
                  "Effect": "Allow",
                  "Resource": [
                      "${LOG_STREAM_ARN}*"
                  ],
                  "Action": [
                      "logs:PutLogEvents"
                  ]
              }
          ]
}
EOF
```

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

```bash:コマンド:
jsonlint -q ${FILE_ROLE_POLICY_DOC}
```


2. ロールの作成
===============


2.1. ロールの作成
-----------------

```bash:変数の確認:
cat << ETX

        IAM_ROLE_NAME: ${IAM_ROLE_NAME}
        FILE_ROLE_DOC: ${FILE_ROLE_DOC}

ETX
```

```bash:コマンド:
aws iam create-role \
        --role-name ${IAM_ROLE_NAME} \
        --assume-role-policy-document file://${FILE_ROLE_DOC}
```

結果(例):

      {
        "Roles": [
          {
              "AssumeRolePolicyDocument": {
                  "Version": "2012-10-17",
                  "Statement": [
                      {
                          "Action": "sts:AssumeRole",
                          "Principal": {
                              "Service": "cloudtrail.amazonaws.com"
                          },
                          "Effect": "Allow",
                          "Sid": ""
                      }
                  ]
              },
              "RoleId": "AROAJFCIGW6SZ3O4IYIH4",
              "CreateDate": "2015-05-11T05:28:07Z",
              "RoleName": "CloudTrail_CloudWatchLogs_Role-eu-west-1",
              "Path": "/",
              "Arn": "arn:aws:iam::XXXXXXXXXXXX:role/CloudTrail_CloudWatchLogs_Role-eu-west-1"
          }
        ]
      }


2.2. ロールポリシの作成
-----------------------

```bash:コマンド:
IAM_ROLE_POLICY_NAME="policy_CloudTrail_CloudWatchLogs_Role_${AWS_DEFAULT_REGION}"
```

```bash:変数の確認:
cat << ETX

        IAM_ROLE_NAME:        ${IAM_ROLE_NAME}
        IAM_ROLE_POLICY_NAME: ${IAM_ROLE_POLICY_NAME}
        FILE_ROLE_POLICY_DOC: ${FILE_ROLE_POLICY_DOC}

ETX
```

```bash:コマンド:
aws iam put-role-policy \
        --role-name ${IAM_ROLE_NAME} \
        --policy-name ${IAM_ROLE_POLICY_NAME} \
        --policy-document file://${FILE_ROLE_POLICY_DOC}
```

結果(例):

      (戻り値なし)


3. 事後作業
===========


3.1. ロールの確認
-----------------

```bash:コマンド:
aws iam get-role \
         --role-name ${IAM_ROLE_NAME}
```

結果(例):

      {
        "Roles": [
          {
              "AssumeRolePolicyDocument": {
                  "Version": "2012-10-17",
                  "Statement": [
                      {
                          "Action": "sts:AssumeRole",
                          "Principal": {
                              "Service": "cloudtrail.amazonaws.com"
                          },
                          "Effect": "Allow",
                          "Sid": ""
                      }
                  ]
              },
              "RoleId": "AROAJFCIGW6SZ3O4IYIH4",
              "CreateDate": "2015-05-10T05:28:07Z",
              "RoleName": "CloudTrail_CloudWatchLogs_Role-eu-west-1",
              "Path": "/",
              "Arn": "arn:aws:iam::XXXXXXXXXXXX:role/CloudTrail_CloudWatchLogs_Role-eu-west-1"
          }
        ]
      }


3.2. ロールポリシーの確認
-------------------------

```bash:コマンド:
aws iam list-role-policies \
        --role-name ${IAM_ROLE_NAME}
```

結果(例):

      {
        {
        "PolicyNames": [
          "policy_CloudTrail_CloudWatchLogs_Role-eu-west-1"
        ]
      }

```bash:コマンド:
aws iam get-role-policy \
        --role-name ${IAM_ROLE_NAME} \
        --policy-name ${IAM_ROLE_POLICY_NAME}
```

結果(例):

      {
        "RoleName": "CloudTrail_CloudWatchLogs_Role-eu-west-1",
        "PolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Action": [
                      "logs:CreateLogStream"
                  ],
                  "Resource": [
                      "arn:aws:logs:eu-west-1 :XXXXXXXXXXXX:log-group:CloudTrail/DefaultLogGroup:log-stream:XXXXXXXXXXXX-eu-west-1*"
                  ],
                  "Effect": "Allow",
                  "Sid": "AWSCloudTrailCreateLogStream20141101"
              },
              {
                  "Action": [
                      "logs:PutLogEvents"
                  ],
                  "Resource": [
                      "arn:aws:logs:eu-west-1 :XXXXXXXXXXXX:log-group:CloudTrail/DefaultLogGroup:log-stream:XXXXXXXXXXXX-eu-west-1*"
                  ],
                  "Effect": "Allow",
                  "Sid": "AWSCloudTrailPutLogEvents20141101"
              }
          ]
        },
        "PolicyName": "policy_CloudTrail_CloudWatchLogs_Role-eu-west-1"
      }


完了
====