Contorol Towerの管理からメンバーアカウントを外す時、AWSControlTowerExecutionを作成したスタックインスタンスは削除されない

Contorol Towerの管理からメンバーアカウントを外す時、AWSControlTowerExecutionを作成したスタックインスタンスは削除されない

2026.01.20

皆さんは、Control Towerの管理配下にあるメンバーアカウントのに対して管理を解除した時に、CloudFormation StackSetsで作成されたAWSControlTowerExecutionロールがどうやって削除されるか気になったことはありますか?私はあります。

何を言っているのか?

Control Towerに管理されたAWSアカウントには必ず、AWSControlTowerExecution という名前のIAMロールが存在している必要があります。
https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/awscontroltowerexecution.html

AWSControlTowerExecutionロールを作成するために、以下のパターンがあります。

  • 手動で作る
  • Account Factory で作成されたアカウントは自動で作成される
  • OUの再登録をすることで、StackSet-AWSControlTowerExecutionRole によって作成される
  • For accounts in the Security OU (sometimes called core accounts), AWS Control Tower creates the role at the time of initial AWS Control Tower setup.
  • For an Account Factory account created through the AWS Control Tower console, AWS Control Tower creates this role at the time of account creation.
  • For a single account enrollment, we ask customers to manually create the role and then enroll the account in AWS Control Tower.
  • When extending governance to an OU, AWS Control Tower uses the StackSet-AWSControlTowerExecutionRole to create the role in all accounts in that OU.
    https://docs.aws.amazon.com/controltower/latest/userguide/awscontroltowerexecution.html

Control Towerに管理されたAWSアカウントの登録を解除すると、手動で作成された/自動で作成された に関わらずAWSControlTowerExecutionロールは削除されます。

アカウントの登録を解除すると、手動で作成されたか、AWS Control Tower 自体によって作成されたかにかかわらず、AWS Control Tower は AWSControlTowerExecution ロールを削除します。
https://docs.aws.amazon.com/controltower/latest/userguide/awscontroltowerexecution.html

この記事では、CloudFormation StackSetsによって作成されたAWSControlTowerExecutionロールが、どのように削除されるかに焦点当てて検証してみます。

先に結論

  • AWSControlTowerExecutionロールはControl Towerが直接APIを実行して削除する
  • 作成時に利用したCloudFormation StackSetsのスタックインスタンスは残る

やってみる

準備

今回は検証ために以下のControl Tower環境を用意しました。(いずれもControl Towerに登録済み)

  • root
    • MembersControlTowerOU
      • SandboxOU
        • WorkloadsOU-Account(5590xxxxx)

スクリーンショット 2026-01-20 9.53.05.png

この記事で使うAWSアカウント(5590xxxxx)は以下のブログ手順に従って、Control Tower環境への登録を行いました。
https://dev.classmethod.jp/articles/202404-how-to-register-multiple-existing-accounts/

管理アカウントのCloudFormation StackSetsを確認すると、対象のアカウントに対してAWSControlTowerExecutionRoleというStackSetsがデプロイされています。
スクリーンショット 2026-01-20 11.37.18.png

Control Towerの管理を解除

続いてこのアカウントをControl Towerの管理から外します。
該当のアカウントを選択し「管理を解除」をクリックします。
スクリーンショット 2026-01-20 12.11.08.png

数分経つと、 AWS Control Tower baseline status および AWS Config ベースラインのステータス が「有効になっていません」となり、Control Towerの管理から外れたことがわかります。
スクリーンショット 2026-01-20 14.11.27.png

アカウントの詳細からも、Control Towerの管理から外れたことが確認できます。
スクリーンショット 2026-01-20 14.13.14.png

StackSetsを確認

続いて管理アカウントから、CloudFormation StackSetsを確認します。
Control Towerの管理から外れたアカウント(5590xxxxx)のスタックインスタンスが残っています。
スクリーンショット 2026-01-20 14.18.26.png

オペレーションを確認しても、DELETEは実行されてません。
スクリーンショット 2026-01-20 14.21.49.png

アカウント側からAWSControlTowerExecutionの存在を確認

