この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
いわさです。
本日のアップデートで 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 とポリシーについてはデザインパターン的なものがありそうなので、テンプレート化して利用することも出来そうです。