IAM Instance ProfileとAWS IAM Roleの関係とリソースタグ周りの仕様

記事タイトルとURLをコピーする

垣見です。
IAM Instance ProfileとAWS IAM Roleの違い、説明できますか?

私は誤解していて、Instance Profileにタグ付けをしてもIAMコンソール上で確認が出来ない!?とハマったのでまとめました。

結論

2つの観点で、それぞれ図にまとめました。

IAM Instance ProfileとAWS IAM Roleの関係

ポイント:

  • IAM Instance ProfileとAWS IAM Roleはそれぞれ別のもの(IAM Instance Profile は IAM Roleを紐付けるためのコンテナ)

リソースタグについて

 

ポイント:

  • IAM Instance Profileへのタグの付与Tag Editor及びInstance Profile用の専用APIiam tag-instance-profile共通API resourcegroupstaggingapi tag-resourcesから可能。IAMコンソール上では付与できない
  • AWS IAM Roleへのタグの付与IAMコンソール及びIAM Role用の専用APItag-role共通API resourcegroupstaggingapi tag-resourcesから可能。Tag Editorからは付与できない
  • IAM Instance Profileについたタグのコンソール上での確認はTag Editorから可能。IAMコンソール上では見られない。共通APIは使えない。
  • AWS IAM Roleについたタグのコンソール上での確認はIAMから可能。Tag Editorからは見られない。共通APIは使えない。

対象読者

以下の方を想定しています。

  • IAM Instance Profileとはなにか、AWS IAM Roleの関係が知りたい方
  • IAM Instance Profile=AWS IAM Roleだと思っている方
  • IAM Instance Profileへのタグ付けの方法およびコンソール上でのタグの確認方法が知りたい方
  • AWS IAM RoleのタグがTag Editorで確認できないことに驚きを感じている方

以下の情報は非対象です。リンク先のブログが参考になれば幸いです。

IAM Instance ProfileとAWS IAM Roleの関係

まず、IAM Instance ProfileとAWS IAM Roleはそれぞれ別のものです。
EC2を作るときにEC2用のIAM Roleを作成してInstance Profileとして紐づける流れがあります。

Amazon EC2 インスタンスを起動するときに、インスタンスに関連付ける IAM ロールを指定します。インスタンスプロファイルは、インスタンスの起動時に Amazon EC2 インスタンスにロール情報を渡すために使用できる IAM ロールのコンテナです
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_tags_instance-profiles.html

こんなイメージです

二者の分離

例えばこちらは「SSMManagedInstanceCore」という直球すぎるネーミングの「EC2用のIAM Role」です。
IAMコンソール > IAM Role のコンソール上には、(IAM Roleの)ARNとインスタンスプロファイルの ARNの2つが載っています。

「EC2用ではないIAM Role」はこんな表記です。もともと持っていたEKS用のIAMロールには、(IAM Roleの)ARNの表記のみあります。

IAM Instance Profileを確認する場所

先述の通り、IAMコンソール上からはProfileのARN以外の情報は見られません。
コンソール上でInstance Profileの一覧やタグを確認したい場合、タグエディタを使うと存在が見られます。(もしかしたらもっと簡単な方法があるかもしれません。教えてください。)

AWS CLIを使うとより詳細に確認できます。

$ aws iam list-instance-profiles
{
    "InstanceProfiles": [
        {
            "Path": "/",
            "InstanceProfileName": "AmazonSSMRoleForInstancesQuickSetup",
            "InstanceProfileId": "XXXXXXXXXXXXXXXXXXXXXXXX",
            "Arn": "arn:aws:iam::XXXXXXXXXXXX:instance-profile/AmazonSSMRoleForInstancesQuickSetup",
            "CreateDate": "2023-10-06T07:43:44+00:00",
            "Roles": [
                {
                    "Path": "/",
                    "RoleName": "AmazonSSMRoleForInstancesQuickSetup",
                    "RoleId": "ABCDEFGHIJK",
                    "Arn": "arn:aws:iam::XXXXXXXXXXXX:role/AmazonSSMRoleForInstancesQuickSetup",
                    "CreateDate": "2023-10-06T07:43:39+00:00",
                    "AssumeRolePolicyDocument": {
                        "Version": "2012-10-17",
                        "Statement": [
                            {
                                "Effect": "Allow",
                                "Principal": {
                                    "Service": "ec2.amazonaws.com"
                                },
                                "Action": "sts:AssumeRole"
                            }
                        ]
                    }
                }
            ]
        },
############## 省略 ####################
    ]
}

