Control Tower 環境に既存の AWS アカウントを追加する

Control Tower 環境に既存の AWS アカウントを追加する

Control Tower 環境に既存の AWS アカウントを追加する手順をまとめました。事前準備が肝です。
Clock Icon2025.03.24

コーヒーが好きな emi です。

既存の AWS アカウントを Control Tower に参加させたいシーンがありました。
過去何回も擦られたネタかもしれませんが、読むのと自分でやるのとでは理解に差があると思うので改めて記事に手順を残しておきます。

今回の検証イメージ

以下のように、右の Organizations 組織の管理アカウントを、左の Control Tower 環境に登録したいと考えています。
add-an-existing-aws-account-to-control-tower-env_28

Control Tower に登録するには、事前に以下を確認し準備しておく必要があります。
add-an-existing-aws-account-to-control-tower-env_29

1. AWS Config を無効化
2. 既存の CloudTrail が必要か確認し不要であれば削除
3. ガードレールの SCP で影響が出るものがないか確認する
4. STS エンドポイントが有効化されているか
5. Control Tower 用の IAM Role(AWSControlTowerExecution)を作成
6. 既存の Organizations 組織を削除(メンバーアカウントであれば旧組織を離れておく)
7. Control Tower 管理アカウントと同じ Organizations 組織に所属させる

上記事前準備が終わったら、最後に Control Tower への登録を行います。
add-an-existing-aws-account-to-control-tower-env_30

事前準備

1. AWS Config を無効化

以下ブログのスクリプトで確認しました。
https://dev.classmethod.jp/articles/check-config-status-cloudshell/

2. 既存の CloudTrail が必要か確認し不要であれば削除

以下ブログのスクリプトで確認しました。
https://dev.classmethod.jp/articles/check-cloudtrail-status-cloudshell/

3. ガードレールの SCP で影響が出るものがないか確認する

Control Tower では全アカウントで準拠すべき設定を強制するために「コントロール」というものを有効化できます。

このコントロールを有効にしておくと、例えば「Amazon API Gateway ステージのすべてのメソッドでキャッシュが有効になっていて、キャッシュが暗号化されているかどうかを確認します」とか、「Amazon S3 でバッキングされたオリジンを使用する Amazon CloudFront ディストリビューションでオリジンアクセス制御を設定するよう要求する」とか、そういった設定を強制することができます。

実態は裏で AWS Config が動いています。

つまり上記の例で言うと、これから Control Tower 環境に参加させたいアカウントで CloudFront ディストリビューションで Origin Access Control (OAC) が有効になっていない場合、Control Tower のコントロールが有効になっていることが原因で何かしらのエラーが発生する可能性があるわけです。

ガードレールに限らず、SCP で例えばオレゴンリージョンの利用を禁止しているにも関わらず CloudFront がオレゴンリージョンにある!みたいなケースでエラーが発生したり既存のリソースに影響が発生する可能性があります。

そういった不具合が発生しないかどうかをここで確認します。

今回 Control Tower 環境に参加させたいアカウントが別の Organizations の管理アカウントだったため、Control Tower 環境に参加させたいアカウント側でも SCP を確認しておきます。

組織の構造は以下のようになっています。青枠で「これから Control Tower に参加させたいアカウント」を表現します。
add-an-existing-aws-account-to-control-tower-env_1

SCP を確認すると、リージョン制限の SCP を設定していました。これは今後 Control Tower 側に移植することにしましょう。
add-an-existing-aws-account-to-control-tower-env_2

参考:limit-region の中身
limit-region.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyAllOutsideRequestedRegions",
      "Effect": "Deny",
      "NotAction": [
        "cloudfront:*",
        "iam:*",
        "route53:*",
        "support:*",
        "aws-portal:*",
        "budgets:*"
      ],
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:RequestedRegion": [
            "us-east-1",
            "us-west-2",
            "ap-northeast-1",
            "ap-northeast-3"
          ]
        }
      }
    }
  ]
}

続いて Control Tower 側の SCP を確認します。Control Tower 側の管理アカウントはピンクの枠で表現します。

まずは Root 直下に何か SCP が無いか確認しましたが、FullAWSAccess だけなので大丈夫そうですね。
add-an-existing-aws-account-to-control-tower-env_3

続いてこれからアカウントを追加させる予定の workload OU に SCP があたっていないか確認します。直接 Organizations 側から SCP を設定していなかったので、存在していたのは「aws-guardrails-」で始まる SCP だけでした。
「aws-guardrails-」で始まる SCP に関しては以下のブログも参照ください。

https://dev.classmethod.jp/articles/what-is-aws-guardrails-scp-control-tower/

Control Tower コンソールから workload OU でコントロールが何か有効になっていないか確認します。
[組織] - [workload] から有効なコントロールを確認します。
add-an-existing-aws-account-to-control-tower-env_4

見たところ、Control Tower 側で作成されるリソース(Config や CloudWatch Logs など)の変更を拒否するコントロールが有効になっているようでした。これなら既存のワークロードに影響はなさそうです。

4. STS エンドポイントが有効化されているか

これから Control Tower 環境に追加登録するアカウントで、IAMコンソールの [アカウント設定] → [Security Token Service(STS)] から STS エンドポイントが有効になっているか確認しておきます。

