Contorol Towerの管理からメンバーアカウントを外す時、AWSControlTowerExecutionを作成したスタックインスタンスは削除されない
皆さんは、Control Towerの管理配下にあるメンバーアカウントのに対して管理を解除した時に、CloudFormation StackSetsで作成されたAWSControlTowerExecutionロールがどうやって削除されるか気になったことはありますか?私はあります。
何を言っているのか?
Control Towerに管理されたAWSアカウントには必ず、AWSControlTowerExecution という名前のIAMロールが存在している必要があります。
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)
- SandboxOU
- MembersControlTowerOU

この記事で使うAWSアカウント(5590xxxxx)は以下のブログ手順に従って、Control Tower環境への登録を行いました。
管理アカウントのCloudFormation StackSetsを確認すると、対象のアカウントに対してAWSControlTowerExecutionRoleというStackSetsがデプロイされています。

Control Towerの管理を解除
続いてこのアカウントをControl Towerの管理から外します。
該当のアカウントを選択し「管理を解除」をクリックします。

数分経つと、 AWS Control Tower baseline status および AWS Config ベースラインのステータス が「有効になっていません」となり、Control Towerの管理から外れたことがわかります。

アカウントの詳細からも、Control Towerの管理から外れたことが確認できます。

StackSetsを確認
続いて管理アカウントから、CloudFormation StackSetsを確認します。
Control Towerの管理から外れたアカウント(5590xxxxx)のスタックインスタンスが残っています。

オペレーションを確認しても、DELETEは実行されてません。

アカウント側からAWSControlTowerExecutionの存在を確認
Control Towerの管理から外れたアカウント(5590xxxxx)へログインし、CloudFormation スタックを確認します。
StackSet-AWSControlTowerExecutionRole-{ハッシュ値} のスタックを確認すると、ステータスは CREATE_COMPLETE のままです。AWSControlTowerExecution という名前のIAMロールがこのスタックによって作成されていますが、スタックからの削除操作は実施されていないようです。

物理IDのリンクを開くと、AWSControlTowerExecutionは存在しないとこがわかります。

ドリフト検出の結果を見ると、ステータスが「DELETED」になっていました。

ここまでで、 AWSControlTowerExecutionは削除されているが、CloudFormation StackSetsから削除されているわけではない ことがわかりました。
最後にCloudTrailの証跡から確認してみます。
AWSControlTowerExecutionのIAMロールに対して、以下の順番でイベントが実行されてました。
- DetachRolePolicy
- DeleteRolePolicy
- 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のスタックインスタンスは残る
ずっと気になっていたモヤモヤが晴れた気持ちになりました。
残ったスタックインスタンスの扱いについては別途ブログにしたいと思います。







