クラウド運用自動化の実践! AWS Step Functionsで始めるワークフロー自動化

はじめに

NTT西日本の桂川です。
本記事では、クラウド運用自動化の実践として、「AWS Step Functions(以降、Step Functions)」を活用したワークフロー自動化について紹介します。
「Step Functions」は、AWS SDKサービス統合により、各種AWSサービスのAPIアクションを呼び出すことが可能であり、複数のAWSサービスを組み合わせたワークフローを構築することができます。
本記事では、運用自動化の一例として、IAMユーザーの自動作成に取り組んだ事例を解説します。
なお、本記事の内容は2025年9月時点の情報に基づいています。

対象読者

本記事の対象読者は、以下のような方々を想定しています。

  • AWS や 運用自動化に関心のある方
  • Step Functions の活用方法を知りたい方
  • IAMユーザー作成の自動化を検討している方

背景・目的

AWSアカウントに多数のIAMユーザーを作成する必要がある場面に直面し、手作業による対応では効率が悪いため、作業の自動化について検討を始めました。
IAMユーザー作成の自動化にあたり、以下の要件を満たす必要がありました。

  • 前提条件
    • AWSアカウントは、管理アカウントとメンバーアカウントで構成されている
    • 管理アカウントがメンバーアカウントのセキュリティ統制やコスト管理を行う
  • 要件
    • メンバーアカウント利用開始時に初期セットアップとしてIAMユーザーを作成する
    • IAMユーザの初期パスワードは、ランダムなパスワードを自動作成する
    • 初回サインイン時にパスワードのリセットを要求する
  • 制限事項
    • 他のIAMユーザーのパスワードは閲覧不可とする
    • メンバーアカウントのIAMユーザーは、IAM関連操作を禁止する

これらの要件を満たすため「AWS Cloud Formation(以降、Cloud Formation)」で実現する方法と「Step Functions」で実現する方法の2つの方法を検討しました。

■ 各サービスの比較結果

要件 Cloud Formation Step Functions
IAMユーザ作成
パスワード自動作成
パスワードリセット
パスワード閲覧不可
IAM関連操作禁止

各サービスの実現方法を比較した結果、パスワードの自動作成などの要件を容易に満たせること、またアクセス権限に関する考慮が比較的少なくて済むことから、「Step Functions」を採用しました。
表について、要件の達成は可能だが、実装が複雑になる項目を「△」としています。「Cloud Formation」の採用を見送った主な理由は、以下の通りです。

  • パスワード自動作成
    パスワードを自動作成する際、「AWS Secrets Manager(以降、Secrets Manager)」を使用してパスワードをシークレットとして保存し、IAMユーザー作成時にそのシークレットを参照する必要がありました。
  • パスワード閲覧不可
    メンバーアカウント内の他のIAMユーザーがパスワードを閲覧ができないよう「Secrets Manager」に保存されたパスワードのアクセス権限を適切に設定する必要がありました。
  • IAM関連操作禁止
    メンバーアカウントのIAMユーザーが展開済みの「Cloud Formation」を使用して、IAM関連の操作を実行できないよう考慮する必要がありました。

「Step Functions」は、AWS SDKサービス統合により、さまざまなAWSサービスのAPIアクションを呼び出すことが可能となっており、 複数のサービスを組み合わせたワークフローを容易に作成できます。 さらに、ノーコードで開発できるデザインツールも備えており、Cloud Formationのようにコードを書くことが苦手な方でも取り組みやすいという特長があります。
「Step Functions」は、各サービスとの柔軟な統合が可能で、幅広いユースケースに対応できるため、運用自動化を推進するうえで、皆様にとっても非常に有用なツールになると考えています。 本記事では、IAMユーザーの自動作成に取り組んだ事例を通じて、その活用方法についてご紹介したいと思います。

ソリューションの概要

