Terraformのtfstateを別のtfstateへ移行する手順
概要
リファクタ等で、既存のtfstateにあるリソースを別の新しいワークスペースにあるtfstateへ引っ越ししたい場合があります。
例えば、シングルrootモジュールだったコードから、module参照に切り替える場合などです。
その場合の引っ越し手順を記載します。
移行元のtfstateと移行先のtfstateをterraform state pullでダウンロードしてマージを行い、最終的に移行先にterraform state pushでアップロードする手順です。
なお、途中のterraform state mvを実施すると自動的にbackupファイルが作成されるので、万が一手順ミスをしても最初の状態に戻すことは可能です。
手順
なにかしらの作業ディレクトリを作って移動しておく
mkdir xxx
export WORKDIR=xxx
移行元ワークスペースでstate fileをダウンロード
terraform state pull > ${WORKDIR}/src.terraform.tfstate
移行元ワークスペースでリソース一覧を取得
terraform state list > ${WORKDIR}/src.resources.txt
移行先ワークスペースでstate fileをダウンロード
terraform state pull > ${WORKDIR}/dest.terraform.tfstate
配列がそのままだとzshでエラーになるのでエスケープする
cd ${WORKDIR}
sed -e 's/\[/\\[\\/g' -e 's/\"\]/\\"\\]/g' src.resources.txt > src.resources.txt.sed
DryRun
エラーが無いことを確認
cat src.resources.txt.sed | xargs -I {} terraform state mv -dry-run -state=src.terraform.tfstate -state-out=dest.terraform.tfstate {} module.admin.{}
実行
cat src.resources.txt.sed | xargs -I {} terraform state mv -state=src.terraform.tfstate -state-out=dest.terraform.tfstate {} module.admin.{}
state push
stateファイルをコピーしてpushする
cp ${WORKDIR}/dest.terraform.tfstate .
terraform state push dest.terraform.tfstate
terraform planで差分がないことを確認
terraform plan
以上