概要#
普段、terraformを触っているとmoduleを多用しているリポジトリや、たくさんのリソースやdata参照があるとplanが遅くなってしまう。 個人的にはterraformはできる限り、validate, planを実行してイテレーションを回したいと思っている。
どうしてもドキュメントからはわからない場合、ドキュメントをあまり見ないで実装したりすることもあるので、なるべく試行回数を増やしたい。
しかし、planが遅いとその分だけ待ち時間になってしまう。 そのため、terraformのオプションを変えてパラレル実行数を増やしたりするわけだが、なかなか難しい場合もある。
そこで、target指定を使うのが定番なのだが、target指定もコピペするのは大変に煩わしい。 また、依存関係がある場合は一つだけだと実行できない場合がある。
色々検討して生成AIを活用してtfzというツールを作成した。
tfz#
tfzは大変シンプルなツールで、terraform plan(apply) -targetをfzfで選択して実行できるというものである。
手元でterraform実行している方はぜひ一度使ってみてほしい。
フィルタリング
インストールはbrewで可能である。 Macでしか動作確認はしていない。
brew install inamuu/tap/tfz
Brewfileなら先に inamuu/tap を追加して、tfzを記載すれば良いと思われる。 terraformを手元で触っている人がいたらぜひ検討してほしい。
他のツール#
このツールを作る前に検討したのが、tftuiとtftargetである。 どちらも非常に優れたツールである。
ただ、tftargetはgit差分から判断するのか、最初の読み込みに時間がかかるのがどうしても気になってしまい、使うのをやめてしまた。 tftuiもplan結果を確認するのにtuiの画面に閉じており、毎回フィルタリングするのも少しステップが多いと感じた。
最初は下記のようなzsh関数でfzfに食わせていたのだが、これでも十分事は足りていた。
terraform_target() {
egrep -h "(^module\s|^resource\s)" *tf | awk '{print $1"."$2"."$3}' | sed -E 's/(\"|{)//g; s/\.$//' | fzf -m | xargs -I{} printf -- '-target=%s ' {}
}
tfz() {
local subcommand="$1"
case "$subcommand" in
i|init)
terraform init
;;
f|fmt)
terraform fmt
;;
v|valiadte)
terraform validate
;;
ifv)
terraform init && terraform fmt && terraform validate
;;
p|plan)
target=$(terraform_target)
printf "🚀 terraform plan ${target}\n"
#NOTE:${=target}とすることで単語分割される
terraform plan ${=target}
;;
tg)
target=$(terraform_target)
ctl=$(echo "plan\napply" | fzf)
printf "🚀 terraform ${ctl} ${target}\n"
terraform ${ctl} ${=target}
;;
a|apply)
target=$(terraform_target)
printf "🚀 terraform apply ${target}"
terraform apply ${=target}
;;
*|help)
cat << eof
usage: tfz [subcommand] <target>
i - init
f - fmt
v - validate
ifv - init & fmt & validate
p - plan -target
tg - plan or apply to target
a - apply
eof
;;
esac
}
しかし、選択していない場合の処理など、もう少し細かい制御を考えたときに、これをそのまま一回Goで書き直そうと考えて、せっかくなのですべてcodexで作成することとした。 結果的に言えば、とてもうまくいった。 元々、簡易的なスクリプトだったことと、ツール自体がとてもシンプルなので落とし込みやすかったのだと思う。
いまや無いとちょっと面倒になるくらい、terraform plan -targetがしやすくなった。 targetばかりすると、差分がうまれやすいので実行したら最後にtfpと打って、全体のplanをかけて差分がないことを確認するフローにすることで、大変時間効率がよくなったと思う。
ほんといい時代になった。