Control Towerのメンバーアカウントを削除・解約する [2022年版]

先にService Catalogを削除することをお忘れなく
2022.08.19

どうも、ちゃだいん(@chazuke4649)です。

今回は、不要になったControl Tower管理下のメンバーアカウントを、Control Towerの管理解除をし、AWSアカウントの解約(削除・停止)を行います。

基本的には以下ブログの2022年版と思っていただければと思います。

変更点としては、CloseAccount APIの登場により、各メンバーアカウントにサインインすることなく、管理アカウントから各アカウントを閉鎖することができるようになりました。 CloseAccount APIについては以下ブログをどうぞ。

概要

前提

  • 解約対象アカウント: sandbox-aft-02: 111122223333
  • 所属するOU: Sandbox

手順

基本的には全てControl Towerの管理アカウントにて行います。

  • 1.Service Catalogのプロビジョニングされた製品を終了する
  • 2.CloseAccount APIにてアカウントを閉鎖する

いきなりアカウントを閉鎖する前に、アカウントファクトリーの実装であるService Catalogのプロビジョニングされた製品を終了し、Control Towerの管理から解除する点がポイントです。

参考情報

基本的には以下を公式ブログを参考にします。

関連する公式ドキュメントは以下です。

メンバーアカウントの管理を解除する - AWS Control Tower

Account Factory で作成されたアカウントを解約する - AWS Control Tower

1.Service Catalogのプロビジョニングされた製品を終了する

作業前は、Control Towerコンソールを開くと、下図の通りSandbox(OU)に、当該アカウントがいる状態です。

まずは、管理アカウントにて Service Catalogコンソールを開きます。

プロビジョニングされた製品を開き、アカウント名で検索すると該当のリソースが見つかりました。

こちらを選択し、アクションから「終了する」を選択します。

ちなみに念の為AWSアカウントIDやルートメールアドレスを調べるには、対象のプロビジョニングされた製品の詳細画面を開き、以下部分で確認できます。

「終了する」を選択すると最終確認されるので、「終了」と入力し、実行します。

実行後、プロビジョニングされた製品のステータスは「変更中」になりました。

処理が完了するとプロビジョニングされた製品の一覧から消えました。

Control Towerコンソールの組織画面を見ると、当該アカウントのステータスが「未登録」になり、Sandbox(OU)から外され、Root直下に移動されていることが確認できました。

2.CloseAccount APIにてアカウントを閉鎖する

CloseAccount APIはコンソールとAWS CLIとそれぞれ実行可能ですが、今回はコンソールから行います。(CLIの方法は、先述の公式ブログに紹介されています)

AWS Organizationsコンソールを開くと、sandbox-aft-02のアカウントがRoot直下に位置していることが確認できます。

これを選択し、「閉じる」を押します。

各チェック項目に同意し、アカウントIDを入力し、「アカウントを閉じる」を実行します。

アカウント閉鎖のリクエストが成功し、進行中という表示が確認できました。

まもなくアカウントは閉鎖し、Organizationsコンソールの一覧でも(停止)マークが付きました。

Control Towerコンソールの組織画面でも、ステータスが停止になりました。

作業としては以上です。

おまけ

もしService Catalogを削除し忘れて、アカウントを閉鎖したら?

プロビジョニングされた製品を最初に削除せず、AWS Control Towerのガバナンス下にあるアカウントを閉じると、そのアカウントは停止されますが、Service CatalogコンソールのAvailableの状態には、そのアカウント用のService Catalogプロビジョニング製品が残っています。このシナリオでは、組織単位の再登録は、エラーで失敗します。

' failed one or more pre-checks.' というエラーで失敗します。

これは、AWS Control TowerがアカウントでAWSControlTowerExecutionの役割を引き受けることができなくなったためです。さらに、このアカウントのService Catalogプロビジョニング製品を終了させることもできません。したがって、この停止されたアカウントへのアクセスを取得し、AWS Control Tower がアカウントで AWSControlTowerExecution ロールを引き受けることができることを確認し、アカウント用のサービスカタログプロビジョニング製品を終了し、次に組織単位を再登録する必要があるのです。

引用元)Managing AWS account lifecycle in AWS Control Tower using the Account Close API

下図のようにガードレールやランディングゾーンのバージョン更新時にOUの再登録を行うと、エラーになってしまいます。

90日以内で停止中のアカウントを復旧するには、サポートチケット起票が基本となります。

組織内のアカウントを一元的に閉鎖すると、ルート認証情報を使用して請求管理コンソールからアカウントを閉鎖するのと同じ効果があります。閉鎖されたアカウントの回復を 90 日間要求する機会があります。これを行うには、アカウントにログインし、カスタマー サポート チケットを介してアカウントの再開をリクエストしてください。90 日の期間が経過すると、アカウントは完全に削除され、元に戻すことはできなくなります。

AWS Organizations now provides a simple, scalable and more secure way to close your member accounts | AWS Cloud Operations & Migrations Blog

上記以外のワークアラウンド

Organizationsから停止したアカウントをControl Tower管理外のOUへ移動すれば、Control TowerによるOU再登録が停止アカウントによってエラーなることは回避できます。(公式的な方法ではないため、緊急ではない場合はサポートチケット起票をお勧めします)

残ってしまったプロビジョニングされた製品を削除するには?

実は、AWS CLIにて実行可能です。
ポイントは aws servicecatalog terminate-provisioned-product にて --ignore-errors をつける点です。

% aws servicecatalog terminate-provisioned-product --provisioned-product-id pp-wb3l3axstrroo --ignore-errors
{
    "RecordDetail": {
        "RecordId": "rec-nfsxvw5vr6bdq",
        "ProvisionedProductName": "ExampleAccount01",
        "Status": "CREATED",
        "CreatedTime": "2022-08-19T10:29:52.714000+09:00",
        "UpdatedTime": "2022-08-19T10:29:52.714000+09:00",
        "ProvisionedProductType": "CONTROL_TOWER_ACCOUNT",
        "RecordType": "TERMINATE_PROVISIONED_PRODUCT",
        "ProvisionedProductId": "pp-wb3l3axstrroo",
        "ProductId": "prod-uz6ds4fbwjw7a",
        "ProvisioningArtifactId": "pa-h3jhditjiwbpi",
        "PathId": "lpv2-ftxh5wu4ciiow",
        "RecordErrors": [],
        "RecordTags": []
    }
}

terminate-provisioned-product — AWS CLI 2.7.24 Command Reference