既存のAWS OrganizationsリソースをTerraformで管理してみた

既存のAWS OrganizationsリソースをTerraformで管理してみた

Clock Icon2024.07.03

既存のAWS OrganizationsをTerraformで管理したいことがありました。

このブログでは、以下のリソースをTerraformにimportしてみます。

前提

TerraformとProviderのバージョンは以下を使用しました。

  • Terraform: 1.9.0
  • AWS Provider: 5.56.1

今回は-generate-config-outオプションでHCLを自動生成しているため、Terraform Versionは1.5.0以上が必要です。

https://dev.classmethod.jp/articles/terraform-version-1-5/

やってみた

AWS Organizationsをimport

以下のファイルを用意します。

import.tf
import {
  id = "o-XXXXX" # 置き換える
  to = aws_organizations_organization.this
}

-generate-config-outでHCLを自動生成します。

terraform init
terraform plan -generate-config-out=organizations.tf

私の環境では以下のファイルが作成されました。

organizations.tf
resource "aws_organizations_organization" "this" {
  aws_service_access_principals = ["account.amazonaws.com", "backup.amazonaws.com", "cloudtrail.amazonaws.com", "config.amazonaws.com", "controltower.amazonaws.com", "guardduty.amazonaws.com", "member.org.stacksets.cloudformation.amazonaws.com", "sso.amazonaws.com"]
  enabled_policy_types          = ["BACKUP_POLICY", "SERVICE_CONTROL_POLICY", "TAG_POLICY"]
  feature_set                   = "ALL"
}

Applyして内容を取り込みます。

terraform apply

AWS Organizations OUをimport

続いてOUを同様の手順でimportします。

import.tf
import {
  to = aws_organizations_organizational_unit.sandbox
  id = "ou-XXXXXXX" # 置き換える
}
# 既存環境のOU分定義
terraform plan -generate-config-out=organizations_unit.tf

以下のファイルが生成されました。

organizations_unit.tf
resource "aws_organizations_organizational_unit" "sandbox" {
  name      = "SandboxOU"
  parent_id = "r-XXXXX"
  tags      = {}
  tags_all  = {}
}

Applyします。

terraform apply

AWSアカウントをimport

続いてAWSアカウントです。

import.tf
import {
  to = aws_organizations_account.sandbox1
  id = "123456789012"
}
# 既存環境のAWSアカウント分定義
terraform plan -generate-config-out=organizations_account.tf

以下のファイルが生成されました。

organizations_account.tf
resource "aws_organizations_account" "sandbox1" {
  close_on_deletion          = null
  create_govcloud            = null
  email                      = "xxxx@example.com"
  iam_user_access_to_billing = null
  name                       = "Sandbox 1"
  parent_id                  = "ou-XXXXXX"
  role_name                  = null
  tags                       = {}
  tags_all                   = {}
}

close_on_deletioncreate_govcloudなどnullが入っている引数は消してしまっても問題ありません。

私は以下のようにしました。tagstags_allはつけているアカウントもあるので、残していますが消しても問題有りません。

organizations_account.tf
resource "aws_organizations_account" "sandbox1" {
  email                      = "xxxx@example.com"
  name                       = "Sandbox 1"
  parent_id                  = "ou-XXXXXX"
  tags                       = {}
  tags_all                   = {}
}

Applyします。

terraform apply

TerraformでAWS Organizations関連のリソースを操作してみる

AWSアカウントを別のOUに移動してみます。

organizatins_account.tf
resource "aws_organizations_account" "sandbox1" {
  email                      = "xxxx@example.com"
  name                       = "Sandbox 1"
  # OU IDを変更
+  parent_id                  = "ou-YYYYY"
-  parent_id                  = "ou-XXXXXX"
  tags                       = {}
  tags_all                   = {}
}

Terraformで差分を確認すると、以下の通りparent_id変更後OUに変わりました。

terraform plan
# 変更箇所を抜粋
Terraform will perform the following actions:

  # aws_organizations_account.sandbox1 will be updated in-place
  ~ resource "aws_organizations_account" "sandbox1" {
      + close_on_deletion = false
      + create_govcloud   = false
        id                = "12345678901"
        name              = "Sandbox 1"
      ~ parent_id         = "ou-XXXXXX" -> "ou-YYYYYY"
        tags              = {}
        # (6 unchanged attributes hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.

applyして変更を適用します。

terraform apply

問題なくTerraformで操作できることを確認できました。

おわりに

AWS Organizations関連のリソースのimportをやってみました。

-generate-config-out便利ですね。import以外の部分はほぼ自動生成でできました。

AWS Organizations関連のリソースには、よく使われるものとしてはSCP(organizations_policy)が上げられる思います。

同様の手順で実行出来ますので、必要に応じて試してみてください。

以上、AWS事業本部の佐藤(@chari7311)でした。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.