Amazon Web Services ブログ

既存のAWSアカウントを AWS Control Tower へ登録する

AWS Control Tower のリリース後、多くのお客様からいただいていたご要望がありました。既存のAWS Organizations に AWS Control Tower をデプロイすることと、組織が持つ他のアカウントにもガバナンスを拡張することです。

このたび、AWS Control Tower を既存の AWS Organization にデプロイできるようになったことをアナウンスいたします。一方で、AWS Control Tower をデプロイする前に作成した AWS アカウント(ここでは「未登録アカウント」と呼びます)は、デフォルトでは AWS Control Tower ガバナンスの範囲外になります。そのため、これらの未登録アカウントは明示的に AWS Control Tower へ登録する必要があります。

既存アカウントを AWS Control Tower へ登録することで、アカウントベースライン(基本設定)と追加のガードレールが配備され、継続的なガバナンス(Continuous Governance)が有効になります。なお、アカウントを登録する前には、適切なデューデリジェンス(事前評価)を行う必要があります。以下に記載されている「考慮すべき事項」セクションの追加情報を参照してください。

このブログでは、AWS Organizations 内の 未登録 AWS アカウントと 未登録 OU(Organization Units = 組織単位)内のアカウントを、プログラムによって AWS Control Tower へ登録する方法を解説します。

背景

この投稿で使用する用語を簡単に説明します。

  • この投稿で紹介するPythonスクリプト。このスクリプトは複数のAWSサービスを使用して、未登録アカウントを識別し、検証し、AWS Control Tower へ登録します。
  • 未登録OU は、 AWS Organizations により作られたOUです。AWS Control Tower はこのOUを管理していません。
  • 未登録アカウントは、AWS Control Tower の外で作られた既存の AWS アカウントです。AWS Control Tower はこのアカウントを管理していません。
  • 登録済OU は、 AWS ControlTowerサービスによって作られたOUです。これは AWS Control Tower によって管理されています。
  • OUが AWS Control Tower に登録されると、指定したベースラインとガードレールが、対象のOUとOUが持つ全てのアカウントに適用されます。
  • AWS Account Factory アカウントとは、 AWS Control Tower の アカウントファクトリー(Account Factory)を使って作成したアカウントです。
  • Amazon Elastic Compute Cloud (Amazon EC2) は、セキュアでリサイズ可能なコンピュートキャパシティをクラウド上で提供するWebサービスです。
  • AWS Service Catalog は、標準的なITサービスのデプロイを集中管理するサービスです。アカウントファクトリーは AWS Service Catalogを使って新しいAWS アカウントを作成します。
  • AWS Organizations は 、AWS上のワークロードが成長し、スケールするにあたって、AWS 環境の集中的な統制をサポートするサービスです。
  • AWS Single Sign-on (SSO) は、複数の AWS アカウントへのアクセスを集中的に管理することを容易にするサービスです。各ユーザに対し、割り当てられたアカウントへのシングルサインオンアクセスを提供する単一の場所です。

考慮すべき事項

オフィシャルドキュメントの「既存のアカウントを AWS ControlTower へ登録する(Enrolling an existing AWS account into AWS Control Tower)」 は未登録アカウントを手動で登録済OUへ登録する手順について記述しています。このブログで提供する Python スクリプトでは、 既存のAWS アカウントを プログラマティックに AWS Control Tower へ登録できます。ただ、このスクリプトは対象のアカウントでどのようなリソースが動いているのか、そのコンテキストを把握しません。つまり、このスクリプトを実行してアカウントを登録する前に、ご自身でアカウントの状態を検証しておく必要があります。