Control Towerの管理から外れたアカウント(5590xxxxx)へログインし、CloudFormation スタックを確認します。

StackSet-AWSControlTowerExecutionRole-{ハッシュ値} のスタックを確認すると、ステータスは CREATE_COMPLETE のままです。AWSControlTowerExecution という名前のIAMロールがこのスタックによって作成されていますが、スタックからの削除操作は実施されていないようです。

スクリーンショット 2026-01-20 14.32.25.png

物理IDのリンクを開くと、AWSControlTowerExecutionは存在しないとこがわかります。
スクリーンショット 2026-01-20 14.35.27.png

ドリフト検出の結果を見ると、ステータスが「DELETED」になっていました。
スクリーンショット 2026-01-20 14.36.30.png

ここまでで、 AWSControlTowerExecutionは削除されているが、CloudFormation StackSetsから削除されているわけではない ことがわかりました。

最後にCloudTrailの証跡から確認してみます。
AWSControlTowerExecutionのIAMロールに対して、以下の順番でイベントが実行されてました。

  1. DetachRolePolicy
  2. DeleteRolePolicy
  3. DeleteRole

いずれのアクションも controltower.amazonaws.com が _arn:aws:sts::5590XXXXXXX:assumed-role/AWSControlTowerExecution にスイッチして、実施されています。

