Amazon Web Services ブログ

AWS Control Tower で複数 AWS アカウントの一括作成を自動化する方法

2022年2月24日 更新: 1 回のデプロイあたり 300 以上のアカウント作成をサポートしました。

2021年11月17日 更新: Nested OU サポートに伴う Account Factory の入力パラメータの変更に対応しました。

2021年7月25日 更新: アカウント情報をローカルの S3 バケットから渡すように変更しました。

多くのお客様は、AWS Control Tower を使用して新しい AWS アカウントを作成しプロビジョニングしています。AWS Control Tower は、適切に設計されたマルチアカウント環境の作成を自動化する AWS のマネージドサービスです。現在、AWS Control Tower の Account Factory はシングルスレッドで動作します。そのため、お客様は進行中のアカウント作成プロセスが完了するのを待ってから次のアカウント作成プロセスを開始する必要があります。アカウント作成を一括 (バッチ) で行うソリューションを夜間や週末に実行すれば、明くる日には新規アカウントを AWS Control Tower 環境下で利用可能な状態にすることができます。これによって、皆様の AWS Organizations 環境のための新規アカウントプロビジョニングと一元的なコンプライアンス適用をより簡素に行えるようになります。AWS Control Tower を利用すると、お客様は数クリックで全社的なポリシーに準拠した新規 AWS アカウントをプロビジョニングすることができます。

このブログでは、AWS Control Tower で複数のアカウントの作成を自動化する方法を紹介します。このソリューションを使用して、アプリケーション用のサンドボックスアカウントを多数作成したり、新しいチームのためのアカウントを複数作成したりすることができます。また、このアカウント一括作成プロセスは、AWS Control Tower で新規アカウントを作成するときに遭遇しがちな一般的なエラーを処理・対処できるように設計されています。

このソリューションは、以下の AWS サービスを使用します。

ソリューションの概要

本ソリューションによるアカウント一括作成の流れを以下の図に示します。


ステップ 1-2 は初期化・開始処理、ステップ 3-8 はアカウント一括作成プロセスの中心部分です。

ステップ 1: AWS Control Tower の管理者としてログインし、AWS CloudFormation スタックをデプロイします。また、AWS Control Tower で新規作成したいアカウントのリストと詳細を含む入力ファイルをアップロードします。この部分の詳細は本ブログの後半に記載しています。

ステップ 2: ステップ 1 の CloudFormation スタックが正常にデプロイされると、アカウント一括作成処理のためのリソースが作成されます。主なリソースとそれぞれの役割は以下の通りです。

  1. Amazon DynamoDB テーブル: このテーブルは、アカウントの作成状況を追跡します。
  2. AWS Lambda 関数 NewAccountHandlerLambda: この関数は、入力ファイル (ステップ 1 を参照) のエントリを検証し、検証された入力ファイルのエントリを DynamoDB テーブルにアップロードします。
  3. Amazon CloudWatch Events ルール: このルールは、AWS Control Tower の CreateManagedAccount ライフサイクルイベントを検出します。
  4. Lambda 関数 CreateManagedAccountLambda: この関数は、アカウント一括作成プロセスを開始します。

ステップ 3: CreateManagedAccountLambda は、DynamoDB テーブルに問い合わせ、次に作成されるアカウントの詳細を取得します。 次に作成するアカウントがある場合はステップ 4 へ、ない場合はプロセスを完了します。

ステップ 4: CreateManagedAccountLambda は、AWS Service Catalog にて AWS Control Tower の Account Factory を起動し、新規アカウントの作成とプロビジョニングを行います。

ステップ 5: Account Factory がアカウント作成ワークフローを完了すると、CreateManagedAccount ライフサイクルイベントを生成し、イベントログにワークフローが SUCCEEDED か FAILEDかが記載されます。

ステップ 6: CloudWatch Events ルールが CreateManagedAccount ライフサイクルイベントを検出し、CreateManagedAccountLambda 関数をトリガーします。

ステップ 7: CreateManagedAccountLambda 関数は、アカウント作成ワークフローの結果を DynamoDB テーブルに更新します。 アカウントの作成に成功した場合は、DynamoDB テーブルの入力ファイルのエントリーに AWS アカウント ID を更新し、失敗した場合は、テーブルのエントリーに適切な失敗理由またはエラー理由を更新します。

ステップ 8: DynamoDB テーブルが更新されると、DynamoDB Streams は CreateManagedAccountLambda 関数をトリガーし、ステップ 3-7 が繰り返されます。

前提条件

