Terraform→OpenTofu移行実践ガイド: 既存IaCを止めずに移行するエンタープライズ手順
Terraformのライセンス変更以降、OpenTofuへ移行したいという相談は確実に増えています。とはいえ現場の本音は「理屈は分かるが、stateが壊れたら終わる」「本番を止めずに移行できるのか不安」です。
結論から言うと、移行は十分可能です。ただし「CLIを置き換えるだけ」で済むケースは限定的で、実際は providerバージョン整合・state lock・CI/CD・運用Runbook までまとめて整える必要があります。
本記事では、既にTerraformを本番運用しているチーム向けに、OpenTofuへ段階移行する実践手順をまとめます。
1. 移行方針を先に決める
最初に決めるべきは「一気に切り替えるか」「ワークスペース単位で段階移行するか」です。実務では次の方針が安全です。
- 低リスク環境(dev/sandbox)から先行
- 本番は最終フェーズで移行
- 旧TerraformとOpenTofuを一定期間並行運用
- ロールバック手順を文書化してから実施
この順序を守るだけで、移行事故の大半を避けられます。
2. 互換性の棚卸し(最重要)
まずは現状のIaC資産を棚卸しします。
- Terraformバージョン(例: 1.5.x / 1.6.x)
- 使用provider(AWS/Azure/GCP/Kubernetes等)
- backend(S3 + DynamoDB lock、Terraform Cloud、GCSなど)
- moduleの参照方式(registry / git / local)
- CI実行環境(GitHub Actions, GitLab CI, Jenkins)
2.1 依存を固定化してから移行する
.terraform.lock.hcl を必ずコミットし、providerを固定します。移行時にproviderまで同時更新すると、差分原因の切り分けが困難になります。
|
|
移行フェーズでは「ツール差分」と「provider差分」を分離してください。
3. ローカル検証の基本手順
OpenTofuを導入したら、既存プロジェクトで次を実行します。
|
|
plan が完全一致しない場合、いきなり適用してはいけません。主な原因は以下です。
- providerの暗黙更新
- data sourceの評価タイミング差
- 標準関数・型変換の微差
- module内部のversion制約
差分は「構文差分」より「実行時評価差分」で出ることが多い点に注意してください。
4. Stateを守る設計(壊したら復旧が重い)
IaC移行の本質的リスクはstateです。ここを守るために、以下を移行前チェックリストに組み込みます。
- state backendのバックアップ取得
- lock機構が有効か確認(DynamoDB等)
apply権限を移行担当者に限定- 並列実行ジョブを停止(同時apply禁止)
4.1 S3 backendの例
|
|
OpenTofuでもこのbackend構成は継続利用できます。重要なのは「誰がいつlockするか」を運用で統制することです。
5. CI/CDをOpenTofu対応に置換
CLI切替はローカルだけでは不十分です。実運用ではCIがapply主体です。
5.1 GitHub Actions移行例
|
|
ポイントは、tofu_version を固定し、突然のツール更新を防ぐことです。
5.2 Planの品質ゲート
tofu fmt -checktofu validatetflintcheckovやtfsecによるセキュリティ検査
この4点をPRゲート化すると、移行直後の品質低下を防げます。
6. 段階移行の実践フロー
本番で安全に移行するなら、次の順番が現実的です。
- dev workspaceをOpenTofuに切替
- 1週間運用し、差分・事故を記録
- stg workspaceを切替
- 本番はメンテウィンドウで切替
- 切替後48時間は変更凍結(緊急以外apply禁止)
移行で一番危険なのは「切替当日に通常の機能変更を混ぜる」ことです。必ず分離してください。
7. よくある障害と対策
7.1 plan 差分が毎回揺れる
原因:
- data sourceに非決定的値(timestamp等)が混在
- providerバージョン不統一
対策:
- 変動値をlocalsに隔離
- provider lockを全環境で統一
7.2 import済み資源が再作成扱いになる
原因:
- module path変更
- resource address変更(
count→for_each)
対策:
movedブロックを使い論理移動を明示- 必要時のみ
state mvを計画的に実施
7.3 lock解放漏れでapplyが詰まる
原因:
- CI異常終了
- 手動中断
対策:
- lock timeoutを定義
- 強制unlock手順をRunbook化
- Slack通知でlock継続を可視化
8. 運用Runbookに必ず入れる項目
- OpenTofuバージョン更新手順
- backend障害時の復旧手順
- lock競合時の対応フロー
- 監査ログ(誰がいつapplyしたか)
- ロールバック条件(差分件数・重大リスク判定)
「ツール移行成功」は、CLIが動くことではなく、運用が回ることです。
9. 具体的な移行チェックリスト
-
.terraform.lock.hclを全リポジトリで固定 - OpenTofu版CIテンプレート作成
- dev/stg/prodの順に移行計画作成
- stateバックアップの自動化
- lock競合監視の通知導入
- apply実行権限を限定
- 切替後の変更凍結ルールを明文化
まとめ
TerraformからOpenTofuへの移行は、単純なCLI置換ではなく IaC運用基盤の再整備 です。
- 差分原因を分離して検証する
- state保護を最優先に設計する
- CIとRunbookをセットで更新する
- 段階移行でリスクを局所化する
この4点を守れば、既存システムを止めずに移行できます。まずはdev環境で「同一plan再現性」を検証し、そこから本番へ広げるのが最短かつ安全です。
付録: 切替当日の実行チェック(時系列)
移行当日は、作業手順よりも「順番管理」が事故防止に効きます。以下は実務で使える時系列テンプレートです。
- T-30分: 変更凍結を全チームへ告知、未マージPRを棚卸し
- T-20分:
tofu versionと lockfile整合性確認、CI変数最終確認 - T-10分: backend到達確認、stateバックアップ取得
- T+0分: dev→stg→prodの順で
tofu plan実行(差分をレビュー) - T+15分: 許容差分のみ
tofu apply実行、結果を監査ログへ転記 - T+30分: 主要監視(APIエラー率、レイテンシ、コスト)を15分監視
さらに、切替時に最も有効なのは「中止判断ライン」を先に決めることです。例えば、plan差分件数が想定の2倍以上 や apply失敗が2連続 の場合は即時中断し、旧フローへ戻す、といった基準を明文化しておくと現場判断がぶれません。