通常 terraform を利用する際は、以下三段構えだと思われる。
terraform init terraform plan terraform apply (-auto-approve)
AWS とか Azure、 GCP などのパブリッククラウドであれば「tfstate の管理はリモートでやれ」というのがベストプラクティスなので気にしなくても良さそうなんですが、 まあなんかあったときのために plan を再利用可能にしたい、というのはあると思います。 特に deploy まで Terraform で賄ってしまっている場合。
いわゆる Capistrano でリリース管理してて releases/20220718100000
から releases/20220717191945
に戻したい! current のシンボリックリンク変更や! みたいな運用。
上記はアプリケーションのみがターゲットで、 Terraform が管理するのは IaC なので「ターゲットの範囲が違うやんけ!」というのはあるけど、やりたいこととしては上記のような感じです。
plan をファイル出力する
以下のようにすると、 plan の内容をバイナリファイルとして吐けます。
terraform plan -out=${ファイル名}
help における -out
の説明はこう。
-out=path Write a plan file to the given path. This can be used as input to the "apply" command.
apply コマンド実行時に指定して利用できる、と言っている。
実際にどうする
plan を実行するパスで、以下のように plan_output
ディレクトリを作るなどしている。
mkdir plan_output terraform plan -out=./plan_output/`date "+%Y%m%d%H%M%S"`_tfplan #省略# ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── Saved the plan to: ./plan_output/20220718093722_tfplan To perform exactly these actions, run the following command to apply: terraform apply "20220718093722_tfplan" ls -lha plan_output total 44K drwxr-xr-x 3 user staff 96 7 18 10:30 . drwxr-xr-x 19 user staff 608 7 18 10:29 .. -rw-r--r-- 1 user staff 44K 7 18 10:30 20220718103006_tfplan
.gitignore
に上記 plan_output を登録しておけば良い。 もし git で管理する場合は、認証情報とか入っちゃう可能性あるので、 Shared_credentials_file
使うとか sensitive = true
使うとか色々な考慮が必要。
標準出力からファイルにリダイレクトでよくない?
それでも良いし、特に CI でログだけ取りたいときは -no-color
とかつけておけば制御文字も入らないので。
とはいえこのあたりは用途次第なので、最適な方法を各自考えてもろて、という感じで。
ちなみに上記バイナリ出力は terraform show ${ファイル}
で中身を閲覧できます。 制御文字とか考えなくていいので、ワイはこの形式でいきとうございます。