IAMロールを削除する際にはインスタンスプロファイルに注意

こんにちは。サービスグループの武田です。ロール削除時にインスタンスプロファイルと紐付いたままだとエラーが発生するためそれを解消します。
2022.06.16

こんにちは。サービスグループの武田です。

先日IAMロールを削除しようとしたところ、An error occurred (DeleteConflict) when calling the DeleteRole operation: Cannot delete entity, must remove roles from instance profile first.というエラーが出ました。メッセージを読めばわかりますが、インスタンスプロファイルからロールを削除しないといけないようです。

というわけで、エラーの出ないロール削除手順を確認しました。次の工程が必要です。

  1. 管理ポリシーをすべてデタッチ
  2. インラインポリシーをすべて削除
  3. すべてのインスタンスプロファイルから削除
  4. ロール削除

1〜3は順不同です。ポリシーのデタッチ/削除は認識していたのですが、インスタンスプロファイルは盲点でした。AWS CLIでのコマンドは参考URLを見ていただくとして、ここではBoto3を使った場合のスクリプトを紹介します。

delete-iam-role.py

import boto3

ROLE_NAME="delete-target-role"

iam = boto3.client("iam")

for policy in iam.list_attached_role_policies(RoleName=ROLE_NAME)["AttachedPolicies"]:
    iam.detach_role_policy(
        RoleName=ROLE_NAME,
        PolicyArn=policy["PolicyArn"],
    )

for policy_name in iam.list_role_policies(RoleName=ROLE_NAME)["PolicyNames"]:
    iam.delete_role_policy(RoleName=ROLE_NAME, PolicyName=policy_name)

instance_profile_names = [
    p["InstanceProfileName"]
    for p in iam.list_instance_profiles_for_role(RoleName=ROLE_NAME)[
        "InstanceProfiles"
    ]
]

for profile_name in instance_profile_names:
    iam.remove_role_from_instance_profile(
        InstanceProfileName=profile_name, RoleName=ROLE_NAME
    )

iam.delete_role(RoleName=ROLE_NAME)

# インスタンスプロファイルの削除は任意
# for profile_name in instance_profile_names:
#     iam.delete_instance_profile(InstanceProfileName=profile_name)

以上でロールの削除は完了です。またロールに紐付けられていたインスタンスプロファイルが不要であれば削除もできます(コメントアウト部分)。

インスタンスプロファイルを削除するためには、先に紐付けられているロールを削除(remove)する必要があります。ですが、インスタンスプロファイルに紐付けられるロールは1個が上限となっているため、削除するロールと紐付いていたプロファイルは問題なく削除できるはずです。

まとめ

これまでIAMロールを削除する機会はあったのですが、インスタンスプロファイルが紐付けられているロールをはじめて削除しました。これまで問題なく動いていたプログラムがエラーになるとびっくりしますね。いくつものロールを一括削除するような場合、このような考慮が必要となる場合がありますので覚えておくとよさそうです。

参考URL