以下に、アカウントを AWS Control Tower へ登録する前にチェックすべきガイドラインを示します。

  1. AWSControlTowerExecution ロールが各アカウントに作成済みであること。ただし、このソリューションで提供しているスクリプトを使う場合は自動的にこのロールを作成することができます。
  2. そのアカウントにデフォルトVPCがある場合は、登録処理の途中で削除を試みます。そのため、デフォルトVPCの中に何らかのリソースがあると、そのアカウントの登録は失敗します。
  3. 登録しようとするアカウントで一度もAWS Configを有効化したことがなければ、default コンフィグレーションレコーダーとデリバリチャネルが作られます。そのためアカウントの登録を正常に動作させるためには、事前にコンフィグレーションレコーダ と デリバリチャネルを削除してください。
  4. アカウントをご自身の環境に登録するときに発生する依存関係や影響をよく理解するために、まず開発およびステージングアカウントを使って検証を行なってください。
  5. AWS Control Tower に新しいOU(組織単位)を作ってください。そして、そこにアカウントを登録するまでいかなる追加のガードレールも有効化しないでください。これによってガードレールを1つ1つ有効化することが可能になり、ガードレールがご自身の環境へ与える影響を確認することができます。
  6. 追加のオプションとして、既存AWS アカウントを Control Tower のガバナンス配下に登録する前に、AWS Control Tower の発見的ガードレールを適用する方法があります。この具体的な方法は 「AWS Config 適合パックを使用したAWS Control Tower発見的ガードレールの実装 (原文: AWS Control Tower Detective Guardrails as an AWS Config Conformance Pack )」ブログに記載しています。

前提条件

既存のアカウントをAWS Control Tower に登録する前に、AWS Control Tower ドキュメントに記載されている前提条件をご確認ください。

このブログで紹介するPythonスクリプトは未登録OUが持つすべてのアカウントを AWS Control Tower へ登録することをサポートします。このスクリプトは未登録アカウントのEmailアドレスまたはアカウントIDいずれかを使って、単一のアカウントを登録することもサポートします。以下はこのソリューションについて追加で知っておいていただきたい事項です。

  • AWS Organizatinsで AWS CloudFormation StackSets に対する信頼アクセスを有効化してください。
  • AWSアカウントに紐づいたメールアドレスがAWS SSOのユーザ名として使われます。デフォルトではFirst Name(名)がAdmin、Last Name(姓)がUserです。
  • AWS Organizationsの組織のルートに存在するアカウントは一度に1つずつしか登録できません。
  • このスクリプトを使ってOU全体を登録する際、AWSControlTowerExecution ロールが OU内の全てのアカウントに作られます。
  • このスクリプトで未登録OUに所属する1つのアカウントを登録できます。このスクリプトは AWSControlTowerExecution ロールがアカウントに存在するかをチェックします。もしこのロールが存在しなければ、そのロールはOU内の全てのアカウントに対して作成されます。
  • デフォルトでは、組織のルートにあるアカウントを登録することはできません。そのためには組織のアカウント全てにロールを作成する必要があり、追加でフラグを渡すことでそのためのスタックセットを起動できます。
  • ルートに存在する単一のアカウントを登録する際、スクリプトはメッセージを表示して、組織全体にロールを作成するスタックセットを起動するフラグを指定するよう求めます。
    このスクリプトは CloudFormation スタックセットの Service-Managed Permissions を使って 未登録アカウントに AWSControlTowerExecution を作ります。

ソリューションの仕組み

次の図にこのソリューションの概要を示します。

  1. AWS Control Tower 環境のマスターアカウントにて、そのホームリージョンで稼働するAmazon EC2 インスタンスにアクセスします。
  2. AWS SSO ログイン画面から AWSAdministratorAccess のテンポラリクレデンシャルを取得します
  3. enroll_script.py スクリプトをダウンロードして実行します。
  4. スクリプトは スタックセットの自動デプロイメント機能を使って ターゲットアカウントに AWSControlTowerExecution ロールを作ります。
  5. 入力として与えられたロールとOUの検証が成功すると、スクリプトはアカウントファクトリーで新しいプロダクトを起動します。
  6. 登録プロセスはAWSアカウントと同じメールアドレスでAWS SSOユーザを作成します。

環境のセットアップ

各アカウントをAWS Control Tower へ登録するためには最大で30分程度かかります。アカウントは一度に1つしか登録されません。登録するアカウントの数に応じてセッションを十分に長い間開いておく必要があります。このセクションでは、これらの長い実行ジョブをAmazon EC2上で中断なく維持するため、screenを使った方法を紹介します。

