垣見です。
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-profile、add-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が登場しました。
作ったインスタンスプロファイルを削除してみます。
↓そのまま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
あと、昔作った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にも以下のように書いてあります。
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-tags、list-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について誤解していたので、この機会に調べられて良かったです。
このブログが皆様のお役に立てれば幸いです。