[アップデート] AWS Organizationsでメンバーアカウントを簡単に削除できるようになりました

CloseAccount APIを使うことでAWS Organizationsのメンバーアカウントを簡単に削除できるようになりました。
2022.03.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ついに簡単にメンバーアカウントを削除できるようになったぞ

こんにちは、のんピ(@non____97)です。

AWS Organizationsで作成したメンバーアカウントを簡単に削除したいなと思ったことありますか? 私はあります。

今までメンバーアカウントを削除するためには、スタンドアロンアカウントとして動作するように変更した上でOrganizationから離脱し、メンバーアカウントのルートユーザーからアカウントの解約をする必要がありました。

そのため、検証のために一時的に大量にアカウントを発行すると、検証完了後にアカウントを削除する際に、削除したいメンバーアカウント全てに請求情報の登録やルートユーザーのパスワードを設定することとなります。

経験したことがある人は分かると思いますが、このアカウントの削除作業は非常に手間がかかり、運用負荷も高いものです。

その手間が今回リリースされたCloseAccount APIを使うことで開放されることになりました。

これはスーパーアツいですね。今のところ2022年最もアツいアップデートです。

実際メンバーアカウントをCloseAccount APIを使って削除してみたので、紹介します。

2022/3/31追記 : What's NewやAWS公式ブログでもCloseAccount APIについての説明が公開されました。併せてご覧ください。

メンバーアカウントを削除してみた

それでは早速メンバーアカウントを削除してみます。

今回はマネージメントコンソールから削除します。

AWS Organizationsのコンソールから削除したいメンバーアカウントを選択します。そして閉じるボタンをクリックします。

削除したいメンバーアカウントを選択

閉じるボタンをクリックすると、アカウントを削除しても良いかの確認画面が表示されます。各確認項目にチェックを入れ、削除したいメンバーアカウントのIDを入力し、アカウントを閉じるをクリックします。

アカウントを閉じる

正常に削除要求が通ると、アカウント「アカウント名」(#アカウントID) の閉鎖要求に成功しました。と表示されます。この AWS アカウントは閉鎖を保留中です CloseAccount リクエストを受け取り、アカウントの閉鎖が進行中です。このアカウントは間もなく閉鎖されます。とも表示されていますね。

アカウントの閉鎖要求に成功しました

しばらく待ちブラウザをリロードすると、この AWS アカウントは停止されています AWS はアカウント内のすべてのリソースを削除し、アカウントは停止されてから 90 日後に回復不可能になります。と表示されました。ステータスも停止となっていますね。

メンバーアカウントの停止状態確認

続いて、CloudTrailを確認してメンバーアカウント削除時にどんなイベントが発行されたかも確認します。

確認してみると、CloseAccountCloseAccountResultという明らかにメンバーアカウントの削除と関係しているイベントが記録されていました。

各イベントの詳細は以下の通りです。

CloseAccount

{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "Root",
        "principalId": "<管理アカウントID>",
        "arn": "arn:aws:iam::<管理アカウントID>:root",
        "accountId": "<管理アカウントID>",
        "accessKeyId": "<アクセスキ-ID>",
        "sessionContext": {
            "sessionIssuer": {},
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2022-03-30T04:39:39Z",
                "mfaAuthenticated": "true"
            }
        }
    },
    "eventTime": "2022-03-30T04:42:01Z",
    "eventSource": "organizations.amazonaws.com",
    "eventName": "CloseAccount",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "<IPアドレス>",
    "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36",
    "requestParameters": {
        "accountId": "<削除するメンバーアカウントID>"
    },
    "responseElements": null,
    "requestID": "f1db5d25-d001-49b3-9360-7eb862602191",
    "eventID": "ca575405-26e8-43ce-8d3e-4cdcae9a0e8c",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "<管理アカウントID>",
    "eventCategory": "Management"
}

CloseAccountResult