リソース名称とIAM Instance Profileの作成・削除について

コンソール上で作る場合IAM Roleの作り方と変わる箇所がないため、基本的には同一名称で作成されるようです。

CLI(create-instance-profileadd-role-to-instance-profile)で作成すると別々に作成できます。

↓test-profile-1113という名前のInstance Profileを作成。返ってきたRolesの中身は空っぽ。

$ aws iam create-instance-profile --instance-profile-name test-profile-1113
{
    "InstanceProfile": {
        "Path": "/",
        "InstanceProfileName": "test-profile-1113",
        "InstanceProfileId": "XXXXXXXXXXXXXXXXXXXXXXXXXX",
        "Arn": "arn:aws:iam:XXXXXXXXXXXX:instance-profile/test-profile-1113",
        "CreateDate": "2024-11-13T12:38:38+00:00",
        "Roles": []
    }
}

↓作成した Instance Profile に test-eks-role ロールを追加(EC2用のIAM Roleじゃなくてもつけられました)

$ aws iam add-role-to-instance-profile --instance-profile-name test-profile-1113 --role-name test-eks-role

結果、タグエディタに作成した Instance Profile が登場し、

先ほどはARN(IAM RoleのARN)の表記のみだったEKS用のIAMロールにインスタンスプロファイルの ARNが登場しました。

信頼されたエンティティがEKSなのにインスタンスプロファイルになれていますね!面白!
DAX(DynamoDB)用にもこの通り

作ったインスタンスプロファイルを削除してみます。

↓そのままInstance Profileを消そうとすると「先にIAM RoleをRemoveしろ」と怒られます。

$ aws iam delete-instance-profile --instance-profile-name test-profile-1113

An error occurred (DeleteConflict) when calling the DeleteInstanceProfile operation: Cannot delete entity, must remove roles from instance profile first.

↓そのままRoleを消そうとしても同じく、「先にIAM RoleをRemoveしろ」と怒られます。

$ aws iam delete-role --role-name test-profile-1113

An error occurred (DeleteConflict) when calling the DeleteRole operation: Cannot delete entity, must remove roles from instance profile first.

↓Removeしてから消すと消えます。IAM Roleは消えません。

$ aws iam remove-role-from-instance-profile --instance-profile-name test-profile-1113 --role-name test-dynamodb-role
$ aws iam delete-instance-profile --instance-profile-name test-profile-1113

気になったのでコンソール上で作ったEC2用Instance Profileでも試しましたが同じ挙動でした。

よく見るとコンソール上でIAM Roleを消すときにはInstance Profileも消えるって書いてある!

あと、昔作ったCloud9については特に何もしてなかったはずですが、もともとRoleとInstance Profileの名前が違います。スラッシュも一段多いので例外として注意が必要です。

タグ付与・閲覧について

AWS IAM RoleとIAM Instance Profileではコンソール上でのタグを操作する方法が異なります。また、resourcetaggingapiという共通APIから使えるアクションと使えないアクションがあります。

AWS IAM Roleへのタグ付け

AWS IAM Roleへのタグ付けは皆様おなじみのIAMコンソール及びIAM Role用の専用APItag-role共通API resourcegroupstaggingapi tag-resourcesから可能です。Tag Editorからは付与できません

IAMコンソールではここからつけられます。 このとき、IAM Instance Profileに紐づいたIAM Roleであっても、ここからタグ付けできるのはIAM Roleだけであることに注意してください。

AWS CLIだとこんな感じです。

専用API tag-role

$ aws iam tag-role --role-name SSMManagedInstanceCore --tags Key=test,Value=role-tag

または共通API resourcegroupstaggingapi tag-resources

