OrganizationsをTerraformで作ってみた
TerraformでAWS Organizationsを作成してみました。以下のような構成です。
- Master Accountは必須です。
- 「ou1」というOrganization Unit (OU)をRoot直下に作成します。
- OU1配下にアカウント一つと、別のOU「ou1-1」を作成します。
- ou1-1配下にもアカウントを一つ作ります。
- ポリシーの作成、アタッチは割愛します。これがないとOUを作成した意味がありませんが…ポリシーについてはまたの機会に書きたいと思います。
環境
TerraformはマスターアカウントのAdministratorAccess権限のIAMユーザーで実行します。
$ terraform version Terraform v0.13.5 + provider registry.terraform.io/hashicorp/aws v3.11.0
1.Organizationを作る
まずは大元となるOrganizationを作成します。
resource aws_organizations_organization org { aws_service_access_principals = [ "cloudtrail.amazonaws.com", "config.amazonaws.com" ] feature_set = "ALL" }
- Resource: aws_organizations_organization
aws_service_access_principals
引数は、Organizationレベルで特定のサービスを利用したい場合に使います。例えばcloudtrail.amazonaws.com
をこの値に含めることで、組織レベルでCloudTrailを有効化することができます。feature_set
引数はALL
もしくはCONSOLIDATED_BILLING
の値を設定できます。デフォルトがALL
なので今回は明示的に指定する必要はありませんが、書いたほうがわかりやすいので書いておきます。CONSOLIDATED_BILLING
にすると一括請求機能のみが利用できます。 (参考 : AWS Organizations terminology and concepts - Available feature sets | AWS Organizations User Guide)
terraform apply
後、コンソールで確認します。作成されていました。
また、マスターアカウントのEメールアドレスに「AWS Organizations email verification request」という件名のメールが届きますので、文中の「Verify your email address」ボタンをクリックし、rootアカウントでAWSにログインします。
2.アカウントを作成する
次はメンバーアカウントを作成してみます。
resource aws_organizations_account account1 { name = "account1" email = "xxxxxx+account1@gmail.com" }
email
引数値は、AWSアカウントで使われていないメールアドレスにする必要があります。
Gmailのエイリアスが便利です。
作成できました。
またemail
に指定したメールアドレスに「Welcome to Amazon Web Service」とういう件名のメールが届きます。
3.Organization Unit (OU)を作成する
上記メンバーアカウントは現在Root直下に存在しています。OU”ou1”下に置きたいので、まずはそのOU”ou1”を作成します。
resource aws_organizations_organizational_unit ou1{ name = "ou1" parent_id = aws_organizations_organization.org.roots[0].id }
- Resource: aws_organizations_account
parent_id
引数値について。ここではrootのidが必要です。 aws_organizations_organization リソースにはid
という属性もあります。が、こちらはrootではなくOrganizationのidですので、ここで使うのは不適切です。上記のとおり、roots
属性の小属性id
を使います。さらに、roots
属性は以下のようにlist型になっているので、roots[0].id
と書く必要があります。(list型になっているのは、現状Organizationにはrootは一つだけしか存在できませんが、将来的に複数になることが考慮されているから?)roots = [ { arn = "arn:aws:organizations::0123456789012:root/o-xxxxxxxxxx/r-xxxx" id = "r-xxxx" name = "Root" policy_types = [] }, ]
4.OU配下にアカウントを移動させる
ou1に先程作ったアカウント"account1"を移動させます。
先程作成したaws_organizations_accountリソースにparent_id
引数を追加します。
resource aws_organizations_account account1 { name = "account1" email = "xxxxxx+account1@gmail.com" + parent_id = aws_organizations_organizational_unit.ou1.id }
Root配下からaccount1が消えました。 代わりにou1下にaccount1が確認できます。
5.OU配下にOUを作成する
ou1の下にさらにou1-1というOUを作成します。root配下に作成する場合とはparent_id
の書き方が異なりますね。
resource aws_organizations_organizational_unit ou1-1{ name = "ou1-1" parent_id = aws_organizations_organizational_unit.ou1.id }
6.上記OU内にアカウントを作成する
ou1-1の下に別の新アカウントを作成します。
resource aws_organizations_account account1-1 { name = "account1-1" email = "xxx+account1-1@gmail.com" parent_id = aws_organizations_organizational_unit.ou1-1.id }
作成できました。
先程account1を作成したときと同様に、email
に指定したメールアドレスに「Welcome to Amazon Web Service」とういう件名のメールが届きます。
まとめ
簡単な構成のOrganizationをTerraformで作成してみました。他のリソースと同じようにアカウントがサクッと作れてしまうのは面白いですね。これからもっと深堀りしていきたいと思います。