セッションタイムアウトを管理するために自分自身のコンピュート環境を使いたいかもしれません。もしご自身の環境を使う場合は、python3screen、そして最新のboto3 がインストールされていることを確認してください。

1. コンピュート環境を準備する

  • AWS Control Tower に AWSAdministratorAccess でログインします。
  • 必要に応じて、 AWS Control Tower をデプロイしたリージョンに切り替えます。
  • 必要に応じて、このスタックを使って VPC を立ち上げて、スタックの状態が COMPLETE になるまで待ちます。
  • 必要に応じて、このスタックを使って Amazon EC2 を起動し、スタックの状態が COMPLETE になるまで待ちます。
  • マスターアカウントにて、必要な長さにまで AWS SSO のセッション時間を増加します。デフォルトは1時間で最大は12時間です。

2. コンピュート環境に接続する(一つの例)

  • EC2ダッシュボードへ行き、「実行中のインスタンス」を選択します。
  • 先ほど作成したEC2インスタンスを選択し、「接続」を選択します。
  • インスタンスに接続画面の下部にある「接続方法」から、「EC2 Instance Connect (ブラウザベースのSSH接続)」 を選択し、「接続」を指定してセッションを開きます。
  • ブラウザでAWS Single Sign-on ページに行き、マスターアカウントをクリックします。
  • AWSAdministratorAccess の横にある「コマンドラインまたはプログラムアクセス」を選択します。
  • 「オプション1」から環境変数をコピーします。これは後にステップ5でEC2ターミナルスクリーンに貼り付けるものです。

3. 必要なパッケージや関連物をインストールします。新しいEC2インスタンスを起動するためにステップ1で提供されたスタックを使った場合は、このステップをスキップできます。

  • python3boto3 を EC2 インスタンスにインストールします。ご自身の環境を使っている場合は boto3 をアップデートする必要があるかもしれません。
$ sudo yum install python3 -y
$ sudo pip3 install boto3
$ pip3 show boto3
Name: boto3
Version: 1.12.39
  • ホームディレクトリへ移動して、enroll_account.py スクリプトをダウンロードします。
$ cd ~
$ wget https://raw.githubusercontent.com/aws-samples/aws-control-tower-reference-architectures/master/customizations/AccountFactory/EnrollAccount/enroll_account.py
  • EC2ターミナルでホームリージョンをセットアップします。
export AWS_DEFAULT_REGION=<AWSControlTower-Home-Region>

4. screen セッションをデーモンモードで起動します。セッションがタイムアウトした場合は新しいセッションを開いてその screen に接続することができます。

$ screen -dmS SAM
$ screen -ls
There is a screen on:
585.SAM (Detached)
1 Socket in /var/run/screen/S-ssm-user.
$ screen -dr 585.SAM

5. screen のターミナルに ステップ2でメモした環境変数を貼り付けます。

6. マイグレーション予定の未登録OUを識別し、以下に記載したオプションを与えてPythonスクリプトを起動します。

  • Pythonスクリプトの使用方法:
usage: enroll_account.py -o -u|-e|-i -c
Enroll existing accounts to AWS Control Tower.

optional arguments:
-h, --help show this help message and exit
-o OU, --ou OU Target Registered OU
-u UNOU, --unou UNOU Origin UnRegistered OU
-e EMAIL, --email EMAIL
AWS account email address to enroll in to AWS Control Tower
-i AID, --aid AID AWS account ID to enroll in to AWS Control Tower
-c, --create_role Create Roles on Root Level
  • 未登録OUの全てのアカウントを、登録済OUへ登録する:
