[JAWS-UG CLI] IAM #58 IAMロールの作成(CodeDeploy)

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


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

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


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

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

- AWS CLI 1.11.14

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

結果(例):

      aws-cli/1.11.14 Python/2.7.10 Darwin/15.6.0 botocore/1.4.71

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======


変数の確認
----------

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

```bash:コマンド:
aws configure list
```

結果(例)

            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile         iamFull-prjz-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region                         ap-northeast-1  env    AWS_DEFAULT_REGION

AssumeRoleを利用している場合はprofileが '<not set>'と表示されます。 それ以外のときにprofileが '<not set>' と表示される場合は、以下を実行してください。

   変数の設定:

         export AWS_DEFAULT_PROFILE=<IAMユーザ名>


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


1.1. プリンシパルの決定
-----------------------

```bash:変数の設定:
IAM_PRINCIPAL='codedeploy.amazonaws.com'
```


1.2. IAMロール名の決定
----------------------

```bash:変数の設定:
IAM_ROLE_NAME='CodeDeployServiceRole'
```

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

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

結果(例):

      A client error (NoSuchEntity) occurred when calling the GetRole operation: The role with name CodeDeployServiceRole cannot be found.


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

```bash:変数の設定:
FILE_INPUT="${IAM_ROLE_NAME}.json" \
        && echo ${FILE_INPUT}
```

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

        FILE_INPUT:    ${FILE_INPUT}
        IAM_PRINCIPAL: ${IAM_PRINCIPAL}

ETX
```

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

cat ${FILE_INPUT}
```

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

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

エラーが出力されなければOKです。


2. 本作業
=========


IAMロールの作成
---------------

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

        IAM_ROLE_NAME: ${IAM_ROLE_NAME}
        FILE_INPUT:    ${FILE_INPUT}

ETX
```

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

結果(例):

      {
         "Role": {
           "AssumeRolePolicyDocument": {
               "Version": "2012-10-17",
               "Statement": [
                   {
                       "Action": "sts:AssumeRole",
                       "Sid": "",
                       "Effect": "Allow",
                       "Principal": {
                           "Service": "codedeploy.amazonaws.com"
                       }
                   }
               ]
           },
           "RoleId": "AROAXXXXXXXXXXXXXXXXX",
           "CreateDate": "2016-11-21T01:23:45.678Z",
           "RoleName": "CodeDeployServiceRole",
           "Path": "/",
           "Arn": "arn:aws:iam::XXXXXXXXXXXX:role/CodeDeployServiceRole"
         }
       }


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


4.1. IAMロールの確認
--------------------

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

結果(例):

      {
          "Role": {
            "AssumeRolePolicyDocument": {
                "Version": "2012-10-17",
                "Statement": [
                    {
                        "Action": "sts:AssumeRole",
                        "Principal": {
                            "Service": "codedeploy.amazonaws.com"
                        },
                        "Effect": "Allow",
                        "Sid": ""
                    }
                ]
            },
            "RoleId": "AROAXXXXXXXXXXXXXXXXX",
            "CreateDate": "2016-11-21T01:23:45Z",
            "RoleName": "CodeDeployServiceRole",
            "Path": "/",
            "Arn": "arn:aws:iam::XXXXXXXXXXXX:role/CodeDeployServiceRole"
          }
      }


完了
====