add-an-existing-aws-account-to-control-tower-env_5

良さそうです。

5. Control Tower 用の IAM Role(AWSControlTowerExecution)を作成

Control Tower がアカウントを管理するために、AWSControlTowerExecution というロールを使用します。そのため、Control Tower へ登録する前に以下の設定で IAM ロールを手動で作成しておく必要があります。

https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/enrollment-prerequisites.html

設定内容は Control Tower用のIAM Role(AWSControlTowerExecution)を作成しているか も参考にしてください。

今回は IAM コンソールから手動で作ってみます。
add-an-existing-aws-account-to-control-tower-env_6

信頼されたエンティティタイプは AWS アカウントで、Control Tower の管理アカウント ID を入力します。
add-an-existing-aws-account-to-control-tower-env_7

設定する許可は AdministratorAccess (AWS管理ポリシー) です。
できた IAM ロールはこんな感じです。
add-an-existing-aws-account-to-control-tower-env_8

6. 既存の Organizations 組織を削除(メンバーアカウントであれば旧組織を離れておく)

対象アカウントが Organizations 組織のメンバーアカウントである場合、別の Organizations 組織配下に入ることはできません。事前に Organizations 組織を離れておく必要があります。

https://dev.classmethod.jp/articles/navigate-to-organizations/

今回 Control Tower 環境に追加登録したいアカウントが別の Organizations 組織の管理アカウントであったため、組織を離れることができず、組織を削除しました。

add-an-existing-aws-account-to-control-tower-env_14

add-an-existing-aws-account-to-control-tower-env_15

7. Control Tower 管理アカウントと同じ Organizations 組織に所属させる

Control Tower 管理アカウント側から Organizations 組織へ招待を送信します。Organizations コンソールで「招待」を開き、「AWS アカウントを招待」をクリックします。
add-an-existing-aws-account-to-control-tower-env_9

「既存の AWS アカウントを招待」を選択し、登録する AWS アカウントのアカウント ID を入力して招待を送信します。
add-an-existing-aws-account-to-control-tower-env_10

招待が送信されます。
add-an-existing-aws-account-to-control-tower-env_11

登録する AWS アカウントのメールボックスに、招待メールが届いています。これから Control Tower 環境に参加する AWS アカウントを開いているブラウザで招待を Accept します。
add-an-existing-aws-account-to-control-tower-env_12

1 件の招待が届いています。
add-an-existing-aws-account-to-control-tower-env_16

「招待を承諾する」で承諾します。
add-an-existing-aws-account-to-control-tower-env_17

Control Tower 環境の Organizations に参加できました。
※まだ Control Tower には登録されていません。
add-an-existing-aws-account-to-control-tower-env_18

ついでに workload OU にアカウントを移動しておきましょう。Conrol Tower の管理アカウントで Organizations コンソールを開き、登録したアカウントにチェックしてアクションから「移動」をクリックします。
add-an-existing-aws-account-to-control-tower-env_19

workload をチェックして「AWS アカウントを移動」をクリックします。
add-an-existing-aws-account-to-control-tower-env_20

今、Control Tower 環境の Organizations に参加しましたが、Control Tower にはまだ登録されていない状態です。
add-an-existing-aws-account-to-control-tower-env_29

Control Tower への登録

Organizations 組織まで参加できていればもうほぼ終わったような感じですが、最後に Control Tower 環境に登録します。
add-an-existing-aws-account-to-control-tower-env_30

Control Tower コンソールを見ると、今回追加登録したいアカウントが表示されていますが、まだ「未登録」となっています。アクションから「登録」をクリックします。
add-an-existing-aws-account-to-control-tower-env_21

参加する組織単位で workload OU が選択されていることを確認し「アカウントの登録」を「クリックします。
add-an-existing-aws-account-to-control-tower-env_22

確認画面で再度「アカウントの登録」をクリックします。
add-an-existing-aws-account-to-control-tower-env_23

「登録リクエストが送信されました」と表示されています。リクエストの詳細については Service Catalog を確認するように書かれているので、リンクをクリックして Service Catalog を開きます。
add-an-existing-aws-account-to-control-tower-env_24

Service Catalog を開くと以下のようにステータスが「変更中」になっています。
add-an-existing-aws-account-to-control-tower-env_25

10 分ほど待って再度確認すると、ステータスが「使用可能」になっていました。
add-an-existing-aws-account-to-control-tower-env_26

Control Tower 組織から確認すると、新規登録したアカウントが「登録済み」になっていることが確認できました。
add-an-existing-aws-account-to-control-tower-env_27

おわりに

Control Tower 環境に既存の AWS アカウントを追加する手順をまとめました。事前準備が肝でしたね。

本記事への質問やご要望については画面下部のお問い合わせ「DevelopersIO について」からご連絡ください。記事に関してお問い合わせいただけます。

参考

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html
https://aws.amazon.com/jp/blogs/news/how-to-use-regional-aws-sts-endpoints/
https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/awscontroltowerexecution.html
https://dev.classmethod.jp/articles/registering-an-existing-account-in-control-tower/
https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/enroll-account.html
https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/enrollment-prerequisites.html
https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/awscontroltowerexecution.html
https://dev.classmethod.jp/articles/navigate-to-organizations/
https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/getting-started-prereqs.html

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.