このソリューションでは、AWSアカウントへIAMユーザーを自動作成するStep Functions ワークフローについて紹介します。
本事例では、管理アカウントからメンバーアカウントへIAMユーザを自動作成する構成について解説します。
管理アカウントがない場合は、対象アカウント上にStep Functionsワークフローを直接構築することも可能です。

■ 構成図

構成図

前提条件

  • 以下のIAMリソースを事前に作成してください。
アカウント IAMリソース 概要
管理アカウント Step Functions実行用IAMロール クロスアカウントアクセス用IAMロールに対するAssumeRole権限を許可
メンバーアカウント クロスアカウントアクセス用IAMロール IAMユーザー作成に必要な権限を許可
メンバーアカウント IAMグループ IAMユーザーが所属するIAMグループ

例)StepFunctions実行用IAMロール

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "sts:assumeRole"
            ],
            "Resource": [
                "arn:aws:iam::<メンバーアカウントID>:role/<クロスアカウントアクセス用IAMロール>"
            ],
            "Effect": "Allow"
        }
    ]
}

例)クロスアカウントアクセス用IAMロール

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "iam:CreateLoginProfile",
                "iam:AddUserToGroup",
                "iam:AttachUserPolicy",
                "iam:ListAccountAliases",
                "iam:CreateUser"
            ],
            "Resource": [
                "*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "secretsmanager:GetRandomPassword"
            ],
            "Resource": [
                "*"
            ],
            "Effect": "Allow"
        }
    ]
}
  • アカウントエイリアスを事前に設定してください。
    今回は、サインインURLを自動作成する際にアカウントエイリアスを使用します。
    以下の場合は、設定不要です。
    • サインインURLにアカウントIDを使用する場合
    • サインインURLを自動作成しない場合

考慮事項

  • クロスアカウントアクセス用IAMロールの信頼関係でAssumeRoleを許可するPrincipalは必要最小限としてください。
    適切な信頼関係が設定されていない場合、メンバーアカウントのIAMユーザーがクロスアカウントアクセス用IAMロールにSwitchRoleすることで、意図せずアクセス権限が付与されてしまう可能性があります。

例)クロスアカウントアクセス用IAMロールの信頼関係

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<管理アカウントID>:<Step Functions実行用IAMロール>"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
  • 管理アカウントがなく対象アカウント上にStep Functionsワークフローを直接構築する場合、Step Functionsを実行することで、意図せずアクセス権限が付与されないよう注意してください。
    例えば、対象アカウント上のIAMユーザーにおいてIAM関連操作を禁止している場合、IAMユーザがStep Functionsワークフローを実行することで、意図せずIAMユーザー作成が可能となってしまう可能性があります。

例)管理アカウントがなく対象アカウント上にStep Functionsワークフローを直接構築する場合

考慮事項

IAMユーザー自動作成ワークフローの作成

■ 概要

メンバーアカウントにIAMユーザーを自動作成するStep Functions ワークフローを作成します。
AWSマネジメントコンソール上からIAMユーザーを作成する場合と同様に「ユーザー名」、「サインインURL」、「パスワード」を出力するワークフローを作成します。
「パスワード」は、ワークフローで自動作成し、次回のサインイン時に新しいパスワードを設定するよう要求します。

IAMユーザー作成画面①

IAMユーザー作成画面②

■ Step Functions ワークフロー

「メンバーアカウントID」と「ユーザー名」をパラメータとして入力し、「ユーザー名」、「サインインURL」、「パスワード」を出力するワークフローを作成します。

  • ワークフロー

ワークフロー

  • 入力パラメータ
{
  "AccountId": "<メンバーアカウントID>",
  "UserNames": [
    "<ユーザー名>",
    "<ユーザー名>"
  ]
}
  • 出力パラメータ
{
  "Users": [
    {
      "UserName": "<ユーザー名>",
      "LoginURL": "<サインインURL>",
      "Password": "<パスワード>"
    },
    {
      "UserName": "<ユーザー名>",
      "LoginURL": "<サインインURL>",
      "Password": "<パスワード>"
    }
  ]
}

■ 作成手順

