EC2インスタンスに紐付いているIAMロールをNameタグと共に一覧出力したい
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
"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つで済むのでひとまずヨシします。同じようなことしたかった人の参考になれば幸いです。