はじめに
よくインスタンスプロファイルと IAM ロールを同じものと考えている人がいますが、厳密には異なります。
マネージメントコンソールを使用して EC2 インスタンスに IAM ロールを設定すると、自動的に IAM ロール名と同じインスタンスプロファイルが作成されるので、あまり意識していない人が多いのだと思います。
AWS CLI で EC2 インスタンスに IAM ロールを設定したい場合、インスタンスプロファイルを明示的に作成する必要があります。
イメージとしては以下となります。
検証
各設定値を予め環境変数に設定
マネージメントコンソールで作成されるインスタンスプロファイルと同様に、IAM ロールと同じ名前のインスタンスプロファイルを作成します。
InstanceProfileName=S3AdministratorForEC2
RoleName=$InstanceProfileName
PolicyArn=arn:aws:iam::aws:policy/AmazonS3FullAccess
IAM ロールを作成
{
"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 ロールの選択肢に表示されない」という場合は、インスタンスプロファイルが作成されていない可能性があります。
上記を参考にインスタンスプロファイルを作成して、状況が改善しないか試してみてください。