CloseAccount API で AWS アカウントを削除する

## はじめに
ついに AWS Organizations で CloseAccount API が利用できるようになりました！🎉🎉🎉

https://docs.aws.amazon.com/organizations/latest/APIReference/API_CloseAccount.html

AWS Organizations を使用してマルチアカウント管理を行っていると、サンドボックスや一時的な開発用途などでもアカウントを発行できます。その一方でアカウント閉鎖はアカウント毎にルートユーザーでサインインし、手動で行う必要があったため、管理者にとっては運用負荷が高い作業でした。

CloseAccount API により、AWS Organizations でアカウント削除運用の自動化を実現できます。
また AWS Organizations コンソールからもアカウントをクローズできるようになっています。

## API からクローズ
Request Syntax はめちゃくちゃシンプルですね！迷いようがありません。

```json

{
   "AccountId": "string"
}
```

今回は AWS CLI で試してみます。本記事作成時点では AWS CLI v2 ではまだ対応していなかったたため、AWS CLI の `v1.22.84` で検証しましたが、`v2.5.1` 以降のバージョンで CloseAccount API をサポートしています。また boto3 をはじめとして各言語の SDK でも順次対応されています。

```
$ aws --version
aws-cli/1.22.84 Python/3.7.10 Linux/4.14.262-200.489.amzn2.x86_64 exec-env/CloudShell botocore/1.24.29
```

アカウント ID の箇所は適宜読み替えてください。コマンドが正常に実行された場合は特にアウトプットはなくプロンプトが戻ります。

```
$ aws organizations close-account --account-id 123456789012 --region us-east-1
```

CloseAccount は非同期リクエストです。クローズリクエストが正常に完了したかどうかは、DescribeAccount API で確認します。リクエストの進行中、アカウントのステータスは `PENDING_CLOSURE` となり、完了すると `SUSPENDED` に遷移します。

```
$ aws organizations describe-account --account-id 123456789012 --region us-east-1
{
    "Account": {
        "Id": "123456789012",
        "Arn": "arn:aws:organizations::111111111111:account/o-xxxxxxxxxx/123456789012",
        "Email": "account+close-account-test@example.com",
        "Name": "close-account-test",
        "Status": "SUSPENDED",
        "JoinedMethod": "CREATED",
        "JoinedTimestamp": 1648605160.722
    }
}
```

また CloudTrail にも CloseAccountResult イベントが発行されます。EventBridge で拾って Slack 通知なども簡単にできそうです。

```json
{
    "eventVersion": "1.08",
    "userIdentity": {
        "accountId": "111111111111",
        "invokedBy": "organizations.amazonaws.com"
    },
    "eventTime": "2022-03-30T02:33:54Z",
    "eventSource": "organizations.amazonaws.com",
    "eventName": "CloseAccountResult",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "organizations.amazonaws.com",
    "userAgent": "organizations.amazonaws.com",
    "requestParameters": null,
    "responseElements": null,
    "eventID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "readOnly": false,
    "eventType": "AwsServiceEvent",
    "managementEvent": true,
    "recipientAccountId": "111111111111",
    "serviceEventDetails": {
        "closeAccountStatus": {
            "accountId": "123456789012",
            "state": "SUCCEEDED",
            "requestedTimestamp": "Mar 30, 2022 2:32:53 AM",
            "completedTimestamp": "Mar 30, 2022 2:32:53 AM"
        }
    },
    "eventCategory": "Management"
}
```

## マネージドコンソールからクローズ
AWS Organizations コンソールもアカウントのクローズに対応しています。対象のアカウントを選択し、閉じる/Close ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/e416b41e-ed94-b9bb-13ab-682e8295c7be.png)

確認事項に同意し、アカウント ID を入力すると、アカウントを閉じるボタンが有効化されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/3c461329-eb15-c91e-8c4d-7323504f9791.png)

リクエストが完了すると、アカウントが停止ステータスになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/0ae073cc-e24c-c2cc-d53d-c13535b280c6.png)

## 誤削除に注意
簡単にメンバーにメンバーアカウントを閉鎖できるようになった一方で、誤った操作でアカウントをクローズしてしまうリスクも高まるかと思います。AWS Organizations のユーザーガイドでは IAM ポリシーを使用して特定のアカウントを閉鎖から保護する方法が案内されています。

https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_accounts_close.html#orgs_account_close_policy

以下の例では AccountType タグが Critical が付与されているアカウントに対して CloseAccount リクエストが拒否されます。
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PreventCloseAccountForTaggedAccts",
            "Effect": "Deny",
            "Action": "organizations:CloseAccount",
            "Resource": "*",
            "Condition": {
                "StringEquals": {"aws:ResourceTag/AccountType": "Critical"}
            }
        }
    ]
}
```

## その他の留意点
* SUSPENDED ステータスから復元する API は提供されていません
    * 90日の猶予期間内に AWS サポートに連絡する必要があります
* 30 日の期間内に、アクティブなメンバーアカウントの 10％ を閉鎖できます
    * 例えば 100 アカウントを管理している場合、最初に API でアカウントを閉鎖してから 30日以内で 10 アカウントまでクローズできます
    * この制限を緩和することはできません

以上です。
参考になれば幸いです。