AWS Step FunctionsでIAMユーザーを削除してみた

AWS Step FunctionsでIAMユーザーを削除してみた

Clock Icon2025.06.13

はじめに

Amazon EventBridgeをトリガーとして、AWS Step FunctionsでIAMユーザーを自動削除したい要件がありました。
そこで、今回はAWS Step FunctionsでIAMユーザーを自動削除する方法について検証してみました。

自動削除は、以下の2つの方法が考えられます。

  1. AWS Step Functionsで直接IAM API の DeleteUserを実行する
  2. AWS Systems Manager(以降、SSM)ドキュメントAWSConfigRemediation-DeleteIAMUserを利用したSSMオートメーションを実行する

前者の場合、IAM API の DeleteUserを実行するには、IAMユーザーのパスワードやアクセスキー、インラインポリシー、管理ポリシーなどを全て削除する必要があります。以下のドキュメントに記載されている通り、9つの手順を実行した後に、ようやく削除できます。


cm-hirai-screenshot 2025-06-10 15.40.32
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_remove.html#id_users_deleting_cli


これをステートマシンで実装する場合、例えばIAMユーザーのアクセスキーを削除するステートでは、以下の処理が必要になります。

  1. アクセスキーを所持しているかチェック(ListAccessKeys API実行)
  2. 所持していない場合は次のステートに進む
  3. 所持している場合はアクセスキーを削除(DeleteAccessKey API実行)

この処理を9つのリソースそれぞれに対して実装する必要があります。

実装の複雑さを考慮し、直接IAM API DeleteUserを実行する方法は採用しません。

後者のSSMオートメーションを実行する場合、SSMドキュメントAWSConfigRemediation-DeleteIAMUserでは、先ほどの9つの手順を全て実行した後に、IAMユーザーを削除してくれます。

AWSConfigRemediation-DeleteIAMUser ランブックは指定した AWS Identity and Access Management (IAM) ユーザーを削除します。このオートメーションは、IAM ユーザーに関連付けられた次のリソースを削除またはデタッチします。

  • アクセスキー
  • アタッチされた管理ポリシー
  • Git 認証情報
  • IAM グループメンバーシップ
  • IAM ユーザーパスワード
  • インラインポリシー
  • 多要素認証 (MFA) デバイス
  • 証明書への署名
  • SSH 公開キー

https://docs.aws.amazon.com/ja_jp/systems-manager-automation-runbooks/latest/userguide/automation-aws-delete-iam-user.html

そこで、Step FunctionsでSSMオートメーションを実行してIAMユーザーを削除する方法を実装してみます。

SSMオートメーション用IAMロール作成

SSMオートメーションを実行するためのIAMロールを作成します。

必要な権限は、SSMドキュメントの公式ドキュメントに記載されています。
https://docs.aws.amazon.com/ja_jp/systems-manager-automation-runbooks/latest/userguide/automation-aws-delete-iam-user.html

以下のCloudFormationテンプレートを使用してスタックを作成します。

AWSTemplateFormatVersion: '2010-09-09'
Description: 'AWS Config Remediation IAM Role for AWSConfigRemediation-DeleteIAMUser'

Parameters:
  AWSConfigRemediationDeleteIAMUserRoleName:
    Type: String
    Default: AWSConfigRemediation-DeleteIAMUserRole
    Description: Name for the IAM role used by AWSConfigRemediation-DeleteIAMUser automation

  AWSConfigRemediationDeleteIAMUserPolicyName:
    Type: String
    Default: AWSConfigRemediation-DeleteIAMUserPolicy
    Description: Name for the policy attached to the remediation role

Resources:
  AWSConfigRemediationDeleteIAMUserRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Ref AWSConfigRemediationDeleteIAMUserRoleName
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ssm.amazonaws.com
                - states.amazonaws.com
            Action: sts:AssumeRole
      Policies:
        - PolicyName: !Ref AWSConfigRemediationDeleteIAMUserPolicyName
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - iam:DeactivateMFADevice
                  - iam:DeleteAccessKey
                  - iam:DeleteLoginProfile
                  - iam:DeleteServiceSpecificCredential
                  - iam:DeleteSigningCertificate
                  - iam:DeleteSSHPublicKey
                  - iam:DeleteVirtualMFADevice
                  - iam:DeleteUser
                  - iam:DeleteUserPolicy
                  - iam:DetachUserPolicy
                  - iam:GetUser
                  - iam:ListAttachedUserPolicies
                  - iam:ListAccessKeys
                  - iam:ListGroupsForUser
                  - iam:ListMFADevices
                  - iam:ListServiceSpecificCredentials
                  - iam:ListSigningCertificates
                  - iam:ListSSHPublicKeys
                  - iam:ListUserPolicies
                  - iam:ListUsers
                  - iam:RemoveUserFromGroup
                Resource: '*'
              - Effect: Allow
                Action:
                  - ssm:GetAutomationExecution
                  - ssm:StartAutomationExecution
                Resource: '*'

このテンプレートから、AWSConfigRemediation-DeleteIAMUserRoleという名前のIAMロールが作成されます。

ステートマシン作成

以下のステートマシン定義を使用します。アカウントIDの箇所は各自変更してください。
cm-hirai-screenshot 2025-06-10 16.39.21

