Terraform workspaceで個人ごとのAWSリソースを効率管理

Terraform workspaceを活用すれば、10名規模のチームでも定義ファイルを分けずに個人ごとのAWSリソースを効率的に管理できます。実践的な設定例とともに解説します。

#aws #terraform #infrastructure

はじめに

Terraformのworkspace機能を使うと、同じ定義ファイルで複数の独立した環境を管理できます。

個人ごとに定義ファイルを分ける運用は、1〜2名なら問題ありませんが、10名規模になると管理が煩雑になります。workspaceを使えば、この問題を解決できます。

workspace機能とは

workspaceは、同じTerraform定義で異なる状態ファイル(tfstate)を管理する機能です。各workspaceは独立したリソースセットを持つため、個人開発環境の分離に最適です。

詳細は公式ドキュメントを参照してください。

環境構築

前提条件

AWS CLIの設定

aws configure --profile <profile名>

# 以下を入力
# AWS Access Key ID: アクセスキー ID
# AWS Secret Access Key: シークレットアクセスキー
# Default region name: ap-northeast-1
# Default output format: json

workspaceの作成

新しいworkspaceを作成します。

terraform workspace new test

# 出力例
# Created and switched to workspace "test"!

# workspace一覧を確認
terraform workspace list
#   default
# * test

詳細コマンドは公式ドキュメントを参照してください。

Terraform定義の作成

プロバイダー設定

作業ディレクトリを作成し、AWSプロバイダーを設定します。

mkdir terraform && cd terraform
touch main.tf
# main.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}

provider "aws" {
  region  = "ap-northeast-1"
  profile = "default"
}

リソース定義

VPCと個人ごとのALB target groupを作成します。

touch vpc.tf alb.tf
# vpc.tf
resource "aws_vpc" "test" {
  cidr_block = "10.0.0.0/16"

  tags = {
    Name = "test"
  }
}
# alb.tf
variable "personal_name_prefix" {
  type        = string
  description = <<-EOF
    個人環境ごとのPrefixを指定してください。
    指定方法:[firstname]-[lastname]
    注意:ALBの名前は32文字以内
  EOF
}

resource "aws_alb_target_group" "test" {
  name     = var.personal_name_prefix
  port     = 80
  protocol = "HTTP"
  vpc_id   = aws_vpc.test.id
}

実行

実行計画の確認

terraform plan -var personal_name_prefix=test

# 出力例
# Terraform will perform the following actions:
#   # aws_alb_target_group.test will be created
#   # aws_vpc.test will be created
# Plan: 2 to add, 0 to change, 0 to destroy.

リソースの作成

terraform apply -var personal_name_prefix=test

# 確認後、yesを入力
# Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

結果確認

各workspaceの状態ファイルは terraform.tfstate.d ディレクトリに分離されます。

terraform workspace list
#   default
# * test

ls terraform.tfstate.d/
# test

リソースの削除

terraform destroy -var personal_name_prefix=test

# Destroy complete! Resources: 1 destroyed.

まとめ

Terraform workspaceを使うことで、以下のメリットがあります:

  • 定義ファイルの重複を防ぎ、メンテナンスコストを削減
  • 個人ごとの環境を独立して管理
  • チームスケールに応じた柔軟な運用

EC2やRDSなど、他のリソースにも同様のパターンを適用できます。