Terraformの状態管理は、チーム運用では必ずRemote State前提になります。ローカル状態は衝突と秘匿性の両面で限界があり、バックエンド選定と運用設計が品質と速度を左右します。
本稿では公式ドキュメントの安定仕様に沿って、S3+DynamoDB、AzureRM、Terraform Cloudなどの代表バックエンドを比較し、確実なロックと暗号化、最小権限のアクセス制御、Workspaceの切り方、remote_state参照の注意点をまとめます。
Terraformは計画・適用の判断材料として状態ファイル(state)を使います。stateにはリソースIDや属性、依存関係、しばしば機密性の高い値も含まれます。ローカル保存では編集競合や漏えいリスクが高いため、チームでは信頼できるリモートストレージに集約し、ロックと監査可能性を確保します。
ポイントは3つです。1) 競合防止: 同時実行をロックで制御 2) セキュリティ: 保管時暗号化と最小権限IAM/RBAC 3) 可観測性: 監査ログ、バージョニング、復旧手段。Terraform自体はstateを平文で保持する前提で動作するため、暗号化やアクセス制御はバックエンドの責務です。
共同作業時のRemote Stateとロックの流れ(例:S3 + DynamoDB)
最小構成のS3バックエンド例(ロックはDynamoDBで実現)
terraform {
backend "s3" {
bucket = "my-tfstate-bucket"
key = "env/prod/app/terraform.tfstate"
region = "ap-northeast-1"
dynamodb_table = "tf-state-lock"
encrypt = true
}
}
# 実運用ではSSE-KMS、バージョニング、バケットポリシーでの制限を合わせて設定する選定基準は、ロックの確実性、暗号化とアクセス制御の容易さ、監査・バージョニング、運用コストです。クラウドネイティブなS3/AzureRMは導入が容易で、Terraform CloudのremoteはRBACやUI、チーム機能がまとまっています。
GCSは標準機能でのロックに制約があり(この前提は公式のサポート状況に依存)、強い整合・ロックが必須の大規模チームではS3+DynamoDBやAzureRM、Terraform Cloudを優先します。
| バックエンド | ロック | 暗号化/保護 | アクセス制御/監査 |
|---|---|---|---|
| S3 + DynamoDB | あり(DynamoDBロック) | SSE-S3/SSE-KMS、バージョニング可 | IAM + CloudTrail、Bucket Policy |
| AzureRM (Blob) | あり(Blobリース) | SSE/CMK、Soft Delete/Versioning | AAD RBAC + 診断ログ |
| Terraform Cloud (remote) | あり(サーバー側ロック) | サーバー側暗号化、VCS連携 | 組織RBAC、監査、ポリシー |
| GCS (Bucket) | 制約あり | サーバー側暗号化/CMEK | IAM + Cloud Audit Logs |
部分的バックエンド設定とinit時の注入(-backend-config)
terraform {
backend "s3" {}
}
# repoには値を固定せず、init時に注入して誤適用を防ぐ
# 例)環境ごとのCI/CDジョブで
# terraform init \
# -backend-config=bucket=my-tfstate-bucket \
# -backend-config=key=env/${ENV}/app/terraform.tfstate \
# -backend-config=region=ap-northeast-1 \
# -backend-config=dynamodb_table=tf-state-lock \
# -reconfigureRemote Stateは保管先のセキュリティに依存します。S3を例に、暗号化・最小権限・監査・復旧の4点を押さえます。Terraform自体はstateを暗号化しません。バックエンドの暗号化とアクセス制御が要です。
また、state肥大化を避けるため、不要なデータソースの格納や巨大なリソース属性の保持を抑え、出力(outputs)に機密を残さない方針を徹底します。
S3バケット側の代表設定(参考・一部)
# バケットは事前に作成しておき、ポリシーでTerraformのロールのみ許可
# 例のポリシーフラグメント(概念例)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-tfstate-bucket",
"arn:aws:s3:::my-tfstate-bucket/*"
],
"Condition": {"Bool": {"aws:SecureTransport": "false"}}
}
]
}
# KMSキーはTerraformロールにEncrypt/Decryptを付与し、外部主体を禁止
# バージョニングは有効化、パブリックアクセスは全面ブロック環境分離は「ディレクトリ分割」か「Workspace活用」で行えます。Associateの観点では、stateの衝突回避と権限分離を優先し、明確な命名とアクセス境界を揃えることが重要です。Workspaceは同一設定で環境だけ切り替える用途に適します。
バックエンドのkeyはWorkspace名を埋め込むと安全です。Terraform Cloudのremoteを使う場合は、組織/ワークスペース単位でRBACと実行キュー、ロックが管理されます。
Workspace名でstate keyを切替(S3)
terraform {
backend "s3" {
bucket = "my-tfstate-bucket"
key = "env/${terraform.workspace}/app/terraform.tfstate"
region = "ap-northeast-1"
dynamodb_table = "tf-state-lock"
encrypt = true
}
}
# 例
# terraform workspace new stage
# terraform workspace select stage
# terraform apply # => env/stage/app/terraform.tfstate に書き込みモジュール間で値を受け渡す場合、data "terraform_remote_state" を使うと、他スタックのoutputsを安全に参照できます。ただし、outputsに機密を出さないのが大原則です。state間の結合度が上がるため、キー命名や権限境界を明確にします。
バックエンドのcredは最小権限で、参照専用のロール(GetObjectのみ等)に分離します。Terraform Cloudのremote同士で参照する場合は、同組織内の適切なワークスペース参照機構とRBACを利用します。
別スタックのVPC IDを参照(S3 backend例)
data "terraform_remote_state" "network" {
backend = "s3"
config = {
bucket = "my-tfstate-bucket"
key = "env/prod/network/terraform.tfstate"
region = "ap-northeast-1"
dynamodb_table = "tf-state-lock"
encrypt = true
}
}
output "subnet_ids" {
value = data.terraform_remote_state.network.outputs.subnet_ids
}
# 注意: network側のoutputsに機密を置かない。参照用IAMはGetObject等の読み取り最小権限のみロックが残留する、バックエンドを変更したい、stateを復旧したい等の運用課題は必ず発生します。手順を定め、強制解除は最終手段に留めます。移行は計画停止時間内での検証とロールバック手段(バックアップ)の確保が重要です。
ドリフト検出はplan差分と監査ログを併用します。stateのサイズ肥大化やキー構成の複雑化は運用コスト増に直結するため、定期的なヘルスチェックをおすすめします。
代表的な運用コマンド
# ロックの強制解除(適用中断が無いことを確認した上で)
terraform force-unlock <LOCK_ID>
# stateのバックアップ
terraform state pull > backup-$(date +%F).tfstate
# バックエンド移行(例:S3 -> Terraform Cloud remote)
terraform init -migrate-state -reconfigure
# state内リソースのパス修正
terraform state mv aws_s3_bucket.old aws_s3_bucket.newAssociate
問題 1
チームでAWS上のインフラを管理しています。共同作業時の競合防止とセキュアな保管を最もシンプルに満たすRemote State構成はどれですか?
正解: A
チームの同時実行を防ぐ確実なロック(DynamoDB)と、保管時暗号化(SSE-KMS)、復旧容易性(バージョニング)を満たすのがA。Bは競合と秘匿性の両面で不適切。CやDはロック/暗号化が不足する。
Terraformはstateを自動で暗号化しますか?
いいえ。Terraform自体はstateを暗号化しません。暗号化はバックエンド(S3のSSE-KMS、AzureのCMK、Terraform Cloudのサーバー側暗号化など)で実現します。
Workspaceとディレクトリ分割、どちらを使うべきですか?
同一構成を環境だけ切り替えるならWorkspaceが有効です。権限やライフサイクルを強く分離したい場合はディレクトリ(またはリポジトリ)分割でstateを物理分離する方が運用しやすいです。
ロックが残ってapplyできません。どうすれば良いですか?
実行中のTerraformがないことを確認した上で、まずバックエンド側(DynamoDBのロックレコード等)を確認します。問題なければ terraform force-unlock を最後の手段として使います。強制解除は競合リスクがあるため、チームで合意の上で実施してください。
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を用いた既存リソース参照の基本、選択基準、評価順序、...