はじめに
EC2インスタンスにIAMロールが付与されている仕組みについて少し勘違いしていたのでその備忘録となります。
EC2インスタンスにIAMロールが付与される仕組み
EC2インスタンスにIAMロールを付与する際には、インスタンスプロファイルという仕組みを使用してIAMロールを付与します。
インスタンスプロファイルとは、EC2インスタンスに対して、IAMロールを与える入れ物のようなもので、このプロファイルを通じてIAMロールをEC2インスタンスに割り当てることができます。
このインスタンスプロファイルを使用することでEC2インスタンスに対して、IAMロールを付与することができ、異なるAWSサービスに対してのアクセス権限等を管理することができます。
また、インスタンスプロファイルとIAMロールは1対1で設定がされる仕様です。
勘違いしてた理由
コンソール上でEC2インスタンスを作成する際、以下の画像のように既存のインスタンスプロファイルを選択できる項目が存在します。
※画像のs3-FullAccessというのはインスタンスプロファイル名なのですが、既に作成済みのIAMロール名でもあります。
ここで勘違いしてしまっていたのが、IAMロールの名前と同じ名前でインスタンスプロファイルが作成されているのでIAMロールが直接付与されていると勘違いしていました。
以下のとおり、インスタンスプロファイルはIAMロールが作成される際に、同じ名前で作成されると記載がありますね。
■公式ドキュメントから抜粋
AWS Management Console を使用して Amazon EC2 のロールを作成する場合、コンソールはインスタンスプロファイルを自動的に作成し、そのインスタンスプロファイルにロールと同じ名前を付けます。
EC2インスタンス作成後、「セキュリティ」タブを確認するとIAMロールという項目があるのですが、こちらは付与されているIAMロール単体を指しているわけではなく、インスタンスプロファイル内のIAMロールを示しています。
※詳細は後述しております。
実際に確認してみる
それでは、実際にインスタンスプロファイルにIAMロールが設定されているかをAWS CLIで確認してみます。
- AWS CLIからの確認画面
$ aws iam list-instance-profiles
{
"InstanceProfiles": [
{
"Path": "/",
"InstanceProfileName": "s3-FullAccess",
"InstanceProfileId": "AIPA4SYAMHHXJSWCLUZYG",
"Arn": "arn:aws:iam::<account-id>:instance-profile/s3-FullAccess",
"CreateDate": "2025-04-12T00:01:10+00:00",
"Roles": [
{
"Path": "/",
"RoleName": "s3-FullAccess",
"RoleId": "AROA4SYAMHHXG7I2Y2XF3",
"Arn": "arn:aws:iam::<account-id>:role/s3-FullAccess",
"CreateDate": "2025-04-12T00:01:10+00:00",
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
:
インスタンスプロファイル名がs3-FullAccessでIAMロール名もs3-FullAccessで設定されています。
しかし、AWS CLIまたはAWS API(IaCツールなど)ではインスタンスプロファイルを作成しても、IAMロールとの紐づけの設定は自動では行ってくれないので注意が必要です。
■公式ドキュメントから抜粋
AWS CLI または AWS API からロールを管理する場合、ロールとインスタンスプロファイルを別個のアクションとして作成します。
では、実際にAWS CLIでインスタンスプロファイルを作成して確認してみましょう。
sample-profileという名前でインスタンスプロファイルを新規で作成します。
$ aws iam create-instance-profile --instance-profile-name sample-profile
{
"InstanceProfile": {
"Path": "/",
"InstanceProfileName": "sample-profile",
"InstanceProfileId": "AIPA4SYAMHHXEAK2RJHPG",
"Arn": "arn:aws:iam::<account-id>:instance-profile/sample-profile",
"CreateDate": "2025-04-12T01:51:52+00:00",
"Roles": []
}
}
作成後、インスタンスプロファイルのリストを取得します。
$ aws iam list-instance-profiles
{
"InstanceProfiles": [
{
"Path": "/",
"InstanceProfileName": "s3-FullAccess",
"InstanceProfileId": "AIPA4SYAMHHXJSWCLUZYG",
"Arn": "arn:aws:iam::<account-id>:instance-profile/s3-FullAccess",
"CreateDate": "2025-04-12T00:01:10+00:00",
"Roles": [
{
"Path": "/",
"RoleName": "s3-FullAccess",
"RoleId": "AROA4SYAMHHXG7I2Y2XF3",
"Arn": "arn:aws:iam::<account-id>:role/s3-FullAccess",
"CreateDate": "2025-04-12T00:01:10+00:00",
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
}
]
},
{
"Path": "/",
"InstanceProfileName": "sample-profile",
"InstanceProfileId": "AIPA4SYAMHHXEAK2RJHPG",
"Arn": "arn:aws:iam::<account-id>4:instance-profile/sample-profile",
"CreateDate": "2025-04-12T01:51:52+00:00",
"Roles": []
}
]
}
当たり前ですけど何もロールが設定されていないですね。
では、この状態でコンソールから新規でEC2インスタンスを作成したらどうなるのでしょうか?
先ほど記述した「セキュリティ」タブのIAMロールの項目では以下のように表示されました。
インスタンスプロファイルにアタッチされたロールがありません: sample-profile
この表示内容からもインスタンスプロファイル内のIAMロールが付与されており、この「セキュリティ」タブに表示されていた、ということで間違いではないのかなと思います。
まとめ
今回調べてわかったことは以下となります。
- EC2インスタンスにIAMロールが付与される仕組みは、実はインスタンスプロファイル内のIAMロールがEC2インスタンスに付与されていた
- IAMロールを作成後、同じ名前のインスタンスプロファイルも自動で作成される
- EC2インスタンスのセキュリティタブに記載されているものはIAMロール単体ではなく、インスタンスプロファイル内のIAMロールだった
- インスタンスプロファイルとIAMロールは別物なので、AWS CLIやAWS API(IaCツールなど)経由でインスタンスプロファイルだけ作成しても、それは単純に別でインスタンスプロファイルを作成しただけとなる
資格勉強や本などで知識的には知っていたけど、いざ実際にAWSに触れてみると、意外にわかっていなかったりすることが多いと感じますね。あと、公式ドキュメントはわかっているつもりのところもちゃんと目を通しておきましょうというところで学びになりましたね~