Terraform

terraform applyの本質: 変更の適用と承認フローを安全に設計する

2026-04-19
NicheeLab編集部

terraform applyは最終的にインフラへ変更を適用するコマンドです。試験ではplanとの関係、承認の入れ方、ロックや並列度などの安全装置がよく問われます。

本稿は、CLI単体とTerraform Cloud/Enterpriseの両方で、変更の確認・承認・適用をどう設計するかを、手順と判断基準に落として解説します。

terraform applyの基本動作と試験で問われやすいポイント

terraform applyは計画と適用を実行します。対話モードでは差分プランを表示し、承認プロンプトにYesで続行します。-auto-approveを付けると承認なしで適用しますが、本番では推奨されません。

安全に承認を挟むには、terraform plan -outでバイナリの計画ファイルを作り、人手レビュー後にterraform apply planfileで適用します。計画ファイルは同一の作業ディレクトリと依存関係(プロバイダ版や変数)を前提とし、長距離・長期間の持ち運びには向きません。

デフォルトで状態はリフレッシュされます(-refresh=falseで抑制可能)。ロックは対応バックエンドで有効化され、-lockと-lock-timeoutで制御できます。並列度は-parallelismで設定します。

  • planの終了コード: 0(変更なし)、2(変更あり)、1(エラー)。applyは成功で0、失敗で非0。
  • terraform apply -refresh-onlyとplan -refresh-onlyでドリフト検知・状態更新のみを実行可能。
  • -input=falseで非対話実行(CI)。変数は-var、-var-file、環境変数や.tfvarsで注入。
  • terraform destroyは破壊専用コマンド。apply -destroyも同義だがdestroyの方が意図が明確。

CLIで実現する人手承認フロー(保存プラン駆動)

最小構成の承認フローは、保存プランをアーティファクトにして人手承認を挟む方法が堅実です。レビューはplanのテキスト出力、適用は保存プランで再現性を担保します。

ポイントは、レビュー対象(人が読むテキストのplan出力)と適用対象(機械が読むplanファイル)を分離すること、適用時に状態ロックを有効にすること、作業ツリーやプロバイダ版が一致していることをCIで検証することです。

  • 保存プランの生成: terraform plan -out=plan.tfplan -var-file=... -lock-timeout=... -input=false
  • レビュー: planテキスト出力をPRに貼る(terraform show -no-color plan.tfplan で整形可能)
  • 承認後の適用: terraform apply plan.tfplan(-lockと-lock-timeoutを併用)
  • ガード: mainブランチのみapply、タグ付けでリリース、-auto-approveは非使用

CLI保存プランを用いた承認フロー

Developercommitterraform plan-out tfplanPlan Review(human)terraform apply tfplanlockCloud ResourcesReject時は修正コミットへ戻る

Terraform Cloud/Enterpriseでの承認フロー設計

Terraform Cloud/Enterprise(TFC/E)はリモート実行と組織的な承認・ポリシーを提供します。VCS連携では、プルリク作成時にスペキュレイティブプラン(適用しない試算)を自動生成し、mainブランチへのマージで本番ワークスペースの計画が走ります。ワークスペース設定でApplyを手動承認にすれば、人のクリックが入るまで適用されません。

SentinelポリシーやRun Tasksでガードレールを実装できます。ハードマンダトリは違反時に実行停止、ソフトマンダトリは警告のうえ手動継続が可能です。コスト見積もり、監査ログ、機密値の保護も併せて利用できます。

  • スペキュレイティブプラン: PRでの安全な差分確認(適用なし)
  • 手動承認: ワークスペースでApplyに承認ステップを要求
  • ポリシー: Sentinel/OPA相当のRun Tasksで組織標準を強制
  • 状態・ロック: TFC/Eが一元管理し、競合を防止
項目CLI単体Terraform Cloud/EnterpriseGitOps CI/CD
承認ポイント人手レビュー後にapply実行者が判断ワークスペースの手動承認とポリシー判定PRレビュー+環境別ジョブ承認
アーティファクト保存プラン(tfplan)とplan出力Run内の計画結果・ポリシーレポートCIログと保存プラン(任意)
状態保存/ロックS3+DynaboDB等のバックエンドTFC/E内で管理・自動ロックバックエンドに依存(共通基盤推奨)
ポリシー/ガードスクリプトでlint/validateSentinel/Run Tasks/Cost Estimationポリシーステップ(OPA, tfsec等)
監査性CIログ+手作業の記録次第組織・ワークスペース単位の監査ログCIの監査ログ・署名付きリリース
機密情報env/var-fileの取り扱い次第Variablesに保護属性、Redact済み出力CIのシークレット管理に依存

競合と安全性: ロック、並列度、再実行の勘所

状態ロックは同時実行による破壊的な競合を防ぎます。S3バックエンドではDynamoDBテーブルを併用してロックを実現します。ConsulやTFC/Eはロックをネイティブ提供します。apply時は-lock=true(既定)で、競合時は-lock-timeoutで待機時間を延ばせます。