$ python3 enroll_account.py -o MigrateToRegisteredOU -u FromUnregisteredOU
Creating cross-account role on 222233334444, wait 30 sec: RUNNING
Executing on AWS Account: 570395911111, USER+SCADMINT1@amazon.com
Launching Enroll-Account-vinjak-unmgd3
Status: UNDER_CHANGE. Waiting for 6.0 min to check back the Status
Status: UNDER_CHANGE. Waiting for 5.0 min to check back the Status
. .
Status: UNDER_CHANGE. Waiting for 1.0 min to check back the Status
SUCCESS: 111122223333 updated Launching Enroll-Account-vinjakSCchild
Status: UNDER_CHANGE. Waiting for 6.0 min to check back the Status
ERROR: 444455556666
Launching Enroll-Account-Vinjak-Unmgd2
Status: UNDER_CHANGE. Waiting for 6.0 min to check back the Status
. .
Status: UNDER_CHANGE. Waiting for 1.0 min to check back the Status
SUCCESS: 777788889999 updated
  • 未登録OU内の単一のアカウントを、アカウントIDを指定して登録する
$ python3 enroll_account.py -o MigrateToRegisteredOU -i 111122223333
  • 未登録OU内の単一のアカウントを、メールアドレスを指定して登録する
$ python3 enroll_account.py -o MigrateToRegisteredOU -e JohnDoe+outside-ct-ou@amazon.com

 

デフォルトでは組織のルートにあるAWSアカウントを登録することはできません。
スクリプトは AWSControlTowerExecution ロールがアカウントにあることをチェックします。もしこのロールがない場合は -c | --create-role を使うよう求めます。 -c フラグを使うことで、組織のルートにスタックインスタンスが追加されます。これは組織の全てのアカウントに AWSControlTowerExecution ロールが作られることを意味します。

注意: -c フラグを使う前に、組織の全てのアカウントに AWSControlTowerExecution ロールを作ることが、あなたの組織として許容できることを確認してください。

もしこれが許容できない場合は、登録対象のアカウントそれぞれに対し、ドキュメントの手順に従って AWSControlTowerExecution ロールを手動で作成してください。その後スクリプトを再実行してください。

  • ルートOU内の単一のアカウントを、AWS アカウントIDを指定して登録する ( -c フラグを使用する場合)
$ python3 enroll_account.py -o MigrateToRegisteredOU -i 111122223333 -c
  • ルートOU内の単一のアカウントを、メールアドレスを指定して登録する ( -c フラグを使用する場合)
$ python3 enroll_account.py -o MigrateToRegisteredOU -e JohnDoe+in-the-root@amazon.com -c

クリーンアップ

全てのアカウントのAWS Control Tower 環境への登録が正常に完了したら、このソリューションで使用した以下のリソースを削除できます。
このブログで提供した CloudFormation テンプレートを使ってVPCやEC2インスタンスを作成した場合は、それぞれの CloudFormation スタックを削除してください。

まとめ

このたび、既存の AWS Organization に AWS Control Tower をデプロイすることができるようになりました。この投稿では、AWS Organizations 内の既存の AWSアカウントを AWS Control Tower に登録する方法を紹介しました。この手順によって、OUに存在する単一あるいは全てのアカウントをAWS Control Tower 環境へプログラマティックに登録することができます。
これによって既存のアカウントにガバナンスが展開されたことに加え、新規のアカウントを数クリックで展開し、そのアカウントを企業全体のポリシーに準拠させることもできるようになります。
加えて、アカウントにカスタムテンプレートやポリシーを適用するため、AWS Control Tower のカスタマイズソリューションを利用することも可能です。このカスタムテンプレートによって、既存あるいは新規のアカウントに対し、別の新しいリソースをデプロイしたり、追加のカスタムポリシーを適用したりすることが可能になります。このソリューションはAWS Control Tower ライフサイクルイベントと統合しており、ガードレールなどのリソースの展開処理をランディングゾーン全体で一致させることが可能です。このソリューションを利用することで、例えば、AWS Control Tower アカウントファクトリーで新しいアカウントを作成した時に、OUに紐づく全てのリソースがそのアカウントへ確実かつ自動的に展開されるようになります。

著者について

Kishore Vinjam は AWS Service Catalog、AWS Control Tower、そしてAWS Marketplace にフォーカスするパートナーソリューションアーキテクトです。彼はクラウドのテクノロジーについて、そしてお客様のためのソリューションを構築することについて情熱を持っています。仕事以外の時間は家族とともに過ごし、散歩し、バレーボールと卓球を楽しんでいます。

原文はこちら。翻訳はSA大村が担当しました。