Terraform の「ワークスペース」は便利ですが、万能な隔離境界ではありません。環境分離はアカウント分離、ディレクトリ分離、ワークスペース分離を組み合わせて設計します。
本稿は公式ドキュメントに基づき、試験(Associate / Pro)で狙われる論点と、チーム運用で迷いがちな判断基準を実例で解説します。
Terraform CLI のワークスペースは「1 つの設定ディレクトリ内で状態ファイル(state)を名前で分割する仕組み」です。サポートするバックエンド(local、複数のリモートバックエンドなど)では、default 以外のワークスペースごとに別 state が保持されます。
Terraform Cloud/Enterprise(TFC/TFE)の「ワークスペース」は、状態・変数・実行(Run)・ポリシーを内包する一級のオブジェクトです。CLI のワークスペースと名前は同じでも、機能と運用単位が異なります(混同注意)。
重要ポイント:ワークスペースは「権限境界」にはなりません。強い隔離(本番保護、課金・IAM 分離)が必要な場合は、クラウドアカウント/プロジェクトや別バックエンドを用いた分離を優先します。
環境分離の全体像(権限境界と state 境界)
Org/Company
├─ Cloud Accounts/Projects (強い権限境界)
│ ├─ prod-account
│ │ └─ TF Backend (prod) ── Workspaces/TFC Workspace(s): [prod]
│ └─ nonprod-account
│ └─ TF Backend (nonprod) ── Workspaces/TFC Workspace(s): [dev, stg]
└─ Repo/Directory (論理構成の分離)
├─ envs/prod
├─ envs/stg
└─ envs/devCLI ワークスペースの基本操作
terraform workspace list
terraform workspace new dev
terraform workspace select dev
terraform workspace show現実装では複数の分離レイヤを組み合わせます。下表は代表パターンの比較です。試験でも「どの分離が要件に最適か」を問われます。
本番の誤操作リスクが許容できないなら、まずアカウント/プロジェクト分離と別バックエンドを検討し、ワークスペースは補助的に使うのが安全です。
| パターン | 隔離レベル/用途 | メリット | 注意点/リスク |
|---|---|---|---|
| アカウント/プロジェクト分離(AWS Account/GCP Project/Azure Subscription) | 最強の隔離。課金・IAM・API 制限も独立。本番保護に最適。 | blast radius 最小、コンプライアンス適合が容易 | 運用コスト増。クロスアカウントの連携設計が必要 |
| ディレクトリ/リポジトリ分離(env ごとに config) | 構成差が大きいときに有効。レビュー単位を分けやすい。 | 変更影響が読みやすい、CI も単純化 | 重複を module 化しないと保守が難しくなる |
| ワークスペース分離(CLI/TFC) | 同一構成の軽微な差分(dev/stg/prod など) | 状態は自動で分離、切替が容易 | 権限境界にはならない。誤選択リスクに注意 |
| 単一ワークスペース+変数切替のみ | 最小構成で検証用途 | 管理が最小限 | 環境分離には不適切。誤 apply の被害が大きい |
S3 バックエンド例(ワークスペース対応の状態ファイル配置)
terraform {
backend "s3" {
bucket = "example-tfstate"
key = "network/terraform.tfstate" # default ワークスペースはこの key を使用
region = "ap-northeast-1"
dynamodb_table = "tf-lock"
encrypt = true
}
}
# 例:多くのリモートバックエンドでは default 以外のワークスペースは
# env:/<workspace>/network/terraform.tfstate のように名前空間が分かれる実装がある(バックエンド実装依存)。命名は一貫性が最重要です。workspace 名は短く、英小文字で dev/stg/prod のように固定。リソース名やタグに terraform.workspace を利用して可観測性を上げます。
変数は tfvars を環境別に分け、CI で -var-file を選択。TFC では Workspace 変数・Variable Set を使い、機密値は VCS に置かない。
モジュールは「環境差」を入力変数に寄せ、条件分岐は最小化。差が大きくなったらディレクトリを分けて構成自体を変えるほうが安全です。
リソース命名と変数のベストプラクティス
locals {
common_tags = {
managed_by = "terraform"
env = terraform.workspace
}
}
resource "aws_s3_bucket" "logs" {
bucket = "app-logs-${terraform.workspace}"
tags = local.common_tags
}
# 例: CI で環境ごとの tfvars を選択
# dev:
# terraform workspace select dev
# terraform apply -var-file=env/dev.tfvars
# prod:
# terraform workspace select prod
# terraform apply -var-file=env/prod.tfvarsワークスペースは便利ですが、権限境界ではありません。同一アカウント・同一バックエンドで prod と dev を持つ場合、誤った workspace select による誤 apply リスクが残ります。CI では明示的な workspace 検証や保護ブランチを運用してください。
バックエンドやプロバイダ差分をワークスペースだけで吸収しようとすると複雑化します。リージョンやアカウントが異なる場合は provider の alias と明示的な変数で制御し、限界を超えたら構成を分けます。
state の移動は慎重に。workspaces 間の移動は単純な terraform state mv ではありません。pull/push を理解して計画的に行います。
workspaces 間で state を移す(例:検証のみ。必ずバックアップすること)
# 元: dev ワークスペース
terraform workspace select dev
terraform state pull > tfstate-dev.json
# 先: prod ワークスペース(同一構成であることを確認)
terraform workspace select prod
terraform state push tfstate-dev.json
# 注: state mv は同一 state 内のアドレス移動。workspaces 間の移動には pull/push を使う。TFC/TFE では「1 スタック × 1 環境 × 1 ワークスペース」を基本に、prod/stg/dev を個別のワークスペースへ割り当てます。Variable Set で共通値、Workspace 変数で環境固有値を管理し、RBAC とポリシーで保護します。
State ロックや並列制御はプラットフォームが担保します。Run Tasks やポリシーセット(Sentinel/OPA)で本番ガードレールを実装し、誤操作を抑止します。
Terraform Cloud backend の基本設定(名前でひも付け)
terraform {
cloud {
organization = "acme"
workspaces {
name = "app-prod" # 環境ごとに別 Workspace を作成
}
}
}
# もしくは CLI の workspace と組み合わせる場合は、TFC 上も同名の Workspace を用意し、
# CI で terraform workspace select を明示して実行する。Associate/Pro で頻出なのは「分離要件に対して適切なパターンを選べるか」「CLI と TFC のワークスペースの違い」「バックエンドとロックの扱い」です。以下を押さえれば得点に直結します。
コマンドや default ワークスペースの挙動(key の扱い)、state の扱い(lock、pull/push)、-var-file の運用は素直に問われます。
短縮チートシート
# 新規ワークスペース
terraform workspace new stg
# 切り替え
terraform workspace select stg
# 実行(変数ファイルを明示)
terraform plan -var-file=env/stg.tfvars
terraform apply -var-file=env/stg.tfvars
# 一覧/表示
terraform workspace list
terraform workspace showAssociate / Pro
問題 1
組織要件: 本番は厳格に隔離(別 IAM、課金も分離)、開発/ステージングはコスト最適化しつつ同一構成で管理したい。最も適切な戦略はどれか?
正解: A
強い隔離(IAM/課金)にはアカウント/プロジェクト分離と別バックエンドが有効。TFC の Workspace とポリシーで本番を保護。非本番はワークスペース分離で十分なケースが多い。B/C は本番保護が不十分、D は同一アカウント内で境界が弱い。
ワークスペースは本番保護の十分な境界になりますか?
いいえ。ワークスペースは state の論理分離であり、IAM/ネットワーク/課金の境界にはなりません。本番はアカウント/プロジェクトや別バックエンドで隔離し、RBAC/ポリシーで多層防御を行うのが推奨です。
バックエンドの key に ${terraform.workspace} を埋め込んでも良いですか?
推奨されません。backend ブロックは式の補間をサポートしません。多くのバックエンドでは default 以外のワークスペースに自動で名前空間(例: env:/<workspace>/...)が付与されます。ワークスペースごとに state が分かれる設計を前提にし、key 自体は固定で構いません。
ワークスペースを削除できません。どうすれば良いですか?
default は削除不可です。その他のワークスペースは、その state に管理対象が残っていると削除できません。対象ワークスペース外を選択した上で、不要リソースを terraform destroy または terraform state rm で除去し、空になってから terraform workspace delete を実行します。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Terraform HCL 構文の基礎:Block / Attribute / Expression を正しく使い分ける
Terraform Associate で頻出の HCL 構文を、ブロック・属性・式の3視点で整理。実務で迷いがちな書き...
Terraform Authoring & Ops Pro: 上位資格の範囲と対策
上位レベルを想定したTerraformの設計・運用ドメインを整理し、実務で通用する対策を提示。モジュール設計、ステート運...
Terraform Providers の基本: プラグイン型アーキテクチャを正しく使いこなす
Associate レベルで押さえるべき Provider の基礎、インストール、バージョニング、認証、エイリアス運用を...
Terraform Resourceブロック徹底ガイド: 最小単位のリソース定義
Associateレベルで押さえるべきResourceブロックの構造、依存関係、メタ引数、ライフサイクル制御を実務目線で...
Terraform Data Source徹底理解:既存リソースの参照で壊さず足す
Terraform Associate向けに、Data Sourceを用いた既存リソース参照の基本、選択基準、評価順序、...