AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

terraform plan を保存する

通常 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 使うとか色々な考慮が必要。

dev.classmethod.jp

標準出力からファイルにリダイレクトでよくない?

それでも良いし、特に CI でログだけ取りたいときは -no-color とかつけておけば制御文字も入らないので。

とはいえこのあたりは用途次第なので、最適な方法を各自考えてもろて、という感じで。

ちなみに上記バイナリ出力は terraform show ${ファイル} で中身を閲覧できます。 制御文字とか考えなくていいので、ワイはこの形式でいきとうございます。