[JAWS-UG CLI] IAM Managed Policy:#17-3 Customer Managed Policyの作成

# 前提条件

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

# 1. Managed Policyの作成

## 1.1. Managed Policyの名前の決定

ポリシー名を決定します。

```bash:commnad
IAM_MANAGED_POLICY_NAME="S3_ManagedPolicy"
```

ARNでポリシーを指定するため、AWSアカウントIDを確認します。

```bash:commnad
AWS_ACCOUNT_ID=`aws iam get-user --user-name ${IAM_USER_NAME} | jq -r .[].Arn | awk -F':' '{print $5}'`
echo ${AWS_ACCOUNT_ID}
```

```text:result
************
```

同じ名前のポリシーが無いことを確認


```bash:commnad
IAM_MANAGED_POLICY_ARN="arn:aws:iam::"${AWS_ACCOUNT_ID}":policy"${PATH_NAME}${IAM_MANAGED_POLICY_NAME}
```

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

```text:result
A client error (NoSuchEntity) occurred when calling the GetPolicy operation: Policy arn:aws:iam::************:policy/S3_Managed does not exist.
```

## 1.2. Policy Documentの作成

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

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

```text:resut
S3_ManagedPolicy.json
```

ポリシーファイルを作成します。

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

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

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

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

## 1.3. ポリシーの作成

変数の確認

```bash:commnad
cat << ETX
        PATH_NAME: ${PATH_NAME}
        IAM_MANAGED_POLICY_NAME: ${IAM_MANAGED_POLICY_NAME}
        FILE_MANAGED_POLICY_DOC: ${FILE_MANAGED_POLICY_DOC}
ETX
```

```text:result
        IAM_MANAGED_POLICY_NAME: S3_Managed
        FILE_MANAGED_POLICY_DOC: S3_Managed.json
```

ポリシーを作成

```bash:command
aws iam create-policy --policy-name ${IAM_MANAGED_POLICY_NAME} --path ${PATH_NAME} --policy-document file://${FILE_MANAGED_POLICY_DOC}
```

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

## 1.4. Customer Managed PolicyをIAM Groupにアタッチ

変数の確認

```bash:command
cat << ETX
        IAM_GROUP_NAME: ${IAM_GROUP_NAME}
        IAM_MANAGED_POLICY_ARN: ${IAM_MANAGED_POLICY_ARN}
ETX
```

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

Customer Managed PolicyをIAM Groupにアタッチ

```bash:commnad
aws iam attach-group-policy --group-name ${IAM_GROUP_NAME} --policy-arn ${IAM_MANAGED_POLICY_ARN}
```

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

IAMグループにAWS Managed Policyがアタッチされたことを確認します。

```bash:commnad
aws iam list-attached-group-policies --group-name ${IAM_GROUP_NAME}
```

```text:result
{
    "AttachedPolicies": [
        {
            "PolicyName": "S3_ManagedPolicy",
            "PolicyArn": "arn:aws:iam::************:policy/jawsug-cli/S3_ManagedPolicy"
        }
    ],
    "IsTruncated": false
}
```

## 1.5. （おまけ）Policy Documentで指定したグループ以外に対してManaged Policyをアタッチできないことを確認

テスト用IAMグループの決定

```bash:commnad
IAM_TEST_GROUP_NAME="IAM_test"
```

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

```bash:command
aws iam get-group --group-name ${IAM_TEST_GROUP_NAME}
```

```text:result
A client error (NoSuchEntity) occurred when calling the GetGroup operation: The group with name IAM_test cannot be found.
```

変数の確認

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

```text:result
            IAM_TEST_GROUP_NAME: IAM_test
```

IAMグループを作成します。

```bash:commnad
aws iam create-group --group-name ${IAM_TEST_GROUP_NAME}
```

```text:result
{
    "Group": {
        "Path": "/",
        "CreateDate": "2015-04-11T15:50:09.809Z",
        "GroupId": "A********************",
        "Arn": "arn:aws:iam::************:group/IAM_test",
        "GroupName": "IAM_test"
    }
}
```

Customer Managed PolicyをIAM Groupにアタッチ

```bash:commnad
aws iam attach-group-policy --group-name ${IAM_TEST_GROUP_NAME} --policy-arn ${IAM_MANAGED_POLICY_ARN}
```

```text:result
A client error (AccessDenied) occurred when calling the AttachGroupPolicy operation: User: arn:aws:iam::698675364418:user/IAM_limited-JAWSUG_CLI_17-Coedo is not authorized to perform: iam:AttachGroupPolicy on resource: group IAM_test
```

テスト用グループを削除

```bash:command
aws iam delete-group --group-name ${IAM_TEST_GROUP_NAME}
```

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

確認

```bash:command
aws iam get-group --group-name ${IAM_TEST_GROUP_NAME}
```

```text:result
A client error (NoSuchEntity) occurred when calling the GetGroup operation: The group with name IAM_test cannot be found.
```

# 2. 動作確認

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

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

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

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


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

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

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

ファイルをアップロード

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

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

ファイルがアップロードされたことを確認

```bash:command
aws s3 ls s3://${S3_BUCKET_NAME}/
```

```text:result
2015-04-04 11:47:23          0 test01.txt
2015-04-04 12:15:57          0 test02.txt
```