Terraform の試験は、コマンド暗記よりも「状態管理」と「変更の安全性」を理解しているかを見ます。
実務での落とし穴(同時実行、バックエンド設定漏れ、モジュールの破壊的変更、誤った -target 依存切り離し)に直結する設問が多いです。
Associate では plan/apply/destroy の役割や、計画が何に基づくか(.tf の宣言、現在の tfstate、実インフラの差分)を正しく説明できることが問われます。Pro ではチーム運用前提の設問(レビュー、並行実行、CI 連携)が増えます。
典型的なひっかけは、plan が副作用を発生させると誤解するケースや、設定を変えずに -refresh-only で差分を確認できることを知らないケースです。
plan/apply とリモート状態・ロックの関係
Developer CLI Remote Backend (S3/Azure/GCS) Provider API
| | |
| terraform plan | |
|-------------------------->| 読み取り: tfstate |
| |-------------------------->|
| |<--------------------------|
|<--------------------------| 計画に必要な状態取得 |
| | |
| terraform apply | |
|-------------------------->| ロック取得 (DynamoDB等) |
| |=== LOCK === |
| |-------------------------->|
| |<--------------------------|
|<--------------------------| 変更反映後に状態書き込み |
| |--- UNLOCK --------------- |最小構成の例(出力で plan の差分を観察)
terraform {
required_version = ">= 1.0"
}
variable "project_name" {
type = string
default = "demo"
}
locals {
tag = "app-${var.project_name}"
}
output "tag_example" {
value = local.tag
sensitive = false
}
# var.project_name を変更して plan を比較し、apply 前に差分を理解する状態は単なるキャッシュではなく、Terraform が作成・管理するオブジェクトの真実の情報源です。手動編集は非推奨で、state サブコマンドで安全に操作します。
Associate では state list/show/mv/rm、import の基本。Pro ではドリフト調整、選択的移行、チーム運用での手順化が問われやすいです。
CLI 操作の実例
# 管理下のリソース一覧
terraform state list
# 単一リソースの詳細(ID・属性)
terraform state show aws_s3_bucket.logs
# モジュール化に伴うアドレス移行
terraform state mv aws_s3_bucket.logs module.storage.aws_s3_bucket.logs
# 既存 VPC の取り込み(ID は実リソースの識別子)
terraform import aws_vpc.main vpc-0abc1234def567890
# ドリフト確認のみ
terraform plan -refresh-onlyリモートバックエンドは単一の真実の状態とロックを提供し、チーム運用の前提になります。S3 を使う場合は DynamoDB によるロックを忘れがちです。ロックがないと並行 apply で破壊的な競合が起きます。
試験では「どのバックエンドがロックをサポートするか」「暗号化や権限モデルの違い」「設定で落としやすい罠」を選ばせる設問が定番です。
| バックエンド | ロック | 保存時暗号化 | 認証/権限モデル |
|---|---|---|---|
| S3 (+ DynamoDB) | DynamoDB でロック可 | SSE-S3/KMS | IAM ロール/ポリシー |
| azurerm (Blob) | ネイティブ ロック | Storage 既定の暗号化 | Azure AD + RBAC |
| gcs | 世代管理 + ロック | サーバーサイド暗号化 | サービスアカウント + IAM |
| local | なし | 任意 | ローカル権限 |
S3 バックエンド(DynamoDB ロック込み)
terraform {
backend "s3" {
bucket = "tfstate-prod"
key = "network/terraform.tfstate"
region = "ap-northeast-1"
dynamodb_table = "tfstate-lock"
encrypt = true
}
}
# 事前に S3 バケット(バージョニング有効) と DynamoDB テーブル(パーティションキー: LockID) を用意Associate ではモジュールの呼び出し・変数/出力の受け渡し、Pro ではバージョン固定、for_each/count、入力検証、汎用化しすぎない設計が問われます。
for_each はキー安定性が重要です。破壊を避けるため、実体にひもづく不変キー(例: 名前)を使います。
モジュール呼び出しと入力検証の例
module "vpc" {
source = "git::https://example.com/terraform-modules.git//vpc?ref=v1.4.2"
name = var.project
cidr = var.cidr
azs = var.azs
}
variable "project" {
type = string
validation {
condition = length(var.project) <= 12
error_message = "project は 12 文字以内にしてください。"
}
}
variable "cidr" {
type = string
}
output "vpc_id" {
value = module.vpc.id
sensitive = false
}ライフサイクル制御は破壊的変更の回避に有効ですが、乱用は複雑化を招きます。依存は暗黙的(参照)を優先し、必要時のみ depends_on を使います。
プロビジョナは最終手段です。構成管理はクラウドネイティブ手段(User Data、起動テンプレート等)や外部ツールで代替するのが推奨です。
ライフサイクルと依存の例
resource "aws_launch_template" "app" {
name_prefix = "app-"
image_id = var.ami
instance_type = var.instance_type
lifecycle {
create_before_destroy = true
prevent_destroy = false
}
}
resource "aws_autoscaling_group" "asg" {
name = "app-asg"
desired_capacity = 3
max_size = 5
min_size = 3
launch_template {
id = aws_launch_template.app.id
version = "$Latest"
}
depends_on = [aws_launch_template.app]
}
# プロビジョナの代わりに起動時ユーザーデータ等で初期化ワークスペースは同一構成の環境分離(state 分離)であり、完全なセキュリティ境界ではありません。環境ごとにバケットや権限を分ける設計が推奨です。
ポリシー(例: Terraform Cloud の Sentinel、または OPA など)で事前ガードを設定し、危険な変更をレビュー前にブロックします。
import は既存リソースを状態に関連付ける操作です。設定ファイルは自動生成されないため、対応するリソース定義を先に用意しておく必要があります。
ワークスペースと import の実例
# 環境用ワークスペース
terraform workspace new staging
terraform workspace select staging
# 既存リソースの取り込み
# 先に対応する resource ブロックを定義しておく
terraform import aws_iam_role.app_role app-role
# Sentinel/OPA は CI/Remote 実行で plan にフックして評価する運用が一般的Associate / Pro
問題 1
チームで S3 バックエンドを使っているが、まれに同時に terraform apply が実行され、状態ファイルが壊れかけた。最も適切な是正策はどれか。
正解: A
S3 バックエンドは単体ではロックを提供しないため、DynamoDB テーブルを併用してロックを有効化するのが正解。-lock-timeout は待ち時間の調整に過ぎず、ロック機構の代替ではない。ワークスペースは state を分けるが同一環境を並列に更新する問題は解決しない。tfstate を Git で管理するのは非推奨。
terraform plan と apply の主な違いは?
plan は提案のみで副作用なし。apply は計画を実行して実インフラを変更する。レビューやポリシーチェックは plan 結果を基に行う。
-target の使用はいつ適切?
障害対応など緊急の限定的変更に留めるのが原則。依存関係の一部を無視するため、恒常運用や通常の変更フローでは避ける。
機密値や認証情報の取り扱いは?
環境変数や Terraform Cloud の変数ストア、各クラウドのシークレット管理を利用し、tfvars や状態ファイルに平文を残さない。sensitive 出力で露出を最小化する。
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を用いた既存リソース参照の基本、選択基準、評価順序、...