{
  "Comment": "IAMユーザー削除ワークフロー - SSM Automationを使用したユーザー削除",
  "QueryLanguage": "JSONata",
  "StartAt": "GetUserDetails",
  "States": {
    "GetUserDetails": {
      "Type": "Task",
      "Resource": "arn:aws:states:::aws-sdk:iam:getUser",
      "Arguments": {
        "UserName": "{% $states.input.username %}"
      },
      "Assign": {
        "userId": "{% $states.result.User.UserId %}"
      },
      "Comment": "指定されたユーザー名からユーザーIDを取得し、削除処理に必要な情報を準備",
      "Next": "StartDeletionAutomation"
    },
    "StartDeletionAutomation": {
      "Type": "Task",
      "Resource": "arn:aws:states:::aws-sdk:ssm:startAutomationExecution",
      "Arguments": {
        "DocumentName": "AWSConfigRemediation-DeleteIAMUser",
        "Parameters": {
          "AutomationAssumeRole": [
            "arn:aws:iam::アカウントID:role/AWSConfigRemediation-DeleteIAMUserRole"
          ],
          "IAMUserId": [
            "{% $userId %}"
          ]
        }
      },
      "Assign": {
        "automationExecutionId": "{% $states.result.AutomationExecutionId %}"
      },
      "Comment": "SSM Automationを使用してIAMユーザー削除処理を開始",
      "Next": "WaitForAutomation"
    },
    "WaitForAutomation": {
      "Type": "Wait",
      "Seconds": 15,
      "Comment": "Automation実行の進行を待機(15秒間隔でポーリング)",
      "Next": "CheckAutomationExecution"
    },
    "CheckAutomationExecution": {
      "Type": "Task",
      "Resource": "arn:aws:states:::aws-sdk:ssm:getAutomationExecution",
      "Arguments": {
        "AutomationExecutionId": "{% $automationExecutionId %}"
      },
      "Assign": {
        "executionStatus": "{% $states.result.AutomationExecution.AutomationExecutionStatus %}"
      },
      "Comment": "SSM Automation実行の現在のステータスを取得",
      "Next": "EvaluateExecutionStatus"
    },
    "EvaluateExecutionStatus": {
      "Type": "Choice",
      "Comment": "Automation実行ステータスに基づいて次のアクションを決定",
      "Choices": [
        {
          "Condition": "{% $executionStatus = 'Success' %}",
          "Comment": "削除処理が正常に完了した場合",
          "Next": "DeletionCompleted"
        },
        {
          "Condition": "{% $executionStatus = 'Failed' %}",
          "Comment": "削除処理が失敗した場合",
          "Next": "DeletionFailed"
        },
        {
          "Condition": "{% $executionStatus in ['InProgress', 'Waiting'] %}",
          "Comment": "削除処理が進行中または待機中の場合は継続監視",
          "Next": "WaitForAutomation"
        }
      ],
      "Default": "DeletionFailed"
    },
    "DeletionCompleted": {
      "Type": "Succeed",
      "Comment": "IAMユーザーの削除が正常に完了"
    },
    "DeletionFailed": {
      "Type": "Fail",
      "Cause": "SSM Automation実行が失敗しました。ログを確認してください。",
      "Error": "IAMUserDeletionFailed",
      "Comment": "IAMユーザーの削除処理が失敗"
    }
  }
}

処理の流れ

このステートマシンは、以下の流れでIAMユーザーを削除します。

  1. GetUserDetails: 入力されたユーザー名からユーザーIDを取得
  2. StartDeletionAutomation: SSMオートメーション(AWSConfigRemediation-DeleteIAMUser)を開始
  3. WaitForAutomation: 15秒間待機
  4. CheckAutomationExecution: SSMオートメーションの実行状況を確認
  5. EvaluateExecutionStatus: 実行ステータスを評価して次のアクションを決定
    • 成功の場合: DeletionCompletedで正常終了
    • 失敗の場合: DeletionFailedでエラー終了
    • 実行中/待機中の場合: WaitForAutomationに戻ってポーリング継続

Step Functions実行ロールの権限設定

マネジメントコンソール上でステートマシンを作成する際、実行ロールのポリシーを手動で追加する必要があります。

cm-hirai-screenshot 2025-06-10 16.26.21

以下のポリシーを追加してください。アカウントIDは各自変更してください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "IAMUserOperations",
            "Effect": "Allow",
            "Action": [
                "iam:GetUser"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "ssm:StartAutomationExecution",
            "Resource": "arn:aws:ssm:*::automation-definition/AWSConfigRemediation-DeleteIAMUser:*"
        },
        {
            "Effect": "Allow",
            "Action": "ssm:GetAutomationExecution",
            "Resource": "arn:aws:ssm:*:アカウントID:automation-execution/*"
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::アカウントID:role/AWSConfigRemediation-DeleteIAMUserRole"
        }
    ]
}

実行してみる

作成したステートマシンを実行して、IAMユーザーの自動削除を検証します。

削除対象となるIAMユーザー名を入力パラメータとして指定し、ステートマシンを実行します。

{
  "username": "test8"
}

cm-hirai-screenshot 2025-06-10 16.30.07

ステートマシンは正常に実行完了し、IAMユーザーの自動削除に成功しました。

cm-hirai-screenshot 2025-06-10 16.33.29

SSMオートメーションの実行履歴を確認すると、こちらも正常に完了していることが確認できます。なお、IAMユーザーの自動削除には20〜30秒程度の時間がかかります。

cm-hirai-screenshot 2025-06-10 16.34.57

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.