1. Step Functions の [ステートマシンの作成] から ワークフローを作成します。

作成手順①

2. Step Functions Workflow Studio で ワークフローを編集します。

「デザイン」モード は、状態をキャンバスにドラッグアンドドロップすることでワークフローを作成することが可能です。
「コード」モード は、 Amazon States Language(ASL)を使用してワークフローを作成します。

  • デザインモード

作成手順②

  • コードモード

作成手順③

実行したいアクションを選択し、[APIパラメータ] 、[次の状態] 、[入力] 、[出力] 、[エラー処理] などのパラメータを設定します。
クロスアカウントアクセスを行う場合、[クロスアカウントアクセスを有効にする] をチェックし、[ターゲットロール ARN] を設定します。
IAMユーザー自動作成ワークフローのASL定義を参考として記載します。エラー処理などは割愛しています。

作成手順④

  • IAMユーザー自動作成ワークフロー(ASL定義)
{
  "Comment": "Create multiple IAM users with random passwords",
  "StartAt": "ListAccountAliases",
  "States": {
    "ListAccountAliases": {
      "Type": "Task",
      "Resource": "arn:aws:states:::aws-sdk:iam:listAccountAliases",
      "Parameters": {},
      "ResultPath": "$.AccountAliasResult",
      "Next": "CreateUsersMap",
      "Credentials": {
        "RoleArn.$": "States.Format('arn:aws:iam::{}:role/<クロスアカウントアクセス用IAMロール>', $.AccountId)"
      }
    },
    "CreateUsersMap": {
      "Type": "Map",
      "ItemsPath": "$.UserNames",
      "Parameters": {
        "AccountId.$": "$.AccountId",
        "UserName.$": "$$.Map.Item.Value",
        "AccountAlias.$": "$.AccountAliasResult.AccountAliases[0]"
      },
      "ResultPath": "$.UserResults",
      "Iterator": {
        "StartAt": "GenerateRandomPassword",
        "States": {
          "GenerateRandomPassword": {
            "Type": "Task",
            "Resource": "arn:aws:states:::aws-sdk:secretsmanager:getRandomPassword",
            "Parameters": {
              "PasswordLength": 13,
              "RequireEachIncludedType": true,
              "ExcludeCharacters": "\"\\,./:;<>?`~."
            },
            "ResultPath": "$.RandomPasswordResult",
            "Next": "CreateIAMUser",
            "Credentials": {
              "RoleArn.$": "States.Format('arn:aws:iam::{}:role/<クロスアカウントアクセス用IAMロール>', $.AccountId)"
            }
          },
          "CreateIAMUser": {
            "Type": "Task",
            "Resource": "arn:aws:states:::aws-sdk:iam:createUser",
            "Parameters": {
              "UserName.$": "$.UserName"
            },
            "ResultPath": "$.TaskResult",
            "Next": "CreateLoginProfile",
            "Credentials": {
              "RoleArn.$": "States.Format('arn:aws:iam::{}:role/<クロスアカウントアクセス用IAMロール>', $.AccountId)"
            }
          },
          "CreateLoginProfile": {
            "Type": "Task",
            "Resource": "arn:aws:states:::aws-sdk:iam:createLoginProfile",
            "Parameters": {
              "UserName.$": "$.UserName",
              "Password.$": "$.RandomPasswordResult.RandomPassword",
              "PasswordResetRequired": true
            },
            "ResultPath": "$.TaskResult",
            "Next": "AttachUserPolicy",
            "Credentials": {
              "RoleArn.$": "States.Format('arn:aws:iam::{}:role/<クロスアカウントアクセス用IAMロール>', $.AccountId)"
            }
          },
          "AttachUserPolicy": {
            "Type": "Task",
            "Resource": "arn:aws:states:::aws-sdk:iam:attachUserPolicy",
            "Parameters": {
              "UserName.$": "$.UserName",
              "PolicyArn": "arn:aws:iam::aws:policy/IAMUserChangePassword"
            },
            "ResultPath": "$.TaskResult",
            "Next": "AddUserToGroup",
            "Credentials": {
              "RoleArn.$": "States.Format('arn:aws:iam::{}:role/<クロスアカウントアクセス用IAMロール>', $.AccountId)"
            }
          },
          "AddUserToGroup": {
            "Type": "Task",
            "Resource": "arn:aws:states:::aws-sdk:iam:addUserToGroup",
            "Parameters": {
              "UserName.$": "$.UserName",
              "GroupName": "<IAMグループ>"
            },
            "ResultPath": "$.TaskResult",
            "Next": "ReturnLoginInfo",
            "Credentials": {
              "RoleArn.$": "States.Format('arn:aws:iam::{}:role/<クロスアカウントアクセス用IAMロール>', $.AccountId)"
            }
          },
          "ReturnLoginInfo": {
            "Type": "Pass",
            "Parameters": {
              "LoginURL.$": "States.Format('https://{}.signin.aws.amazon.com/console', $.AccountAlias)",
              "UserName.$": "$.UserName",
              "Password.$": "$.RandomPasswordResult.RandomPassword"
            },
            "End": true
          }
        }
      },
      "Next": "ReturnAllLoginInfo"
    },
    "ReturnAllLoginInfo": {
      "Type": "Pass",
      "Parameters": {
        "Users.$": "$.UserResults"
      },
      "End": true
    }
  }
}
3. Step Functions の 実行ロールを設定します。

