特定のインスタンスプロファイルがアタッチされた EC2 インスタンスを一覧化する

IAM ロールにアタッチされた IAM ポリシーを変更したい時、その影響を受けるリソースが何かを確認したい機会がありました。

コンバンハ、千葉(幸)です。

EC2 インスタンスには IAM ロールをアタッチできます。(正確には、IAM ロールを管理するインスタンスプロファイルというリソースがありそれを EC2 インスタンスにアタッチできます。以降は、特に気にせず「EC2 インスタンスに IAM ロールをアタッチ」と表現します。)

特定の IAM ロールにアタッチされたポリシーを変更したい場合、その IAM ロールを使用しているリソースへの影響が気になります。EC2 用の IAM ロールである場合、「どのインスタンスにアタッチされているか(どのインスタンスがその IAM ロールを使用しているか)」を確認したくなります。

上記について、AWS マネジメントコンソールと AWS CLI で確認する方法をまとめました。

インスタンスプロファイル ARN を確認する

まずは当該インスタンスプロファイルの ARN を確認しましょう。後続の手順では、インスタンスプロファイル ARN が特定できていることを前提にしています。

IAM ロールの詳細画面から確認するのが一番お手軽です。下記画像の赤枠部が該当します。ここでクリップボードにコピーすることもできます。

AmazonSSMRoleForInstancesQuickSetup___IAM___Global

↑同じ画面にある IAM ロールの ARN と混同しないよう注意してください。

# IAM ロールの ARN 例
arn:aws:iam::000000000000:role/AmazonSSMRoleForInstancesQuickSetup

# インスタンスプロファイルの ARN 例
arn:aws:iam::000000000000:instance-profile/AmazonSSMRoleForInstancesQuickSetup

なお、IAM ロールをマネジメントコンソールから作成した場合、インスタンスプロファイルの名称は IAM ロールの名称と同じになっています。(今回の例ではどちらもAmazonSSMRoleForInstancesQuickSetup

AWS CLI や IaC などの手段で IAM ロールを作成する場合、ユーザー側で独自に指定することになるため、同一名称とは限りません。

AWS CLI からインスタンスプロファイルを確認する

AWS CLI でインスタンスプロファイルを確認するには、以下コマンドを使用します。

実行例は以下です。--role-nameの引数にロール名を指定する必要があります。

% aws iam list-instance-profiles-for-role \
  --role-name AmazonSSMRoleForInstancesQuickSetup
{
    "InstanceProfiles": [
        {
            "Path": "/",
            "InstanceProfileName": "AmazonSSMRoleForInstancesQuickSetup",
            "InstanceProfileId": "AIPAQ3BIIH733QK5IGBHL",
            "Arn": "arn:aws:iam::000000000000:instance-profile/AmazonSSMRoleForInstancesQuickSetup",
            "CreateDate": "2020-01-24T02:55:56+00:00",
            "Roles": [
                {
                    "Path": "/",
                    "RoleName": "AmazonSSMRoleForInstancesQuickSetup",
                    "RoleId": "AROAQ3BIIH735AQHQPIOW",
                    "Arn": "arn:aws:iam::000000000000:role/AmazonSSMRoleForInstancesQuickSetup",
                    "CreateDate": "2020-01-24T02:55:54+00:00",
                    "AssumeRolePolicyDocument": {
                        "Version": "2012-10-17",
                        "Statement": [
                            {
                                "Effect": "Allow",
                                "Principal": {
                                    "Service": "ec2.amazonaws.com"
                                },
                                "Action": "sts:AssumeRole"
                            }
                        ]
                    }
                }
            ]
        }
    ]
}

インスタンスプロファイル ARN だけ取得できればいい、ということであれば以下のようにフィルタリングできます。

% aws iam list-instance-profiles-for-role \
  --role-name AmazonSSMRoleForInstancesQuickSetup \
  --query 'InstanceProfiles[].Arn' \
  --output text
arn:aws:iam::000000000000:instance-profile/AmazonSSMRoleForInstancesQuickSetup

マネジメントコンソールからインスタンスプロファイルでフィルタリングする

EC2 コンソールのインスタンス一覧画面で、インスタンスプロファイル ARN を用いたフィルタリングができます。

検索窓を押下後、フィルタリングの条件として「IAM インスタンスプロファイル ARN」を指定します。

EC2_filtering

オペレーターとして=を選択します。

EC2_filtering-9413119

=のあとにあらかじめ確認しておいたインスタンスプロファイル ARN を指定すれば、当該インスタンスプロファイルがアタッチされたインスタンスを一覧表示できます。

EC2_Filtering_operator

AWS CLI で特定のインスタンスプロファイルを持つインスタンスを一覧化する

AWS マネジメントコンソールでの一覧化はテキストなどでの取り回しがしづらい、という場合には AWS CLI を活用しましょう。

以下のコマンドを使用します。

フィルタリングしたいインスタンスプロファイルの ARN をあらかじめ環境変数に指定しておきましょう。

INSTANCE_PROFILE_ARN=arn:aws:iam::000000000000:instance-profile/sample-role

--filtersオプションを用いたフィルタリングを実行するコマンド例は以下です。

aws ec2 describe-instances \
  --filters Name=iam-instance-profile.arn,Values=$INSTANCE_PROFILE_ARN \
  --query "Reservations[].Instances[].{
    ID:InstanceId,
    ProfileArn:IamInstanceProfile.Arn,
    Name:Tags[?Key=='Name'].Value|[0]
    }" \
  --output text | column -t

以下のように出力されます。インスタンス ID、インスタンスの Name タグ、インスタンスプロファイル ARN を出力するようにしています。--queryオプションでの指定を修正すれば、適宜カスタマイズできます。

i-0cxxxxxxxxxxxxxxx  INSTANCE-NAME-1    arn:aws:iam::000000000000:instance-profile/sample-role
i-0axxxxxxxxxxxxxxx  INSTANCE-NAME-2    arn:aws:iam::000000000000:instance-profile/sample-role
i-04xxxxxxxxxxxxxxx  INSTANCE-NAME-3    arn:aws:iam::000000000000:instance-profile/sample-role
...

column -tは列の成形のために使用しています。お好みでどうぞ。

なお、--filtersオプションを使わず--queryだけでフィルタリングもできます。

aws ec2 describe-instances \
  --query "Reservations[].Instances[?IamInstanceProfile.Arn=='$INSTANCE_PROFILE_ARN'].{
    ID:InstanceId,
    ProfileArn:IamInstanceProfile.Arn,
    Name:Tags[?Key=='Name'].Value|[0]
    }" \
  --output text | column -t

今回の用途であればどちらも大差ないのでお好みの方をご利用ください。--filterはサーバーサイドのフィルタリング、--queryはクライアントサイドのフィルタリングです。

終わりに

特定のインスタンスプロファイルがアタッチされた EC2 インスタンスを一覧化したい、という話でした。

「この IAM ロールにアタッチされた IAM ポリシーを変更した時、どの EC2 インスタンスが影響を受けるだろうか?」ということを確認したいケースがあったので、手順をまとめてみました。

同じようなケースの方の参考になれば幸いです。

以上、 チバユキ (@batchicchi) がお送りしました。