この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
EC2インスタンスにアタッチされているIAMロールを一覧で確認したかったのですが、マネージメントコンソールから確認する方法が思いつきませんでした。ないのであればとAWS CLIとjqで一覧を出力してみました。
できあがったもの
EC2の一覧を出力したファイルと、インスタンスプロファイルの一覧を出力したファイルを結合して、Excelで確認すると比較的みやすい。
# 1. EC2の一覧出力
aws ec2 describe-instances --region ap-northeast-1 | jq -r '.Reservations[].Instances[] | [.IamInstanceProfile.Arn, .InstanceId, (.Tags[]?|select(.Key=="Name").Value)] | @csv' > tmpEC2.csv
# 2. インスタンスプロファイルの一覧出力
aws iam list-instance-profiles | jq -r '.InstanceProfiles[] | [.Arn, .Roles[].RoleName] | @csv' > tmpRole.csv
# 3. ファイルを結合する
join -t , -a 1 <(sort -n tmpEC2.csv) <(sort -n tmpRole.csv) > result.csv
C列がEC2インスタンスのNameタグで、D列がIAMロール名です。
EC2一覧の取得
aws ec2 describe-intances
コマンドで特定のインスタンスの情報を出力するとInstance Profile
は確認できます。IAM Role
までは確認できません。下記の出力結果が長いので--query
で絞った結果です。
$ aws ec2 describe-instances --region ap-northeast-1 --instance-ids i-0b0831b5d349a0d7a --query 'Reservations[*].Instances[*].IamInstanceProfile'
[
[
{
"Arn": "arn:aws:iam::123456789012:instance-profile/ParallelClusterManagerRoleUS",
"Id": "AIPAQ4BT4DHFFZE5YWYNN"
}
]
]
Instance Profileとは
EC2とIAM Roleの間にはInstance Profileが存在しています。CloudFormaionでIAM Roleを作成するときは意識するのですが、マネージメントコンソールからIAM Role作成すると意識しない存在ですよね。
EC2インスタンスからIAM Role
名ではなくInstance Profile
を確認できるのもうなづけます。
CSV形式で一覧出力
Instance Profile
、Instance ID
、ついでにName
タグの一覧を出力しました。
$ aws ec2 describe-instances --region ap-northeast-1 | jq -r '.Reservations[].Instances[] | [.IamInstanceProfile.Arn, .InstanceId, (.Tags[]?|select(.Key=="Name").Value)] | @csv' | tee tmpEC2.csv | cat
出力結果
"arn:aws:iam::12345679012:instance-profile/BlogTestSSMRole","i-09f496e3192495c9c","PrivateEC2-1"
"arn:aws:iam::12345679012:instance-profile/BlogTestSSMRole","i-0b568e3c9683c1d5f","PublicEC2-1"
,"i-012baf94ee47b5d61","Fortigate01"
"arn:aws:iam::12345679012:instance-profile/ParallelClusterManagerRole","i-0a155ee364f9642ab","aws-ec2"
3行目の結果はIAM Roleを設定していないインスタンスです。
Instance Profile一覧の取得
aws iam list-instance-profiles
コマンドでInstance Profile
と、IAM Role
を確認できます。求めていたIAM Role
はInstance Profile
から引けば取得できそうな目処が立ちました。
$ aws iam list-instance-profiles
出力結果
{
"InstanceProfiles": [
{
"Path": "/cloud9/",
"InstanceProfileName": "AWSCloud9SSMInstanceProfile",
"InstanceProfileId": "AIPAQ4BT4DHFHMTHEPOU7",
"Arn": "arn:aws:iam::12345679012:instance-profile/cloud9/AWSCloud9SSMInstanceProfile",
"CreateDate": "2020-09-30T07:55:44Z",
"Roles": [
{
"Path": "/service-role/",
"RoleName": "AWSCloud9SSMAccessRole",
"RoleId": "AROAQ4BT4DHFNWS6DADQN",
--- snip ---
CSV形式で一覧出力
Instance Profile
、IAM Role
の一覧を出力しました。
$ aws iam list-instance-profiles | jq -r '.InstanceProfiles[] | [.Arn, .Roles[].RoleName] | @csv' | tee tmpRole.csv | cat
出力結果
"arn:aws:iam::12345679012:instance-profile/BlogTestSSMRole","BlogTestSSMRole"
"arn:aws:iam::12345679012:instance-profile/GrafanaRole","GrafanaRole"
"arn:aws:iam::12345679012:instance-profile/NICEDCVRole","NICEDCVRole"
"arn:aws:iam::12345679012:instance-profile/parallelcluster-db-test-RootInstanceProfile-Q1IAC0N8KSWZ","parallelcluster-db-test-RootRole-19GTWB47SP333"
"arn:aws:iam::12345679012:instance-profile/ParallelClusterManagerRole","ParallelClusterManagerRole"
2つの出力結果をまとめる
join
コマンドでInstance Profile
をキーに合体します。
-t ,
:,(カンマ)
区切り指定-a 1
: 一致するものがなくても、1つ目ファイル(tmpEC2.csv)の内容はすべて表示sort
: joinするために両ファイルの1列目のInstance Profileをキーにソート
$ join -t , -a 1 <(sort -n tmpEC2.csv) <(sort -n tmpRole.csv) > result.csv
result.csv
"arn:aws:iam::12345679012:instance-profile/BlogTestSSMRole","i-09f496e3192495c9c","PrivateEC2-1","BlogTestSSMRole"
"arn:aws:iam::12345679012:instance-profile/BlogTestSSMRole","i-0b568e3c9683c1d5f","PublicEC2-1","BlogTestSSMRole"
"arn:aws:iam::12345679012:instance-profile/ParallelClusterManagerRole","i-0a155ee364f9642ab","aws-ec2","ParallelClusterManagerRole"
,"i-012baf94ee47b5d61","Fortigate01"
Excelで開くと見やすくなります。C列のNameTagと、D列にIAM Role名が表示されています。EC2のインスタンスに設定したIAM Roleを一覧でざっと確認できるのではないでしょうか。
ただ、Nameタグがないインスタンスがあると、その行だけ1行ズレしまうのが難点です。
同じIAM Role使っているインスタンスを確認したいときは、素直にExcelでフィルタすると楽ですね。
おわりに
jq
で久々に悩みました。毎回使い方忘れて調べている気がします。もっと簡単な出力方法あるような気がするのですが、コマンドコピペ3つで済むのでひとまずヨシします。同じようなことしたかった人の参考になれば幸いです。