本ソリューションには、以下の前提条件が必要です。

  • アカウントに AWS Control Tower のランディングゾーンがセットアップされている必要があります。 セットアップ方法については、AWS Control Tower ユーザーガイドを参照することができます。
  • このソリューションを実装するには、AWS Control Tower を起動したリージョンの AWS Organizations 管理アカウントに、AWS Control Tower の管理者としてログインする必要があります。
  • 入力ファイル (例: sample.csv) は、本ソリューションの起動時のみ読み込まれます。 入力ファイルの更新や、新しい入力ファイルでの CloudFormation スタックの更新は無視されます。
  • さらに新しい AWS アカウントを作成したい場合は、新しい入力ファイルを使用してこのソリューションを再度デプロイして下さい。

始める前に知っておきたいこと

AWS Control Tower の Account Factory は、新規アカウントの作成とプロビジョニングに最大 35 分かかることがあります。 この間、AWS Control Tower を使用して、組織単位 (OU) の作成や OU 上のガードレールの有効化などのアクションを実行することはできません。時間外や週末など、AWS Control Tower の使用が想定されない時間帯にこのソリューションの実行を検討することをお勧めします。

本ソリューションのソースコードは、こちらから入手可能です。

新規作成するアカウントのリストの準備

  1. 入力ファイルである sample.csv をローカルにダウンロードします。
  2. AWS Control Tower の Account Factory を使用して新規アカウントを作成するには、以下が必要です。
    • 新規アカウント名
    • 新規アカウントに関連付ける一意の電子メールアドレス
    • AWS IAM Identity Center (AWS Single Sign-On の後継サービス) のメールアドレス
    • AWS IAM Identity Center (AWS Single Sign-On の後継サービス) のユーザー名
    • 新規アカウントが配置される AWS Control Tower に登録済みの OU の名前
  3. この例では、次のスクリーンショットに示すように、作成する 3 つの新規アカウントについてこれらの詳細を記載しています。
  4. AWS Organizations 管理アカウントに Amazon S3 バケットを作成 します。S3 バケット名は、ソリューションを起動するときに使用するのでメモしておいて下さい。
  5. 入力ファイル sample.csv を、上記で作成した Amazon S3 バケットにアップロードします。

オプション: メール通知を受け取るための CloudWatch Events ルールの作成

これはオプションの手順です。以前の記事「AWS Control Tower アクションの追跡、およびワークフローの自動トリガーへのライフサイクルイベントの使用」で、CloudWatch Events ルールを作成し、Account Factory がアカウント作成ワークフローを完了した後にメールで通知される方法について説明していますので、ご参照下さい。

アカウント一括作成プロセスの起動

  1. CloudFormation スタック BatchAccountCreation.yaml を起動します。
  2. 次のスクリーンショットのようなページになっていることを確認します。Next をクリックします。
  3. Specify stack details ページで、
    1. スタック名を指定します。 この例では、次のスクリーンショットに示すように、スタック名を BatchAccountCreation に設定します。
    2. Parameters の下にある、
      1. S3BucketName を先ほど作成したバケットに設定します。
      2. sample.csv の名前を先に変更した場合は、S3KeyName を更新します。
    3. Next をクリックします。
  4. Review のページに進みます。 Step 1: Specify templateStep 2: Specify stack details で設定詳細を確認します。 IAM リソースが作成される可能性があることを確認し、[Create Stack] を選択します。

アカウントの一括作成が開始されました。 以下のスクリーンショットのように、CloudFormation コンソール、または AWS Control Tower ダッシュボードの Activities ページで進捗を確認することができます。


アカウントの作成が完了すると、以下のスクリーンショットのように、AWS Control Tower ダッシュボード上でアカウントを確認することができます。


Account Factory がアカウント作成ワークフローを完了した後にメール通知を受け取る CloudWatch Events ルールを作成した場合、以下のスクリーンショットのように、CreateManagedAccount ライフサイクルイベントログをメールで受け取ることができます。


最後に、DynamoDBのコンソールBatchAccountCreation-NewAccountDetailsTable-* テーブルの詳細を確認することができます。 このテーブルは、CloudFormation スタックの BatchAccountCreation で作成されています。以下のスクリーンショットにあるように、このテーブルには AWS アカウント ID と共に作成されたアカウントのリストと、新しいアカウントの親 OU が表示されます。 次のスクリーンショットには表示されていませんが、このテーブルには、アカウントのメールアドレス、SSO のメールアドレス、SSO ユーザーの名 (ファーストネーム) と姓 (ラストネーム) もリストアップされることがあります。このテーブルは、個々のアカウント作成プロセスの完了後に更新されるため、いつでもアクセスして、一括アカウント作成プロセスの現在のステータスを知ることができます。

よくあるエラーへの対応

お客様のご意見として、新規アカウント作成時のよくあるミスやエラーには以下のようなものがあるようです。

  1. 既に他の AWS アカウントに関連付けられた電子メールアドレスを設定しようとする
  2. AWS Control Tower に登録されていない OU にアカウントを配置しようとする

