🏠

Terragruntでディレクトリ名を変更時state移動したい

に公開

概要

Terragruntとは、Terraformのラッパーツールで、インフラストラクチャコードのDRY(Don't Repeat Yourself)化を実現し、複数環境での管理を容易にするツールです。

TerraformとTerragruntの違い

Terraformでは、各環境やコンポーネントごとに個別のディレクトリを作成し、その中で.tfファイルを管理します。この場合、環境間で共通の設定を使い回すには、モジュールを作成するか、コードをコピーする必要があります。

一方、Terragruntでは:

  • 共通の設定を親ディレクトリで定義し、子ディレクトリで継承できる
  • ディレクトリ構造に基づいて環境やコンポーネントを管理できる
  • remote stateの設定を動的に生成できる

そのため、Terragruntではディレクトリ構造の変更が発生することがあります。
例えば:

Before:
└── environments/
└── prod/
└── services/
└── api/
After:
└── environments/
└── prod/
└── applications/
└── backend-api/

このような整理整頓の際にディレクトリ名を違う名前にしたいことがあります。
その際に既に作成したリソースをdestroyせずに移行する手順を残します。

前提条件

  • terragruntがインストールされていること
  • 移行元のディレクトリで正常にterragrunt実行できていること

手順

#1. 古いディレクトリを新しいディレクトリにコピー
old_dir=<old_dir>
new_dir=<new_dir>
cp -r $old_dir $new_dir

#2. 古いディレクトリのstateをファイルに出力
cd $old_dir
terragrunt state pull > ../$new_dir/terraform.tfstate

#3. 新しいディレクトリにstateをインポート
#  この時、古いディレクトリで参照している変数を新ディレクトリで参照できるように変更
cd ../$new_dir
terragrunt init
terragrunt state push -force terraform.tfstate

#4. 動作確認&後始末
terragrunt state list
rm terraform.tfstate

#5. 古いディレクトリのstateを削除
cd ../$old_dir
terragrunt state rm $(terragrunt state list)

#6.古いディレクトリを削除
cd ..
rm -rf $old_dir

追加情報

  1. シリアル番号エラー
Error: Cannot import state with serial X over newer state with serial Y

対処: -forceオプションを使用(手順に既に含まれています)

Discussion