EC2インスタンスに紐付いているIAMロールをNameタグと共に一覧出力したい

AWS CLIとjqでがんばるだけです。
2021.06.01

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 ProfileInstance 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 RoleInstance 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 ProfileIAM 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つで済むのでひとまずヨシします。同じようなことしたかった人の参考になれば幸いです。

参考