AWS Control Tower に登録されたアカウントの OU 移動によるドリフト対策

# はじめに
この記事では、Control Tower で管理しているアカウントを誤って Organizations コンソールを使って別の組織単位（OU）に移動した際に発生するドリフトを解決する方法と、Organizations コンソールを使って別のOUに移動することを抑止する方法を検証しました。

# 結論（検証結果）
Organizations の `MoveAccount` アクションを Deny することで、Organizations コンソールでのアカウント移動を制限でき、Control Tower コンソールでのアカウント更新や OU 登録は問題なく完了することが確認できました。
この方法を使用すれば、OU 移動によるドリフトを未然に防ぐことができると考えられます。

# 前提知識
そもそも、Control Tower に登録しているアカウントを移動する際は、Organizations コンソールでは行ってはいけません。
Control Tower 管理下のアカウントを OU 間で移動する場合、Organizations コンソールではなく、Service Catalog か Control Tower コンソールから移動する必要があります。
ですが、誤って Organizations コンソールで操作してしまうことがあると思います。
もし Control Tower に登録されたアカウントを Organizations コンソールから直接別の OU に移動した場合、Control Tower はそのアカウントを「ドリフト状態」と見なし、コンソール上で「登録に失敗しました」と表示されることがあります。（ただし、Control Tower に未登録のアカウントを移動する場合はドリフトは発生しません。）

 ## ドリフトとは
Control Tower の設定が予期せず変更されたり、ズレたりすることで発生する設定の逸脱（ドリフト）を指します。
ドリフトが発生すると、ガバナンスやポリシーの適用に一貫性が失われ、セキュリティリスクやコンプライアンス違反が生じる可能性があります。

## OU移動でドリフトが発生する理由　
Control Tower では、アカウントを OU 間で移動すると、移動先の OU で適用されているコントロールが新たに適用されます。
しかし、Organizations コンソールを使って移動した場合、Control Tower の管理外で移動が行われるため、新しい OU のコントロールが自動的に適用されません。
これにより、コントロールの不整合が発生します。
そのため、新しい OU のコントロールを適用するために、手動で以下の「OU 移動によるドリフトの解決方法」を実行する必要があります。

 ## ドリフトのエラーメッセージ
移動したアカウントがドリフト状態にある場合、以下のようなエラーメッセージが表示されます。
```
アカウントの登録に失敗しました。
次の理由により、AWS Control Tower はアカウントを登録できませんでした: Your enrolled account was moved to another OU. The account is in an inconsistent state and you may incur unintended charges. If the parent OU is unregistered, register the new OU or return the account to its original OU. If the parent OU is registered, re-register the OU or update the account in AWS Service Catalog. If problems persist, you can terminate the account in AWS Service Catalog and create a new account with AWS Control Tower account factory, or contact AWS Support.
```

## OU移動によるドリフトの解決方法
OU移動によるドリフトが発生した場合、以下の方法で解消できます。

1. アカウントを元の組織単位（OU）に戻す
1. Control Tower コンソールから移動先 OU を再登録
    1. 手順：[AWS Control Tower への既存の組織単位の登録](https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/importing-existing.html)
        1. ただし、OU のアカウント数が 1,000 を超える場合、再登録では更新が実行できません。その場合、スクリプトによるアカウントの更新を行うことをおすすめします。
            1. 参考：[自動化によるアカウントのプロビジョニングと更新](https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/update-accounts-by-script.html)
1. Control Tower コンソールから該当アカウントを更新
    1. 手順：[AWS Control Tower または を使用して Account Factory アカウントを更新および移動する AWS Service Catalog](https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/updating-account-factory-accounts.html#update-account-in-console)
1. Service Catalog コンソールから移動したアカウントを新しい OU に更新

# 検証
このような誤操作を未然に防ぐために、誤って Organizations コンソール からアカウントを移動できないように、`MoveAccount` アクションを Deny し、Service Catalog か Control Tower コンソール を通じてのみ移動できるよう制限する方法を検証しました。

## MoveAccountアクションとは
Organizations コンソールからアカウント移動を行う際に必要となるアクションです。

## 検証で使用したポリシー
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*"
        },
        {
            "Effect": "Deny",
            "Action": "organizations:MoveAccount",
            "Resource": "*"
        }
    ]
}
```

# おわりに
アカウントの OU 移動によるドリフトを未然に防ぐ方法を検証しました。
Control Tower コンソールからアカウントを移動する場合も `MoveAccount` アクションが必要になると思っていましたが、検証の結果、実際には必要ないことがわかりました。

# 参考資料

- [AWS Control Tower でドリフトを検出および解決する](https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/drift.html)
- [AWS Organizations のアクション、リソース、および条件キー](https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_awsorganizations.html)
- [ガバナンスドリフトのタイプ](https://docs.aws.amazon.com/ja_jp/controltower/latest/userguide/governance-drift.html#drift-account-moved)