[JAWS-UG CLI] IAM Managed Policy:#17-4 Customer Managed Policyの更新

# 前提条件

* [[JAWS-UG CLI] IAM Managed Policy:#17 作業用IAMユーザの作成](http://qiita.com/domokun70cm/private/fc7ed35c9cfef6f34723) による設定作業が完了していること
* [[JAWS-UG CLI] IAM Managed Policy:#17 Customer Managed Policiesの利用](http://qiita.com/domokun70cm/private/51b53f38126d5f71e5d5) による設定作業が完了していること

# 1. Policy Documentの編集（Versionの追加）

## 1.1. 新しいポリシーの作成

ポリシーファイルのファイル名を決めます。

```bash:command
FILE_NEW_MANAGED_POLICY_DOC="New_${IAM_MANAGED_POLICY_NAME}.json"
echo ${FILE_NEW_MANAGED_POLICY_DOC}
```

```text:resut
New_S3_ManagedPolicy.json
```

ポリシーファイルを作成します。
（書き込みを禁止します。）

```bash:command
cat << EOF > ${FILE_NEW_MANAGED_POLICY_DOC}
{
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "s3:*"
            ],
            "Resource": "*"
          },
          {
            "Effect": "Deny",
            "Action": [
              "s3:Put*"
            ],
            "Resource": "*"
          }
        ]
}
EOF
```

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

```bash:commnad
jsonlint -q ${FILE_NEW_MANAGED_POLICY_DOC}
```

```text:result
（戻り値なし）
```

## 1.2. ポリシーの変更

変数の確認

```bash:commnad
cat << ETX
        IAM_MANAGED_POLICY_ARN: ${IAM_MANAGED_POLICY_ARN}
        FILE_NEW_MANAGED_POLICY_DOC: ${FILE_NEW_MANAGED_POLICY_DOC}
ETX
```

```text:result
        IAM_MANAGED_POLICY_ARN: arn:aws:iam::************:policy/jawsug-cli/S3_ManagedPolicy
        FILE_NEW_MANAGED_POLICY_DOC: New_S3_ManagedPolicy.json
```

現状を確認

```bash:command
aws iam get-policy --policy-arn ${IAM_MANAGED_POLICY_ARN}
```

```text:result
{
    "Policy": {
        "PolicyName": "S3_ManagedPolicy",
        "CreateDate": "2015-04-11T15:24:39Z",
        "AttachmentCount": 1,
        "IsAttachable": true,
        "PolicyId": "A********************",
        "DefaultVersionId": "v1",
        "Path": "/jawsug-cli/",
        "Arn": "arn:aws:iam::************:policy/jawsug-cli/S3_ManagedPolicy",
        "UpdateDate": "2015-04-11T15:24:39Z"
    }
}
```

ポリシーを更新
（ただし、適用はしない）

```bash:command
aws iam create-policy-version --policy-arn ${IAM_MANAGED_POLICY_ARN} --policy-document file://${FILE_NEW_MANAGED_POLICY_DOC}
```

```text:result
{
    "PolicyVersion": {
        "CreateDate": "2015-03-28T13:06:44.682Z",
        "VersionId": "v2",
        "IsDefaultVersion": false
    }
}
```

現状を確認
**（DefaultVersionIdが変わっていないことに注目してください。）**

```bash:command
aws iam get-policy --policy-arn ${IAM_MANAGED_POLICY_ARN}
```

```text:result
{
    "Policy": {
        "PolicyName": "S3_ManagedPolicy",
        "CreateDate": "2015-04-11T15:24:39Z",
        "AttachmentCount": 1,
        "IsAttachable": true,
        "PolicyId": "A********************",
        "DefaultVersionId": "v1",
        "Path": "/jawsug-cli/",
        "Arn": "arn:aws:iam::************:policy/jawsug-cli/S3_ManagedPolicy",
        "UpdateDate": "2015-04-11T15:31:14Z"
    }
}
```

# 2. Default Versionの変更

## 2.1. Default Versionの変更

変数の確認

```bash:commnad
cat << ETX
        IAM_MANAGED_POLICY_ARN: ${IAM_MANAGED_POLICY_ARN}
ETX
```

```text:result
        IAM_MANAGED_POLICY_ARN: arn:aws:iam::************:policy/jawsug-cli/S3_ManagedPolicy
```

Default Versionを変更

```bash:commnad
aws iam set-default-policy-version --policy-arn ${IAM_MANAGED_POLICY_ARN} --version-id "v2"
```

```text:result
（戻り値なし）
```

現状を確認
**（DefaultVersionIdが変わったことに注目してください。）**

```bash:command
aws iam get-policy --policy-arn ${IAM_MANAGED_POLICY_ARN}
```

```text:result
{
    "Policy": {
        "PolicyName": "S3_ManagedPolicy",
        "CreateDate": "2015-04-11T15:24:39Z",
        "AttachmentCount": 1,
        "IsAttachable": true,
        "PolicyId": "A********************",
        "DefaultVersionId": "v2",
        "Path": "/jawsug-cli/",
        "Arn": "arn:aws:iam::************:policy/jawsug-cli/S3_ManagedPolicy",
        "UpdateDate": "2015-04-11T15:33:33Z"
    }
}
```

# 3. 動作確認

## 3.1. ファイルをアップロード

アップロードするファイル名を決定

```bash:command
FILE_LOCAL='test03.txt'
```

```text:result
（戻り値なし）
```

アップロードするファイルを作成

```bash:command
touch ${FILE_LOCAL}
```

```text:result
（戻り値なし）
```

ファイルをアップロード

```bash:command
aws s3 cp ${FILE_LOCAL} s3://${S3_BUCKET_NAME}/
```

```text:result
upload failed: ./test03.txt to s3://jaws-ug-cli-17-handson/test03.txt A client error (AccessDenied) occurred when calling the PutObject operation: Access Denied
```

# 4. ロールバック

```bash:commnad
aws iam set-default-policy-version --policy-arn ${IAM_MANAGED_POLICY_ARN} --version-id "v1"
```

```text:result
（戻り値なし）
```

現状を確認
**（DefaultVersionIdが元に戻っていることに注目してください。）**

```bash:command
aws iam get-policy --policy-arn ${IAM_MANAGED_POLICY_ARN}
```

```text:result
{
    "Policy": {
        "PolicyName": "S3_ManagedPolicy",
        "CreateDate": "2015-04-11T15:24:39Z",
        "AttachmentCount": 1,
        "IsAttachable": true,
        "PolicyId": "A********************",
        "DefaultVersionId": "v1",
        "Path": "/jawsug-cli/",
        "Arn": "arn:aws:iam::************:policy/jawsug-cli/S3_ManagedPolicy",
        "UpdateDate": "2015-04-11T15:34:57Z"
    }
}
```

ファイルをアップロード

```bash:command
aws s3 cp ${FILE_LOCAL} s3://${S3_BUCKET_NAME}/
```

```text:result
upload: ./test03.txt to s3://jaws-ug-cli-17-handson/test03.txt
```

# 5. （おまけ）Versionを5世代より多く保持できないことを確認

## 5.1. ポリシーの更新

以下のコマンドを3回繰り返し、保持できるバージョンを上限まで作成します

```bash:command
aws iam create-policy-version --policy-arn ${IAM_MANAGED_POLICY_ARN} --policy-document file://${FILE_NEW_MANAGED_POLICY_DOC}
```

```text:result
{
    "PolicyVersion": {
        "CreateDate": "2015-03-28T13:06:44.682Z",
        "VersionId": "v3",
        "IsDefaultVersion": false
    }
}
```

```bash:command
aws iam create-policy-version --policy-arn ${IAM_MANAGED_POLICY_ARN} --policy-document file://${FILE_NEW_MANAGED_POLICY_DOC}
```

```text:result
{
    "PolicyVersion": {
        "CreateDate": "2015-03-28T13:06:44.682Z",
        "VersionId": "v4",
        "IsDefaultVersion": false
    }
}
```

```bash:command
aws iam create-policy-version --policy-arn ${IAM_MANAGED_POLICY_ARN} --policy-document file://${FILE_NEW_MANAGED_POLICY_DOC}
```

```text:result
{
    "PolicyVersion": {
        "CreateDate": "2015-03-28T13:06:44.682Z",
        "VersionId": "v5",
        "IsDefaultVersion": false
    }
}
```

上限以上のポリシーを作成

```bash:command
aws iam create-policy-version --policy-arn ${IAM_MANAGED_POLICY_ARN} --policy-document file://${FILE_NEW_MANAGED_POLICY_DOC}
```

```text:result
A client error (LimitExceeded) occurred when calling the CreatePolicyVersion operation: A managed policy can have up to 5 versions. Before you create a new version, you must delete an existing version.
```

# 6. （おまけ）Groupに3つ以上のManaged Policyを割り当てることができないことを確認

## 6.1. AWS Managed Policiesを適用

```bash:command
AWS_Managed_Policy_ARN_1='arn:aws:iam::aws:policy/AmazonEC2ReportsAccess'
AWS_Managed_Policy_ARN_2='arn:aws:iam::aws:policy/AmazonRDSReadOnlyAccess'
```

2つ目のポリシーをアタッチ

```bash:command
aws iam attach-group-policy --group-name ${IAM_GROUP_NAME} --policy-arn ${AWS_Managed_Policy_ARN_1}
```

```text:result
（戻り値なし）
```

3つ目のポリシーをアタッチ

```bash:command
aws iam attach-group-policy --group-name ${IAM_GROUP_NAME} --policy-arn ${AWS_Managed_Policy_ARN_2}
```

```text:result
A client error (LimitExceeded) occurred when calling the AttachGroupPolicy operation: Cannot exceed quota for PoliciesPerGroup: 2
```

2つ目のポリシーをデタッチ

```bash:command
aws iam detach-group-policy --group-name ${IAM_GROUP_NAME} --policy-arn ${AWS_Managed_Policy_ARN_1}
```

```text:result
（戻り値なし）
```