~ $ aws cloudtrail lookup-events \
>   --lookup-attributes AttributeKey=ResourceName,AttributeValue=AWSControlTowerExecution \
>   --max-results 50 \
>   --region us-east-1
{
    "Events": [
        {
            "EventId": "512448eb-7be8-4369-9bb5-ad6d466d4c95",
            "EventName": "DeleteRole",
            "ReadOnly": "false",
            "AccessKeyId": "ASIAYEKXXXXXXXXXX",
            "EventTime": "2026-01-20T03:14:36+00:00",
            "EventSource": "iam.amazonaws.com",
            "Username": "terminate-product-delete-roles-oQRIU",
            "Resources": [
                {
                    "ResourceType": "AWS::IAM::Role",
                    "ResourceName": "AWSControlTowerExecution"
                }
            ],
            "CloudTrailEvent": "{\"eventVersion\":\"1.11\",\"userIdentity\":{\"type\":\"AssumedRole\",\"principalId\":\"AROAYEKP5GN6RENKRYNQ7:terminate-product-delete-roles-oQRIU\",\"arn\":\"arn:aws:sts::5590XXXXXXX:assumed-role/AWSControlTowerExecution/terminate-product-delete-roles-oQRIU\",\"accountId\":\"5590XXXXXXX\",\"accessKeyId\":\"ASIAYEKXXXXXXXXXX\",\"sessionContext\":{\"sessionIssuer\":{\"type\":\"Role\",\"principalId\":\"AROAYEKP5GN6RENKRYNQ7\",\"arn\":\"arn:aws:iam::5590XXXXXXX:role/AWSControlTowerExecution\",\"accountId\":\"5590XXXXXXX\",\"userName\":\"AWSControlTowerExecution\"},\"attributes\":{\"creationDate\":\"2026-01-20T03:14:35Z\",\"mfaAuthenticated\":\"false\"}},\"invokedBy\":\"controltower.amazonaws.com\"},\"eventTime\":\"2026-01-20T03:14:36Z\",\"eventSource\":\"iam.amazonaws.com\",\"eventName\":\"DeleteRole\",\"awsRegion\":\"us-east-1\",\"sourceIPAddress\":\"controltower.amazonaws.com\",\"userAgent\":\"controltower.amazonaws.com\",\"requestParameters\":{\"roleName\":\"AWSControlTowerExecution\"},\"responseElements\":null,\"requestID\":\"6d9e8493-d60f-4655-ba8e-5db67b4f1b0a\",\"eventID\":\"512448eb-7be8-4369-9bb5-ad6d466d4c95\",\"readOnly\":false,\"eventType\":\"AwsApiCall\",\"managementEvent\":true,\"recipientAccountId\":\"5590XXXXXXX\",\"eventCategory\":\"Management\"}"
        },
        {
            "EventId": "a51c7afb-c8ba-4394-84a8-ea1373e83ecb",
            "EventName": "DeleteRolePolicy",
            "ReadOnly": "false",
            "AccessKeyId": "ASIAYEKXXXXXXXXXX",
            "EventTime": "2026-01-20T03:14:36+00:00",
            "EventSource": "iam.amazonaws.com",
            "Username": "terminate-product-delete-roles-oQRIU",
            "Resources": [
                {
                    "ResourceType": "AWS::IAM::Policy",
                    "ResourceName": "AdministratorAccess"
                },
                {
                    "ResourceType": "AWS::IAM::Role",
                    "ResourceName": "AWSControlTowerExecution"
                }
            ],
            "CloudTrailEvent": "{\"eventVersion\":\"1.11\",\"userIdentity\":{\"type\":\"AssumedRole\",\"principalId\":\"AROAYEKP5GN6RENKRYNQ7:terminate-product-delete-roles-oQRIU\",\"arn\":\"arn:aws:sts::5590XXXXXXX:assumed-role/AWSControlTowerExecution/terminate-product-delete-roles-oQRIU\",\"accountId\":\"5590XXXXXXX\",\"accessKeyId\":\"ASIAYEKXXXXXXXXXX\",\"sessionContext\":{\"sessionIssuer\":{\"type\":\"Role\",\"principalId\":\"AROAYEKP5GN6RENKRYNQ7\",\"arn\":\"arn:aws:iam::5590XXXXXXX:role/AWSControlTowerExecution\",\"accountId\":\"5590XXXXXXX\",\"userName\":\"AWSControlTowerExecution\"},\"attributes\":{\"creationDate\":\"2026-01-20T03:14:35Z\",\"mfaAuthenticated\":\"false\"}},\"invokedBy\":\"controltower.amazonaws.com\"},\"eventTime\":\"2026-01-20T03:14:36Z\",\"eventSource\":\"iam.amazonaws.com\",\"eventName\":\"DeleteRolePolicy\",\"awsRegion\":\"us-east-1\",\"sourceIPAddress\":\"controltower.amazonaws.com\",\"userAgent\":\"controltower.amazonaws.com\",\"errorCode\":\"NoSuchEntityException\",\"errorMessage\":\"The role policy with name AdministratorAccess cannot be found.\",\"requestParameters\":{\"roleName\":\"AWSControlTowerExecution\",\"policyName\":\"AdministratorAccess\"},\"responseElements\":null,\"requestID\":\"a828731d-51a0-4aea-92c7-c705dbe7cb5e\",\"eventID\":\"a51c7afb-c8ba-4394-84a8-ea1373e83ecb\",\"readOnly\":false,\"eventType\":\"AwsApiCall\",\"managementEvent\":true,\"recipientAccountId\":\"5590XXXXXXX\",\"eventCategory\":\"Management\"}"
        },
        {
            "EventId": "d7a0736a-abd8-47c4-a016-37e88d9530cf",
            "EventName": "DetachRolePolicy",
            "ReadOnly": "false",
            "AccessKeyId": "ASIAYEKXXXXXXXXXX",
            "EventTime": "2026-01-20T03:14:36+00:00",
            "EventSource": "iam.amazonaws.com",
            "Username": "terminate-product-delete-roles-oQRIU",
            "Resources": [
                {
                    "ResourceType": "AWS::IAM::Policy",
                    "ResourceName": "arn:aws:iam::aws:policy/AdministratorAccess"
                },
                {
                    "ResourceType": "AWS::IAM::Role",
                    "ResourceName": "AWSControlTowerExecution"
                }
            ],
以下略

最後に

冒頭に記載した通り、以上の結果からこれらのことがわかりました。

  • AWSControlTowerExecutionロールはControl Towerが直接APIを実行して削除する
  • 作成時に利用したCloudFormation StackSetsのスタックインスタンスは残る

ずっと気になっていたモヤモヤが晴れた気持ちになりました。

残ったスタックインスタンスの扱いについては別途ブログにしたいと思います。

この記事をシェアする

FacebookHatena blogX

関連記事