OrganizationsをTerraformで作ってみた

2020.10.23

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"
}

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 = []
          },
      ]

ou1が作成されました。

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で作成してみました。他のリソースと同じようにアカウントがサクッと作れてしまうのは面白いですね。これからもっと深堀りしていきたいと思います。

参考情報