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

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

```shell
$ 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.
```

原因は、[ドキュメント](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_manage.html#id_users_deleting_cli)に記載されている通りで、コマンドで削除する場合は削除前にアタッチされている項目を削除する必要があります。

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

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

```python: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等にスクリプトを配置して実行してください
```shell
$ python ./delete_iam-user.py user01
ユーザー user01 にはパスワードが設定されていません。
ユーザー 'user01' とその関連リソースを全て削除しました

```

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

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

```

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