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


はじめに

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

検証

各設定値を予め環境変数に設定

マネージメントコンソールで作成されるインスタンスプロファイルと同様に、IAM ロールと同じ名前のインスタンスプロファイルを作成します。

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"
    }
  ]
}
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 ロールにポリシーをアタッチ

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

確認

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

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

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 ロールをアタッチする

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

結果

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 ロールの選択肢に表示されない」という場合は、インスタンスプロファイルが作成されていない可能性があります。
上記を参考にインスタンスプロファイルを作成して、状況が改善しないか試してみてください。

参考ドキュメント