Terraform

Terraform 試験の問題例: 主要ドメインの問題形式(Associate / Pro)

2026-04-19
NicheeLab編集部

Terraform の試験は、コマンド暗記よりも「状態管理」と「変更の安全性」を理解しているかを見ます。

実務での落とし穴(同時実行、バックエンド設定漏れ、モジュールの破壊的変更、誤った -target 依存切り離し)に直結する設問が多いです。

Terraform ワークフローの基礎と問題パターン

Associate では plan/apply/destroy の役割や、計画が何に基づくか(.tf の宣言、現在の tfstate、実インフラの差分)を正しく説明できることが問われます。Pro ではチーム運用前提の設問(レビュー、並行実行、CI 連携)が増えます。

典型的なひっかけは、plan が副作用を発生させると誤解するケースや、設定を変えずに -refresh-only で差分を確認できることを知らないケースです。

  • terraform plan は提案のみ。副作用なし。
  • terraform apply は計画の実行。-auto-approve の乱用はリスク。
  • -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 前に差分を理解する

State と CLI コマンドの出題傾向

状態は単なるキャッシュではなく、Terraform が作成・管理するオブジェクトの真実の情報源です。手動編集は非推奨で、state サブコマンドで安全に操作します。

Associate では state list/show/mv/rm、import の基本。Pro ではドリフト調整、選択的移行、チーム運用での手順化が問われやすいです。

  • state list: 管理下のアドレス一覧を確認
  • state show: 単一リソースの属性を確認(機密値の扱いに注意)
  • state mv: アドレスの移動。モジュールリファクタ時に使用
  • state rm: 管理外化。実リソースは削除されない
  • import: 既存リソースを状態に取り込む。設定は生成しない点に注意

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

状態管理とバックエンド比較(Associate/Pro 共通)

リモートバックエンドは単一の真実の状態とロックを提供し、チーム運用の前提になります。S3 を使う場合は DynamoDB によるロックを忘れがちです。ロックがないと並行 apply で破壊的な競合が起きます。

試験では「どのバックエンドがロックをサポートするか」「暗号化や権限モデルの違い」「設定で落としやすい罠」を選ばせる設問が定番です。

  • local は単独利用向け。チーム運用では避ける
  • ロック有無、暗号化、認証方式、権限分離を比較して選択
  • S3 利用時はバージョニングと SSE、DynamoDB ロックをセットで設計
バックエンドロック保存時暗号化認証/権限モデル
S3 (+ DynamoDB)DynamoDB でロック可SSE-S3/KMSIAM ロール/ポリシー
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 バージョンを固定(ref または registry の version)
  • variable validation で入力の境界を明確化
  • output は消費側を意識し最小限の露出に抑える
  • 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、起動テンプレート等)や外部ツールで代替するのが推奨です。

  • prevent_destroy は重要リソースの誤削除を防ぐ
  • create_before_destroy は置換時のダウンタイムを低減
  • replace_triggered_by で入れ替え条件を明示
  • depends_on は循環依存に注意
  • プロビジョナは失敗時再実行やドリフトの温床になりやすい

ライフサイクルと依存の例

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]
}

# プロビジョナの代わりに起動時ユーザーデータ等で初期化

ワークスペース、ポリシー、Import の注意点

ワークスペースは同一構成の環境分離(state 分離)であり、完全なセキュリティ境界ではありません。環境ごとにバケットや権限を分ける設計が推奨です。

ポリシー(例: Terraform Cloud の Sentinel、または OPA など)で事前ガードを設定し、危険な変更をレビュー前にブロックします。

import は既存リソースを状態に関連付ける操作です。設定ファイルは自動生成されないため、対応するリソース定義を先に用意しておく必要があります。

  • ワークスペースは state の切替。変数やバックエンドの分離戦略が鍵
  • ポリシーチェックは plan 時の早期失敗を促す
  • import 後は plan で差分ゼロを確認。足りない属性は設定に追記

ワークスペースと 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 が実行され、状態ファイルが壊れかけた。最も適切な是正策はどれか。

  1. S3 に加えて DynamoDB テーブルを用意し、バックエンド設定でロックを有効化する
  2. terraform apply に -lock-timeout を長めに指定すれば十分である
  3. ワークスペースを複数作成して同じ環境を分割すれば競合は起きない
  4. 状態ファイルを Git にコミットしてマージ戦略で競合を解消する

正解: A

S3 バックエンドは単体ではロックを提供しないため、DynamoDB テーブルを併用してロックを有効化するのが正解。-lock-timeout は待ち時間の調整に過ぎず、ロック機構の代替ではない。ワークスペースは state を分けるが同一環境を並列に更新する問題は解決しない。tfstate を Git で管理するのは非推奨。

よくある質問

terraform plan と apply の主な違いは?

plan は提案のみで副作用なし。apply は計画を実行して実インフラを変更する。レビューやポリシーチェックは plan 結果を基に行う。

-target の使用はいつ適切?

障害対応など緊急の限定的変更に留めるのが原則。依存関係の一部を無視するため、恒常運用や通常の変更フローでは避ける。

機密値や認証情報の取り扱いは?

環境変数や Terraform Cloud の変数ストア、各クラウドのシークレット管理を利用し、tfvars や状態ファイルに平文を残さない。sensitive 出力で露出を最小化する。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Terraform

Terraform HCL 構文の基礎:Block / Attribute / Expression を正しく使い分ける

Terraform Associate で頻出の HCL 構文を、ブロック・属性・式の3視点で整理。実務で迷いがちな書き...

Terraform

Terraform Authoring & Ops Pro: 上位資格の範囲と対策

上位レベルを想定したTerraformの設計・運用ドメインを整理し、実務で通用する対策を提示。モジュール設計、ステート運...

Terraform

Terraform Providers の基本: プラグイン型アーキテクチャを正しく使いこなす

Associate レベルで押さえるべき Provider の基礎、インストール、バージョニング、認証、エイリアス運用を...

Terraform

Terraform Resourceブロック徹底ガイド: 最小単位のリソース定義

Associateレベルで押さえるべきResourceブロックの構造、依存関係、メタ引数、ライフサイクル制御を実務目線で...

Terraform

Terraform Data Source徹底理解:既存リソースの参照で壊さず足す

Terraform Associate向けに、Data Sourceを用いた既存リソース参照の基本、選択基準、評価順序、...

Terraformの記事一覧 (101件)
© 2026 NicheeLab All rights reserved.