$ aws resourcegroupstaggingapi tag-resources \
    --resource-arn-list arn:aws:iam::351611181035:role/SSMManagedInstanceCore \
    --tags test=role-tag

この場合、Keyがtest、Valueがrole-tagのタグが付きます。

また、タグエディタからはIAM Roleにタグを付与したり、そもそも参照したりすることが出来ません。

そもそも存在しない

公式ドキュメントResource types you can use with AWS Resource Groups and Tag Editorにも以下のように書いてあります。

2024/11/13現在

IAM Instance Profileへのタグ付け

IAM Instance Profileへのタグ付けは、Tag Editor及びInstance Profile用の専用APIiam tag-instance-profile共通API resourcegroupstaggingapi tag-resourcesから可能です。IAMコンソール上では付与できません

タグエディタからの実施画面は以下の通りです。Key=test, Value=tag-editorというタグを付けてみましょう。

AWS CLI または AWS API を使用するときに、インスタンスプロファイルにタグを付けることができますhttps://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_tags_instance-profiles.html

AWS CLIだとこんな感じです。Key=test2, Value=Instanceprofile-tagを追加しています。

専用API iam tag-instance-profile

$ aws iam tag-instance-profile --instance-profile-name SSMManagedInstanceCore --tags Key=test2,Value=Instanceprofile-tag

または共通API resourcegroupstaggingapi tag-resources

$ aws resourcegroupstaggingapi tag-resources \
    --resource-arn-list arn:aws:iam::XXXXXXXXXXXX:instance-profile/SSMManagedInstanceCore \
    --tags test2=Instanceprofile

ちなみにKey=testにすると、先ほどタグエディタ上でつけたKey=test, Value=tag-editorが上書きされます。
キーが同じタグは付けられません。1リソースに同じキーは一つまでです。

では、反映されたか確認してみましょう。

先ほどは無かったタグエディタ右下の「②」をクリックすると…
お~、反映されています

resourcetaggingapi経由のタグ付与・閲覧について

上記の例では、専用APIと共通APIというものを使っていました。

この世には「ARNさえわかればほぼどのリソースに対しても同じ構文でタグ付けできる」という素晴らしい機能を持った共通API「 resourcegroupstaggingapi tag-resources」が存在し、IAM RoleとInstance Profileも対応してくれています。

ですので、ARNさえわかればどちらも同じ構文でタグ付けが可能です。

しかし、同じくresourcegroupstaggingapi の get-resourcesというAPIについては、IAM RoleとInstance Profileはどうやら未対応の様です…。

IAM users and roles can only be used in TagResource and UntagResources operations. The GetResources operation does not currently support IAM users and roles.
https://docs.aws.amazon.com/resourcegroupstagging/latest/APIReference/supported-services.html

エラーは出ないが取得されない

こちらはタグ付けされたリソースを返してくれるAPIで、特に「ある任意のタグ」をフィルターしてそれが付いたリソースを返してくれるような動きができます。

例えば、「特定のタグが着いているリソースを判定(get処理)して新たなタグ付けをする」といった場合ですね。(このような場合は,数が少なければタグエディタ上で直接対応するのがおすすめです

AWS CLIで実施したい場合は、それぞれの専門API(list-role-tagslist-instance-profile-tags)を使う必要があります

ARNではなくリソース名が必要になり、--role-name--instance-profile-nameというそれぞれ独自のパラメータを命令文に入れる必要がでてきます。同じような処理を多数のリソースに実施したい場合「Instance Profileの処理」「IAM Roleの処理」と場合分けさせる必要があるので、スクリプト制作時の手間がやや増えます。

※resourcetaggingapiによるタグ付けがサポートされているサービス一覧については以下をご覧ください。
Services that support the Resource Groups Tagging API - Resource Groups Tagging API

まとめ

いかがでしたでしょうか?
自分は完全にInstance Profileについて誤解していたので、この機会に調べられて良かったです。

このブログが皆様のお役に立てれば幸いです。

垣見(かきみ)(執筆記事の一覧)

2023年新卒入社 エンタープライズクラウド部所属

図解するのが好き。「サバワク」のアイキャッチ作成も担当しています