Step Functions の 実行ロールを設定します。必要に応じて、ログ記録設定などを行い、[作成] をクリックします。

作成手順⑤

4. Step Functions の [実行を開始] から ワークフローを実行します。

Step Functions の 実行ステータス が [成功] となり、実行が完了していることを確認します。

作成手順⑥

作成手順⑦

5. メンバーアカウントにIAMユーザーが作成されていることを確認します。

メンバーアカウントにサインインして、IAMユーザーが作成されていることを確認します。

作成手順⑧

まとめ

本記事では、クラウド運用自動化の一例として、AWSの「Step Functions」を活用したIAMユーザーの自動作成に取り組んだ事例をご紹介しました。
「Step Functions」は、AWS SDKサービス統合により、各種AWSサービスのAPIアクションを呼び出すことが可能で、幅広いユースケースに対応することができます。
また、Workflow Studioを使用することでノーコード開発も可能となり、Cloud Formationのようにコードを書くことが苦手な方でも取り組みやすくなっています。
さらに、「AWS Lambda」を使用しない構成であれば、ランタイムバージョンのアップグレードなどの定期保守が不要となり、運用負荷の軽減にもつながります。

運用における定型作業や繰り返し作業を自動化することで、「作業時間の削減」や「手動操作によるヒューマンエラーの防止」、「作業の一貫性確保」といった多くのメリットが得られます。
まずは、運用自動化の第一歩として、身近な業務から取り組んでみてはいかがでしょうか。
本記事が、皆様の業務改善の一助となれば幸いです。

執筆者

桂川 裕幸(NTT西日本 ビジネス営業本部 エンタープライズビジネス営業部所属)
AWSを活用したクラウドシステムの設計・構築に携わっています。
サーバーレスアーキテクチャが好きです。
2025 Japan AWS All Certifications Engineers に選出。

参考資料・出典

本記事を執筆するにあたり、以下のサイトを参考にさせていただきました。

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

商標 

  • 「AWS」「AWS Step Functions」「AWS Lambda」「AWS Secrets Manager」「AWS Cloud Formation」は、Amazon Web Services,Inc.またはその関連会社の商標もしくは登録商標です。

免責事項

本記事の内容には、IAMアクセス権限管理 や クロスアカウントアクセスなどのセキュリティに関する考慮事項があります。
本記事を参照する際は、ご自身の環境をよくご確認の上、適切な権限管理をお願いします。
なお、本記事の内容を実施した結果発生する損失・損害については一切の責任を負いかねます。

© NTT WEST, Inc.