AWS CLIメモ： IAM ROLE作成

コンソール操作（通称：ぽちぽち）ではなく、AWS CLIでEC2用のIAM ROLEを作成するメモ


参考）
http://docs.aws.amazon.com/cli/latest/reference/iam/create-role.html
http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html


やるべきことは以下
1. IAM ROLEの作成 （Assume Role ポリシーを指定する）
2. インラインポリシーを作成する
3. インラインポリシーをROLEに割り当てる(アタッチ)
4. インスタンスプロファイルを作成する
5. ROLEをインスタンスプロファイルに割り当てる

各機能のざっくりした理解は以下
・IAM ROLE： AWSサービスに対するアクセス権。例えばどのS3バケットに何をして良いかなど
・インラインポリシー：　ROLEに割り当てるアクセス権の詳細を規定する
・AssumeRoleポリシー　：アクセス許可を委任するAWSサービスを規定する
・インスタンスプロファイル： EC2起動時にロール情報を渡すために使用

はじめは正直どれもイマイチピンとこない。。。
特にAssumeRolePolicyとインスタンスプロファイルあたり。

ポリシーについてはインラインポリシーの他に管理ポリシーというものもある。
ざっくりした違いは、前者が個別に作成するポリシーで、後者は複数ユーザやグループなどでの使い回しを想定したポリシー。

AssumeRoleポリシーについて、今回は「EC2に対して、インラインポリシーで規定したアクセス権を与えますよ」と定義したいので、「EC2にに対して」という部分(権限を渡すAWSサービス)を指定するためのもの。

次に、インスタンスプロファイルはハマりやすいポイント。
その理由としては、コンソールでROLEを作成すると、インスタンスプロファイルは自動生成されるため意識することはないが、CLIでは自動生成されないため、自分で作成して対応付けする必要がある。
この対応をしない場合、EC2立ち上げ時にROLEを付与しようとしても、付与できない（コンソールではリストに表示されない）


CLIコマンド例は以下

## IAM ROLEの作成
```
aws iam create-role --role-name [IAM ROLE名] --assume-role-policy-document file://[AssumeRoleポリシーJSONファイルのパス]
```
※AssumeRoleポリシーをJSONで別途作成しておく


## インラインポリシーを作成
```
aws iam create-policy --policy-name [インラインポリシー名] --policy-document file://[インラインポリシーJSONファイルのパス]
```
※インラインポリシーをJSONで別途作成しておく

## インラインポリシーをROLEにアタッチする
```
aws iam attach-role-policy --policy-arn [ARN ID] --role-name [IAM ROLE名]
```
ここで、ARM IDは、インラインポリシーを生成すると発行されるポリシーの識別ID。
シェル芸で対応するなら、インラインポリシー作成とセットで、パイプとjqを活用して以下のように取得できる

```
arn_id=`aws iam create-policy --policy-name [インラインポリシー名] --policy-document file://[インラインポリシーJSONファイルのパス] |jq -r '.Policy | .Arn'`
```

AWS CLI documentの例で示すと、aws iam create-policyを実行すると以下のような標準出力を得られるので、jqでArnキーの値をゲットしているだけ。

http://docs.aws.amazon.com/cli/latest/reference/iam/create-policy.html

```
{
    "Policy": {
        "PolicyName": "my-policy",
        "CreateDate": "2015-06-01T19:31:18.620Z",
        "AttachmentCount": 0,
        "IsAttachable": true,
        "PolicyId": "ZXR6A36LTYANPAI7NJ5UV",
        "DefaultVersionId": "v1",
        "Path": "/",
        "Arn": "arn:aws:iam::0123456789012:policy/my-policy",
        "UpdateDate": "2015-06-01T19:31:18.620Z"
    }
}
```

## インスタンスプロファイルを作成する
```
aws iam create-instance-profile --instance-profile-name [インスタンスプロファイル名]
```
インスタンスプロファイル名はIAM ROLE名と同じで良い。
コンソール操作による自動生成では同じとなる。


## IAM ROLEをインスタンスプロファイルに追加する
```
aws iam add-role-to-instance-profile --role-name [IAM ROLE名] --instance-profile-name [インスタンスプロファイル名]
```


## インラインポリシー例
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket/*",
                "arn:aws:s3:::my-bucket"
            ],
            "Condition": {
                "Bool": {
                    "aws:SecureTransport": "true"
                }
            }
        }
    ]
}
```

## Assume Role Policy例
```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```