個人の開発環境でも、複数のAWSアカウントを管理したい場面があります。検証用アカウントと本番用アカウントを分けたり、新しいサービスを試すためのサンドボックスアカウントを作成したり。
そんなときに便利なのがAWS Organizationsですが、企業向けの機能が多く、個人で使うには設定が複雑に感じることがあります。本記事では、個人開発環境でOrganizationsの機能を最小限かつ便利に使えるTerraform構成を紹介します。
この構成でできること
この構成を使うと、以下のことが実現できます。
| 機能 | 説明 |
|---|---|
| Identity Centerによるシングルサインオン | 複数アカウントに1つの認証情報でログイン |
| adminグループの自動作成 | 管理者グループを作成し、AdministratorAccessを付与 |
| 新規アカウントへの自動権限付与 | アカウント追加時にre-applyするだけで権限が設定される |
| OU(Organizational Unit)の作成 | pocという名前のOUを作成(用途に応じてカスタマイズ可能) |
特に便利なのは、アカウントを追加した後にTerraformをre-applyするだけで、新しいアカウントにも自動的にadminグループのAdministratorAccessが割り当てられる点です。
前提条件
この構成を使用する前に、以下の準備が必要です。
AWS OrganizationsとIdentity Centerは、Terraformで有効化しないでください。
これらのサービスの有効化は不可逆的な操作であり、自動化すると予期せぬ影響が生じる可能性があります。必ずルート(管理)アカウントのマネジメントコンソールから手動で有効化してください。
事前に手動で行う設定
- AWS Organizationsの有効化: ルートアカウントのコンソールから有効化
- AWS Identity Centerの有効化: 同じくルートアカウントから有効化
これらの設定が完了していれば、あとはTerraformに任せることができます。
ファイル構成
account-settings/
├── main.tf # Identity Center関連のリソース
├── organizations.tf # Organizations関連のリソース
├── variables.tf # 変数定義
├── terraform.tfvars # 変数の値(環境ごとに変更)
└── providers.tf # プロバイダー設定
シンプルな構成です。それぞれのファイルを見ていきます。
各ファイルの解説
providers.tf
terraform {
required_version = ">=1.12.0, <2.0.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = ">=6.0.0, <7.0.0"
}
}
}
provider "aws" {
region = var.aws_region
}
Terraform 1.12以上、AWSプロバイダー6.x系を使用します。特別な設定はありません。
variables.tf
variable "aws_region" {
type = string
default = "ap-northeast-1"
}
variable "tags" {
type = map(string)
default = {}
}
variable "admin_users" {
type = map(
object({
given_name = string
family_name = string
display_name = string
email = string
})
)
}
admin_users変数で、Identity Centerに作成するユーザーを定義します。複数ユーザーを追加することも可能です。
terraform.tfvars
admin_users = {
"admin" = {
given_name = "<ギブンネーム>"
family_name = "<ファミリーネーム>"
display_name = "<表示名>"
email = "<メールアドレス>"
}
}
実際の値は環境に合わせて設定してください。ユーザー名(この例ではadmin)がIdentity Centerのユーザー名になります。
organizations.tf
data "aws_organizations_organization" "this" {}
resource "aws_organizations_organizational_unit" "poc" {
name = "poc"
parent_id = data.aws_organizations_organization.this.roots[0].id
}
既存のOrganizationsからデータを取得し、pocという名前のOUを作成します。検証用アカウントを整理するためのOUです。用途に応じて名前を変更してください。
main.tf
このファイルがメインの構成です。Identity Center関連のリソースを定義しています。
data "aws_ssoadmin_instances" "this" {}
resource "aws_identitystore_group" "admin" {
identity_store_id = tolist(data.aws_ssoadmin_instances.this.identity_store_ids)[0]
display_name = "admin"
}
まず、adminグループを作成します。
resource "aws_ssoadmin_permission_set" "admin" {
name = "admin"
instance_arn = tolist(data.aws_ssoadmin_instances.this.arns)[0]
session_duration = "PT8H"
tags = var.tags
}
resource "aws_ssoadmin_managed_policy_attachment" "admin" {
instance_arn = tolist(data.aws_ssoadmin_instances.this.arns)[0]
managed_policy_arn = "arn:aws:iam::aws:policy/AdministratorAccess"
permission_set_arn = aws_ssoadmin_permission_set.admin.arn
}
Permission Setを作成し、AdministratorAccessポリシーをアタッチします。セッション時間は8時間に設定しています。個人開発なら十分な長さです。
resource "aws_ssoadmin_account_assignment" "admin" {
count = length(data.aws_organizations_organization.this.accounts)
instance_arn = tolist(data.aws_ssoadmin_instances.this.arns)[0]
permission_set_arn = aws_ssoadmin_permission_set.admin.arn
principal_id = aws_identitystore_group.admin.group_id
principal_type = "GROUP"
target_id = data.aws_organizations_organization.this.accounts[count.index].id
target_type = "AWS_ACCOUNT"
}
ここがポイントです。countを使ってOrganizations内の全アカウントに対してadminグループの権限を割り当てています。新しいアカウントを追加してre-applyすると、自動的にそのアカウントにも権限が付与されます。
resource "aws_identitystore_user" "admin" {
for_each = var.admin_users
identity_store_id = tolist(data.aws_ssoadmin_instances.this.identity_store_ids)[0]
user_name = each.key
display_name = each.value.display_name
name {
given_name = each.value.given_name
family_name = each.value.family_name
}
emails {
value = each.value.email
}
}
resource "aws_identitystore_group_membership" "admin" {
for_each = aws_identitystore_user.admin
identity_store_id = tolist(data.aws_ssoadmin_instances.this.identity_store_ids)[0]
group_id = aws_identitystore_group.admin.group_id
member_id = each.value.user_id
}
最後に、admin_users変数で定義したユーザーを作成し、adminグループに追加します。for_eachを使っているので、ユーザーを追加したい場合はterraform.tfvarsに追記するだけです。
使い方
初回セットアップ
- AWS Organizationsをルートアカウントから手動で有効化
- AWS Identity Centerも同じくルートアカウントから手動で有効化
-
terraform.tfvarsを編集してユーザー情報を設定 -
terraform applyを実行
アカウントの追加
新しいアカウントを追加する際は、以下の手順で行います。
- AWSコンソールから手動でアカウントを作成(Terraformではなく手動で行う)
-
terraform applyを再実行
これだけで、新しいアカウントにもadminグループのAdministratorAccessが自動的に割り当てられます。
なぜアカウント作成は手動なのか
アカウントの作成をTerraformで自動化しない理由は、アカウント作成が不可逆的な操作だからです。誤って作成したアカウントを削除するのは手間がかかりますし、削除できるまでに時間制限もあります。
一方で、権限の割り当ては何度でもやり直せます。このため、「アカウント作成は慎重に手動で、権限割り当ては自動で」という方針を取っています。
まとめ
本記事では、個人開発環境でAWS Organizationsを最小限に活用するTerraform構成を紹介しました。
- Identity Centerによるシングルサインオン: 複数アカウントを1つの認証で管理
- 自動権限割り当て: アカウント追加後のre-applyで自動的に権限付与
- シンプルな構成: 5つのファイルで完結
企業向けの複雑な設定は必要なく、個人開発に必要な機能だけを最小限に実装しています。複数アカウントの管理に困っている方は、ぜひ試してみてください。
コードはGitHubで公開しています。