AWS Ogranizations のアカウント、OU、ポリシーが CloudFormation で管理できるようになりました

2022.11.20

いわさです。

本日のアップデートで Organization リソースを CloudFormation で管理できるようになりました。
アカウントの作成すら CloudFormation で作成できるとは。

対象リソースは以下の 3 つです。メンバーアカウントと OU、各種ポリシーが対象です。

  • AWS::Organizations::Account
  • AWS::Organizations::OrganizationalUnit
  • AWS::Organizations::Policy

本日はこれらのアカウントの作成機能を使ってみました。
管理アカウント上でスタックを作成しています。

アカウント

プロパティとしてアカウント名とメールアドレスが必須です。
それ以外はオプションとなっています。ドキュメントでは複数アカウントを作成する際に DependsOn を使って同時作成時のエラーを回避するように記述がありましたが、私が試した際には問題ありませんでした。

Organizations クォーターの一度に作成できるアカウント数上限の 5 を上回る場合に必要なのかなと予想します。

AWS Organizations のクォータ - AWS Organizations

今回は以下のようなテンプレートを用意してスタックを作成します。

AWSTemplateFormatVersion: 2010-09-09
Description: ---
Resources: 
  Account1:
    Type: AWS::Organizations::Account
    Properties: 
      AccountName: CfnAccount1
      Email: hoge+cfn1@example.com
  Account2:
    Type: AWS::Organizations::Account
    Properties: 
      AccountName: CfnAccount1
      Email: hoge+cfn2@example.com
      ParentIds: 
        - ou-s4h9-91jckeg1
      RoleName: hoge-role-account1-rolename1
      Tags: 
        - Key: Hoge
          Value: Fuga

2 つ目のアカウントでは ParentIds を指定しています。
ここでぶら下がる OU を指定しています。省略した場合はルートとなるようです。

タグはまぁそのままですね。

連絡先情報はデフォルトあるいは上位から引き継がれ。スタックのプロパティから設定できない状態でした。
CloudFormation でこのあたりをメンテナンスする用途での利用はできなさそうですね。
先日管理 API リリースされていたのでそのあたりを利用すると良さそうです。API はあるのでカスタムリソースとして作成は出来そうですね。

ロールは管理アカウントからスイッチロールするためのものです。
省略時はマネジメントコンソールと同様に OrganizationAccountAccessRole で作成されます。
アカウント 2 は明示的に指定してみました。

早速スイッチロール試してみましょう。

期待どおりアクセスすることが出来ましたね。

DeletionPolicy で削除できる

CloudFormation スタックとして管理されるわけですが、スタックの削除はもちろん可能です。
メンバーアカウントリソースについては、DeletionPolicy がデフォルトでは Retail で作成されます。
そのためスタックを削除した際にはスキップされてメンバーアカウントは残ります。

DeletionPolicy に Delete を指定することが可能なので、その場合はメンバーアカウントを CloudFormation から削除することが出来ます。

AWSTemplateFormatVersion: 2010-09-09
Description: ---
Resources: 
  Account1:
    Type: AWS::Organizations::Account
    DeletionPolicy: Delete
    Properties: 
      AccountName: CfnAccount3
      Email: hoge+cfn3@example.com

削除したアカウントが「停止」となりましたね。
これは以下のメンバーアカウント削除機能と同じ動きのようです。90 日後に完全削除されそうですね。

組織単位 (OU)

続いて、OU も管理出来ます。
プロパティとしては OU の位置、ルートを含め親となる ParentId を指定する必要があります。

AWSTemplateFormatVersion: 2010-09-09
Description: ---
Resources: 
  OU1:
    Type: AWS::Organizations::OrganizationalUnit
    Properties: 
      Name: CfnOu1
      ParentId: r-s4h9
      Tags: 
        - Key: Key1
          Value: Value1
  OU2:
    Type: AWS::Organizations::OrganizationalUnit
    Properties: 
      Name: CfnOu2
      ParentId: ou-s4h9-91jckeg1
      Tags: 
        - Key: Key2
          Value: Value2
Outputs:
  OU1:
    Value: !Ref OU1
  OU2:
    Value: !Ref OU2

今回は上記のような形で指定しました。
この場合は以下のような階層構造で作成されます。

なお、作成後にいくつかのメンバーアカウントを手動で移動したのですが、この状態でスタックを削除するとどうなるでしょうか。
OU については DeletionPolicy が Retail で作成されないので削除しようとして、配下のアカウントが存在しているために以下のようにエラーとなりました。

配下のアカウントを移動して、何もない状態にして再度試してみましょう。

今度は OU を CloudFormation から削除することが出来ましたね。

ポリシー

最後にポリシーです。
このリソースでは Type プロパティで以下 4 つのいずれのポリシーなのかを指定します。

  • AI サービスのオプトアウトポリシー
  • バックアップポリシー
  • サービスコントロールポリシー
  • タグポリシー

以下のテンプレートではサービスコントロールポリシー (SCP) を作成するものです。

AWSTemplateFormatVersion: 2010-09-09
Description: ---
Resources: 
  Policy1:
    Type: AWS::Organizations::Policy
    Properties: 
      Name: CfnSCP1
      Content: |
        {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Deny",
              "Action": "ec2:RunInstances",
              "Resource": "arn:aws:ec2:*:*:instance/*",
              "Condition": {
                "StringNotLike": {
                  "ec2:InstanceType": "t*.*"
                }
              }
            }
          ]
        }
      TargetIds: 
        - ou-s4h9-91jckeg1
      Type: SERVICE_CONTROL_POLICY
      Tags: 
        - Key: HogeKey
          Value: HogeValue

ポリシーの内容としては以下を参考に T 系以外のインスタンスを起動出来ないようにするポリシーです。
こちらを指定した OU に設定してみました。

確認してみるとポリシーが作成されていますね。

ポリシーの詳細情報を確認してみるとコンテンツも期待どおり設定されていそうです、良いですね。

ポリシーが適用された OU 配下のアカウントにスイッチロールして T 系以外の EC2 インスタンスを作成してみます。

期待通りですね、権限不足のエラーとなりました。

さいごに

本日は AWS Ogranizations のアカウント、OU、ポリシーが CloudFormation で管理できるようになったので使ってみました。

Organizations についてもコードで管理できるようになりましたね。
特に OU とポリシーについてはデザインパターン的なものがありそうなので、テンプレート化して利用することも出来そうです。