AWS CLI で EC2 インスタンスプロファイルを作成する方法

# はじめに

よくインスタンスプロファイルと IAM ロールを同じものと考えている人がいますが、厳密には異なります。
マネージメントコンソールを使用して EC2 インスタンスに IAM ロールを設定すると、自動的に IAM ロール名と同じインスタンスプロファイルが作成されるので、あまり意識していない人が多いのだと思います。
AWS CLI で EC2 インスタンスに IAM ロールを設定したい場合、インスタンスプロファイルを明示的に作成する必要があります。
イメージとしては以下となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149578/c09e487a-0901-dc3d-6380-d9baf60eb766.png)

# 検証

## 各設定値を予め環境変数に設定
マネージメントコンソールで作成されるインスタンスプロファイルと同様に、IAM ロールと同じ名前のインスタンスプロファイルを作成します。

```bash
InstanceProfileName=S3AdministratorForEC2
RoleName=$InstanceProfileName
PolicyArn=arn:aws:iam::aws:policy/AmazonS3FullAccess
```

## IAM ロールを作成

```assume-role-policy-document.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

```bash
aws iam create-role \
 --role-name $RoleName \
 --assume-role-policy-document file://assume-role-policy-document.json
{
    "Role": {
        "Path": "/",
        "RoleName": "S3AdministratorForEC2",
        "RoleId": "XXXXXXXXXXXXXXXXXXXX",
        "Arn": "arn:aws:iam::XXXXXXXXXXX:role/S3AdministratorForEC2",
        "CreateDate": "2020-03-27T01:43:30Z",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "ec2.amazonaws.com"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        }
    }
}
```

##  IAM ロールにポリシーをアタッチ

```bash
aws iam attach-role-policy \
--role-name $RoleName \
--policy-arn $PolicyArn
```

###  確認

```bash
aws iam list-attached-role-policies \
--role-name $RoleName
{
    "AttachedPolicies": [
        {
            "PolicyName": "AmazonS3FullAccess",
            "PolicyArn": "arn:aws:iam::aws:policy/AmazonS3FullAccess"
        }
    ]
}
```

## インスタンスプロファイルを作成

```bash
aws iam create-instance-profile \
 --instance-profile-name $InstanceProfileName
{
    "InstanceProfile": {
        "Path": "/",
        "InstanceProfileName": "S3AdministratorForEC2",
        "InstanceProfileId": "XXXXXXXXXXXXXXXX",
        "Arn": "arn:aws:iam::XXXXXXXXXXXXXXXXX:instance-profile/S3AdministratorForEC2",
        "CreateDate": "2020-03-27T01:43:59Z",
        "Roles": []
    }
}
```

## インスタンスプロファイルに IAM ロールをアタッチする

```bash
aws iam add-role-to-instance-profile \
--instance-profile-name $InstanceProfileName \
--role-name $RoleName
```

# 結果

```bash
aws iam get-instance-profile \
--instance-profile-name $InstanceProfileName
{
    "InstanceProfile": {
        "Path": "/",
        "InstanceProfileName": "S3AdministratorForEC2",
        "InstanceProfileId": "XXXXXXXXXXXXXXXXXXX",
        "Arn": "arn:aws:iam::XXXXXXXXXXXXXX:instance-profile/S3AdministratorForEC2",
        "CreateDate": "2020-03-27T01:43:59Z",
        "Roles": [
            {
                "Path": "/",
                "RoleName": "S3AdministratorForEC2",
                "RoleId": "XXXXXXXXXXXXXXXXX",
                "Arn": "arn:aws:iam::XXXXXXXXXXXXXX:role/S3AdministratorForEC2",
                "CreateDate": "2020-03-27T01:43:30Z",
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17",
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {
                                "Service": "ec2.amazonaws.com"
                            },
                            "Action": "sts:AssumeRole"
                        }
                    ]
                }
            }
        ]
    }
}
```

# まとめ

上記のようにして、AWS CLI でインスタンスプロファイルを作成することが出来ます。
作成したインスタンスプロファイルは、もちろん EC2 インスタンス起動時に指定することも可能ですし、マネージメントコンソールや AWS CLI で既存の EC2 インスタンスにアタッチすることも可能です。
「EC2 インスタンスに設定したい IAM ロールが、EC2 インスタンスに設定する IAM ロールの選択肢に表示されない」という場合は、インスタンスプロファイルが作成されていない可能性があります。
上記を参考にインスタンスプロファイルを作成して、状況が改善しないか試してみてください。

# 参考ドキュメント

- [iam — AWS CLI 1.18.30 Command Reference](https://docs.aws.amazon.com/cli/latest/reference/iam/index.html)
- [Using Instance Profiles - AWS Identity and Access Management](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html)