0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IAMユーザーをコマンドで一発で削除する

Last updated at Posted at 2024-04-01

はじめに

IAMユーザーをコマンドで削除する場合、なにもせずにコマンドを実行するとエラーになって削除できません。

$ aws iam delete-user --user-name user01

An error occurred (DeleteConflict) when calling the DeleteUser operation: Cannot delete entity, must remove users from group first.

原因は、ドキュメントに記載されている通りで、コマンドで削除する場合は削除前にアタッチされている項目を削除する必要があります。

コンソールから削除すれば気にする必要もないのですが、削除対象をコマンドとして事前に整理して実行をしたいケース等もあるかと思います。

IAMユーザー削除スクリプト

というわけで、ユーザーの削除前に必要なもろもろをまとめて行うスクリプトです。

delete_iam-user.py
import sys
import boto3

# IAMクライアントの作成
iam = boto3.client('iam')

def delete_iam_user_resources(user_name):
    try:
        # 1. パスワードの削除
        try:
            iam.delete_login_profile(UserName=user_name)
            print(f"ユーザー {user_name} のパスワードを削除しました。")
        except iam.exceptions.NoSuchEntityException:
            print(f"ユーザー {user_name} にはパスワードが設定されていません。")

        # 2. アクセスキーの削除
        access_keys = iam.list_access_keys(UserName=user_name)['AccessKeyMetadata']
        for key in access_keys:
            iam.delete_access_key(UserName=user_name, AccessKeyId=key['AccessKeyId'])

        # 3. 署名証明書の削除
        signing_certs = iam.list_signing_certificates(UserName=user_name)['Certificates']
        for cert in signing_certs:
            iam.delete_signing_certificate(UserName=user_name, CertificateId=cert['CertificateId'])

        # 4. SSHパブリックキーの削除
        ssh_public_keys = iam.list_ssh_public_keys(UserName=user_name)['SSHPublicKeys']
        for key in ssh_public_keys:
            iam.delete_ssh_public_key(UserName=user_name, SSHPublicKeyId=key['SSHPublicKeyId'])

        # 5. Git認証情報の削除
        git_creds = iam.list_service_specific_credentials(UserName=user_name)['ServiceSpecificCredentials']
        for cred in git_creds:
            iam.delete_service_specific_credential(UserName=user_name, ServiceSpecificCredentialId=cred['ServiceSpecificCredentialId'])

        # 6. MFAデバイスの無効化と削除
        mfa_devices = iam.list_mfa_devices(UserName=user_name)['MFADevices']
        for device in mfa_devices:
            iam.deactivate_mfa_device(UserName=user_name, SerialNumber=device['SerialNumber'])
            iam.delete_virtual_mfa_device(SerialNumber=device['SerialNumber'])

        # 7. インラインポリシーの削除
        inline_policies = iam.list_user_policies(UserName=user_name)['PolicyNames']
        for policy_name in inline_policies:
            iam.delete_user_policy(UserName=user_name, PolicyName=policy_name)

        # 8. 管理ポリシーのデタッチ
        attached_policies = iam.list_attached_user_policies(UserName=user_name)['AttachedPolicies']
        for policy in attached_policies:
            iam.detach_user_policy(UserName=user_name, PolicyArn=policy['PolicyArn'])

        # 9. 全てのユーザーグループからユーザーを削除
        user_groups = iam.list_groups_for_user(UserName=user_name)['Groups']
        for group in user_groups:
            iam.remove_user_from_group(GroupName=group['GroupName'], UserName=user_name)

        # 10. ユーザーの削除
        iam.delete_user(UserName=user_name)
        print(f"ユーザー '{user_name}' とその関連リソースを全て削除しました。")
    except Exception as e:
        print(f"エラーが発生しました: {e}")

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("使用方法: python delete_iam-user.py ユーザー")
    else:
        user_name = sys.argv[1]
        delete_iam_user_resources(user_name)

実行

CloudShell等にスクリプトを配置して実行してください

$ python ./delete_iam-user.py user01
ユーザー user01 にはパスワードが設定されていません。
ユーザー 'user01' とその関連リソースを全て削除しました

shellを使用してユーザーリストを繰り返し処理してみます

$ while read l; do
> python delete_iam-user.py "$l"
> done<<EOT
> user01
> user02
> EOT
ユーザー user01 のパスワードを削除しました。
ユーザー 'user01' とその関連リソースを全て削除しました。
ユーザー user02 にはパスワードが設定されていません。
ユーザー 'user02' とその関連リソースを全て削除しました。

誤り等あればご指摘ください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?