Terraformでは、実環境とTerraform状態ファイルのズレを解消する「現状同期」が重要です。従来はterraform refreshを使っていましたが、現在は-refresh-onlyフラグを使うワークフローが推奨されています。
本稿では、公式の推奨に沿って現状同期の正しい実行方法、ハマりどころ、試験(Associate / Pro)で問われやすい観点を実務目線で整理します。
Terraformはtfstateに「最後に把握した実リソースの状態」を保持します。人手変更や外部ツールにより実環境が変わると、状態ファイルとのズレ(ドリフト)が発生します。現状同期は、こうしたドリフトを実環境の事実で上書きして、状態ファイルを正す操作です。
従来のterraform refreshは、プロバイダ経由で実リソースを読み取り、状態ファイルだけを更新します。構成(.tf)は変更せず、インフラ自体も作成・更新・削除しません。現在は非推奨であり、後述の-refresh-onlyフラグを使うのが推奨です。
公式ドキュメントでは、従来のterraform refreshは非推奨扱いです。代替として、terraform plan -refresh-onlyとterraform apply -refresh-onlyが提供されています。これらは「状態のみを最新化する計画・適用」を明示でき、現在の推奨運用です。
バージョンにより細かな挙動メッセージや非推奨警告の出方は異なり得るため、実環境ではterraform versionやterraform -helpで手元のCLI仕様を常に確認してください。
代替コマンドの最小セット
terraform plan -refresh-only
terraform apply -refresh-only
# 一部リソースだけ同期したいとき(必要最小限に)
terraform plan -refresh-only -target=aws_instance.web
terraform apply -refresh-only -target=aws_instance.web
# 計画時にAPI読み取りを抑止(キャッシュ的に使う)。最終適用前には通常のplan/applyで検証を
terraform plan -refresh=falseTerraformの計画エンジンは、まずプロバイダ経由で実リソースの最新値を取得し、状態ファイルを前提に差分を計算します。-refresh-onlyを付けると、その差分は「状態ファイルの更新」に限定され、インフラに対する作成・変更・削除は提案されません。
図は、ユーザ操作からプロバイダ読み取り、状態の更新に至る経路を簡略化したものです。
現状同期(refresh-only)の高レベルフロー
User CLI
|
v
Terraform Core -----> State Backend (lock)
|
v
Provider(s) -----> Cloud/API (Read only)
|
v
Diff Engine (refresh-only: state updates only)
|
v
Update tfstate (no infra changes)計画を保存してから安全に適用(状態のみ更新)
terraform plan -refresh-only -out=refresh.plan
# 差分をレビュー
terraform show refresh.plan
# 状態のみ更新を適用
terraform apply refresh.plan監査・棚卸しや、手動変更の有無を把握したい場合は、まずterraform plan -refresh-onlyで可視化します。問題なければterraform apply -refresh-onlyでtfstateを最新化します。これはCIでの定期ドリフト検知や、障害対応後の事後同期にも有用です。
注意点として、実体が消えているリソースはrefresh-only適用でstateから削除されます。復旧の見込みがある、または意図せず消えた場合は、すぐにapply -refresh-onlyを行わず、原因究明やterraform importによる再取り込みを検討してください。
削除済みリソースをstateから外したくない場合の選択肢
# すぐに適用しない。まず差分だけ確認
terraform plan -refresh-only
# 誤削除の可能性があるなら、復旧後にimportでstateに再取り込み
terraform import aws_instance.web i-0123456789abcdef0似た名称でも目的と副作用が異なります。試験・実務の双方で混同しやすい点を整理します。
| コマンド | 主目的 | インフラ変更 | state更新 |
|---|---|---|---|
| terraform refresh(非推奨) | 状態のみ最新化 | なし | あり(実体が無ければstateから除外) |
| terraform plan -refresh-only | 状態のみの差分表示 | なし | なし(表示のみ) |
| terraform apply -refresh-only | 状態のみ最新化を適用 | なし | あり(差分をstateに反映) |
| terraform plan(既定) | 変更計画の作成 | なし(計画のみ) | 読み取りで内部的に最新値取得 |
| terraform plan -refresh=false | 計画を高速化/API呼び出し抑止 | なし(計画のみ) | 読み取りスキップ |
Associateでは、現状同期の意図と-refresh-onlyの意味合いを正しく選択できることが重要です。Proでは、ドリフトの扱い、-targetの限定使用、-refresh=falseの意図的な活用など、状況に応じたワークフロー設計が問われます。
覚えておくべきは、状態の最新化は通常plan/applyでも実施されるが、refresh-onlyは「状態更新に限定」する点です。インフラは決して変更されません。
Associate / Pro
問題 1
運用中の環境で手動変更が疑われます。インフラ自体は絶対に変更せず、Terraformの状態だけを最新化したい。推奨されるコマンドはどれですか?
正解: A
現在の推奨は-refresh-onlyフラグの利用です。apply -refresh-onlyは状態ファイルのみ更新し、インフラを変更しません。refreshは非推奨、planは表示のみで適用されません。importは既存リソースの取り込み用途であり、ID未指定では動作しません。
apply -refresh-onlyは本当にインフラを変更しませんか?
はい。プロバイダから実リソースの最新状態を読み取り、差分をtfstateにのみ反映します。作成・更新・削除などの書き込み操作は行いません。
既に実体が削除されたリソースはどうなりますか?
refresh系では「実在しない」と判定されたエントリはstateから除外されます。意図せぬ削除の可能性がある場合は、すぐにapply -refresh-onlyを行わず、原因調査や復旧、必要に応じてterraform importでの再取り込みを検討してください。
どのバージョンでも-refresh-onlyが使えますか?
現行のTerraform 1.x系では-refresh-onlyが推奨パスです。ただし、細かなメッセージや警告はバージョンにより異なることがあります。運用前にterraform versionとterraform -help、公式CLIドキュメントで手元の仕様を確認してください。
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を用いた既存リソース参照の基本、選択基準、評価順序、...