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

以上