2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【アドベントカレンダーDay 3】個人開発でもAWS Organizationsを便利に使う最小構成

2
Last updated at Posted at 2025-12-02

個人の開発環境でも、複数の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で有効化しないでください。

これらのサービスの有効化は不可逆的な操作であり、自動化すると予期せぬ影響が生じる可能性があります。必ずルート(管理)アカウントのマネジメントコンソールから手動で有効化してください。

事前に手動で行う設定

  1. AWS Organizationsの有効化: ルートアカウントのコンソールから有効化
  2. 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に追記するだけです。

使い方

初回セットアップ

  1. AWS Organizationsをルートアカウントから手動で有効化
  2. AWS Identity Centerも同じくルートアカウントから手動で有効化
  3. terraform.tfvarsを編集してユーザー情報を設定
  4. terraform applyを実行

アカウントの追加

新しいアカウントを追加する際は、以下の手順で行います。

  1. AWSコンソールから手動でアカウントを作成(Terraformではなく手動で行う)
  2. terraform applyを再実行

これだけで、新しいアカウントにもadminグループのAdministratorAccessが自動的に割り当てられます。

なぜアカウント作成は手動なのか

アカウントの作成をTerraformで自動化しない理由は、アカウント作成が不可逆的な操作だからです。誤って作成したアカウントを削除するのは手間がかかりますし、削除できるまでに時間制限もあります。

一方で、権限の割り当ては何度でもやり直せます。このため、「アカウント作成は慎重に手動で、権限割り当ては自動で」という方針を取っています。

まとめ

本記事では、個人開発環境でAWS Organizationsを最小限に活用するTerraform構成を紹介しました。

  • Identity Centerによるシングルサインオン: 複数アカウントを1つの認証で管理
  • 自動権限割り当て: アカウント追加後のre-applyで自動的に権限付与
  • シンプルな構成: 5つのファイルで完結

企業向けの複雑な設定は必要なく、個人開発に必要な機能だけを最小限に実装しています。複数アカウントの管理に困っている方は、ぜひ試してみてください。

コードはGitHubで公開しています。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?