上記で説明したように、Lambda 関数 NewAccountHandlerLambda は、入力ファイル sample.csv の入力パラメーターを検証しています。 例えば、Lambda 関数は各入力項目の指定 OU が AWS Control Tower に登録されているかを確認し、登録されていない場合、その入力項目の DynamoDB エントリは INVALID とマークされます。

Account Factory がエラーに遭遇し、ワークフローを完了できなかった場合、ソリューションではエラーメッセージと Account Factory が返したステータスの両方を報告します。

このソリューションのエラー処理能力を確認するためには、次のスクリーンショットのように、元の sample.csv ファイルからもうひとつのエラー確認用の入力ファイル sample-err.csv を作成します。

sample-err.csv には、以下のエラーの原因を含めます。

  1. Test-account-4 のメールアドレスが Test-account-1 に関連付けられたメールアドレスと同じである。
  2. Test-account-6 の指定 OU である Test-OU-3 が存在しない。

Test-account-5 にはエラー原因を含めないこととします。

次に、前述の通りに S3 バケットに sample-err.csv をアップロードします。CloudFormation スタック BatchAccountCreation.yaml を実行し、スタック名を BatchAccountCreation-Err とし、オブジェクト URL はアップロードした sample-err.csv オブジェクトを使用するようにします。

アカウントの一括作成が完了したら、以下のスクリーンショットのように DynamoDB のコンソールで新たなテーブル BatchAccountCreation-Err-NewAccountDetailsTable-* を確認することができます。 想定通り、Account Factory は Test-account-5 の作成には成功した一方で、Test-account-4Test-account-6 の作成には失敗していることがわかります。

以下のスクリーンショットのように、この表を BatchAccountCreation-Err-Results.csv というファイルにエクスポートして、Account Factory が返すエラーメッセージを調査することができます。 Test-account-4 では、アカウントに設定しようとしたメールアドレスが既にに他の AWS アカウントと関連付けられているため、このアカウントは作成されなかったという Account Factory の報告が確認できます。Test-account-6 では、Lambda 関数 NewAccountHandlerLambdaTest-OU-3 はこの Organizations で有効な OU ではないことを検出し、アカウント作成プロセスを起動しなかったことが確認できます。

クリーンアップの手順

  1. AWS CloudFormation コンソールにアクセスし、アカウントの一括作成プロセスを実行するためにデプロイしたCloudFormation スタックを削除します。 これは、CloudFormation スタックがこのソリューションの一部として作成した 2 つのLambda関数、CloudWatch Event ルール、DynamoDB テーブルなどのリソースを削除します。
  2. アカウント作成の最終ステータスは、.csv ファイルにエクスポートするか、後に参照するために CloudWatch Logs に保持することができます。
  3. Account Factory がアカウント作成ワークフローを終了する度にメール通知を受け取るように CloudWatch Events ルールを作成した場合、CloudWatch Events コンソールからそのイベントルールを削除します。
  4. AWS Service Catalog コンソールの provisioned products ページにアクセスすると、Account Factory で作成された全てのアカウントを、正常に作成されたかどうかに関係なく表示することができます。

まとめ

今回は、AWS Control Tower で複数アカウントの作成を自動化する方法を紹介しました。 アカウント作成の一括処理が完了すると、その結果をレポートとしてダウンロードすることができます。また、アカウント作成プロセス中のエラーを処理できるアーキテクチャも紹介しました。

さらに、Customizations for AWS Control Tower を使用して、カスタムテンプレートとポリシーをアカウントに適用することができます。カスタムテンプレートを使用すると、新しいリソースをデプロイすることや、新しいアカウントに追加のカスタムポリシーを適用することができます。加えて、このソリューションは AWS Control Tower のライフサイクルイベントと統合されているので、デプロイされたリソースはお客様のランディングゾーンと同期されています。

ブログ著者について

  • Kishore Vinjam は、AWS Service Catalog、AWS Control Tower、AWS Marketplace にフォーカスしたパートナーソリューションアーキテクトです。クラウド技術に携わり、顧客と共にソリューションを構築することに情熱を注いでいます。仕事以外の時間は、家族と過ごすこと、ハイキング、バレーボールや卓球をすることを好んでいます。
  • Raja Mani は、AWS パートナーをサポートするソリューションアーキテクトです。サーバーレス開発、DevOps、コンテナ、ビッグデータ、セキュリティ、機械学習に関心を持っています。AWS パートナーが顧客のためにエンタープライズグレードの AWS ソリューションを構築することを支援しています。
  • Kalyan Ghatak は、AWS Control Tower チームのシニアテクニカルプロダクトマネージャーです。Kalyan は、AWS の顧客と共に困難な問題を解決し、AWS 上での構築を支援することが大好きです。仕事以外では、クラシック音楽を聴いたり、古典を読んだりすることを好んでいます。

本ブログの翻訳はソリューションアーキテクトの山田が担当しました。原文はこちらから参照できます。