並列度は-parallelismで制御します。デフォルトは10前後(環境により既定値あり)。依存の少ない大量リソースを作るときは上げ、レートリミットの厳しいAPIでは下げます。

再実行時は冪等性を前提としつつ、プロバイダの差分判定や外部変更(ドリフト)を考慮します。ドリフトが疑わしいときはplan -refresh-onlyやapply -refresh-onlyでまず状態を実態に合わせるのが無難です。

  • S3バックエンドでのロック: DynamoDBテーブルにハッシュキーを設定し有効化
  • -lock-timeout=5m などで競合待機を調整
  • -parallelism=1 で順次実行(レート制限対策)
  • プロバイダ版は固定し、CIでterraform init -lockfile=readonlyを使い差分を検出

よくある落とし穴とトラブルシュート

保存プランの適用失敗: 計画生成後にプロバイダ版や設定、変数が変わると適用に失敗します。同じ作業ディレクトリ・同じ依存で短時間にhandoffする運用に限定しましょう。

-auto-approveの誤用: CIで誤って本番に即時反映しないよう、環境ごとにジョブを分離し、適用ステップには必ず手動承認を入れます。

-targetの乱用: 局所適用は依存グラフの一貫性を壊しがちです。緊急避難以外では使わず、根本原因を修正して全体計画を適用します。

  • CIではterraform fmt -check、terraform validate、terraform planの順で早期失敗
  • API制限エラーは-parallelism低下とリトライポリシーで緩和
  • 状態ロック解除が必要な時は慎重に。強制解除は最終手段

実務テンプレート(安全な適用スクリプト例)

最小限の安全装置を備えたスクリプト例です。保存プランを生成・保存し、レビュー可能なテキストを出力、承認後に同一プランを適用します。S3+DynamoDB等のバックエンドを前提にしています。

環境ごとに変数ファイルとバックエンド設定を分け、適用先はブランチやタグで明示します。

  • 非対話実行のため-input=falseを明示
  • 失敗時は即時終了、exit codeをCIに伝搬
  • 適用時は保存プランを必ず消費し、plan無しの直接applyを禁止

保存プラン駆動の承認・適用テンプレート(bash)

# 初期化(ロックファイルを尊重)
terraform init -lockfile=readonly || exit 1

# 変数と並列度、ロック待機を調整
ENV=prod
TFVARS=env/${ENV}.tfvars
PLAN_OUT=.artifacts/${ENV}.tfplan
mkdir -p .artifacts

# 計画を生成(保存プラン)
terraform plan \
  -var-file="${TFVARS}" \
  -out="${PLAN_OUT}" \
  -lock=true -lock-timeout=5m \
  -parallelism=5 \
  -input=false || exit 1

# レビュー用にテキスト化(PRに添付)
terraform show -no-color "${PLAN_OUT}" > .artifacts/${ENV}.plan.txt || exit 1

# --- ここで人手承認を実施(CIのManualジョブなど) ---

# 承認後に同一プランを適用
terraform apply -input=false -lock=true -lock-timeout=5m "${PLAN_OUT}" || exit 1

echo "Apply finished for ${ENV}"

問題で確認

Associate

問題 1

組織で本番適用前に人手承認を必須にしたい。CLIのみで最も安全な運用として適切なのはどれか。

  1. terraform plan -outで保存プランを作成し、プラン出力をレビュー後、同じ保存プランをterraform applyに渡して適用する
  2. terraform apply -auto-approveを使い、失敗時のみロールバックする
  3. terraform planのテキスト出力を保存して、適用時は再度terraform applyを対話モードで実行する
  4. terraform destroyで環境を一度削除し、再作成して差分をなくす

正解: A

保存プランを生成してレビューし、その同一プランを適用することで、計画と適用の不整合を防げます。-auto-approveは本番では避けるべきで、planテキストのみを保存してapplyをやり直すと計画が再計算されレビュー内容と乖離する恐れがあります。destroyは要件に反します。

よくある質問

保存プラン(tfplan)はどこまで再利用できますか?

同一の作業ディレクトリと依存関係(プロバイダ版、モジュール、変数入力)が一致している前提で短期間のハンドオフに使います。構成やバイナリが変わると適用に失敗し得るため、長期保管や別環境への流用は避けてください。

-auto-approveはいつ使っても良いですか?

検証用環境や一時的なサンドボックスでは有用ですが、本番では人手承認やポリシー判定を挟むべきです。Terraform Cloud/Enterpriseではワークスペースに手動承認を設定し、CLIでは保存プラン+Manualジョブで代替します。

Terraform Cloudの承認は誰ができますか?

ワークスペースのアクセス権(例: Write/Apply許可を持つチーム)に付与されたユーザーが実行・承認できます。組織設定でチームとロールを分離し、Plan権限とApply権限を分けるのがベストプラクティスです。

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

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の記事一覧 (102件)
© 2026 NicheeLab All rights reserved.