{
    "eventVersion": "1.08",
    "userIdentity": {
        "accountId": "<管理アカウントID>",
        "invokedBy": "organizations.amazonaws.com"
    },
    "eventTime": "2022-03-30T04:44:46Z",
    "eventSource": "organizations.amazonaws.com",
    "eventName": "CloseAccountResult",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "organizations.amazonaws.com",
    "userAgent": "organizations.amazonaws.com",
    "requestParameters": null,
    "responseElements": null,
    "eventID": "28962928-e6c7-49cc-b306-790f5e228a2b",
    "readOnly": false,
    "eventType": "AwsServiceEvent",
    "managementEvent": true,
    "recipientAccountId": "<管理アカウントID>",
    "serviceEventDetails": {
        "closeAccountStatus": {
            "accountId": "<削除したメンバーアカウントID>",
            "state": "SUCCEEDED",
            "requestedTimestamp": "Mar 30, 2022 4:42:01 AM",
            "completedTimestamp": "Mar 30, 2022 4:42:01 AM"
        }
    },
    "eventCategory": "Management"
}

CloseAccountResultはその名の通り、アカウント削除後に発行されるイベントのようですね。

Check the CloudTrail log for the CloseAccountResult event that gets published after the account closes successfully. For information on using CloudTrail with AWS Organizations, see Logging and monitoring in AWS Organizations in the AWS Organizations User Guide.

CloseAccount - AWS Organizations

CloseAccountCloseAccountResulteventTimeを確認したところ、2分程度でメンバーアカウントの削除が完了したと判断できます。

注意事項

CloseAccountのAPI Referenceに記載の注意事項で特に気になったのは以下の2点です。

  1. SUSPENDED状態のメンバーアカウントを復旧させたい場合は、90日の猶予期間内にAWSサポートに連絡する必要があります。
    • CloseAccount APIでアカウントの削除リクエストを投げるとPENDING_CLOSURESUSPENDEDとステータスが変化します。
    • SUSPENDEDはアカウントの閉鎖リクエストが完了したことを示すステータスです。
  2. 30日の期間内に削除可能なメンバーアカウントの数は10%までです。

ステータスの確認はDescribeAccount APIで行えます。

実際にメンバーアカウントを削除した後、AWS CLIでdescribe-account実行した結果は以下になります。

$ aws organizations describe-account \
   --account-id <削除したメンバーアカウントID>
{
    "Account": {
        "Id": "<削除したメンバーアカウントID>",
        "Arn": "arn:aws:organizations::<管理アカウントID>:account/o-w2oscxtd7l/<削除したメンバーアカウントID>",
        "Email": "<削除したメンバーアカウントのメールアドレス>",
        "Name": "org-test",
        "Status": "SUSPENDED",
        "JoinedMethod": "CREATED",
        "JoinedTimestamp": "2020-03-02T00:34:32.376000+00:00"
    }
}

AWS Organizationsのメンバーアカウントの管理がより簡単に

CloseAccount APIを使ってAWS Organizationsのメンバーアカウントを簡単に削除してみました。

自分でAWS Organizationsを管理しており、大量のメンバーアカウントを発行して後片付けに困っている人は特に注目すべきアップデートです。

ただし、「間違えて違うメンバーアカウントを削除してしまった」みたいなことが発生しないように、メンバーアカウント削除時は慎重になりたいですね。

削除したくないアカウントについては以下のようにIAMポリシーでCloseAccount APIを拒否することで保護することもできます。

AccountType : Criticalタグが付与されているアカウントへのCloseAccount APIを拒否するIAMポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PreventCloseAccountForTaggedAccts",
            "Effect": "Deny",
            "Action": "organizations:CloseAccount",
            "Resource": "*",
            "Condition": {
                "StringEquals": {"aws:ResourceTag/AccountType": "Critical"}
            }
        }
    ]
}

ARNが指定されているアカウントへのCloseAccount APIを拒否するIAMポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PreventCloseAccount",
            "Effect": "Deny",
            "Action": "organizations:CloseAccount",
            "Resource": [
                "arn:aws:organizations::555555555555:account/o-12345abcdef/123456789012",
                "arn:aws:organizations::555555555555:account/o-12345abcdef/123456789014"
            ]
        }
    ]
}

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!