メインコンテンツへスキップ

tfzを作った

·179 文字·1 分
inamuu
著者
inamuu

概要
#

普段、terraformを触っているとmoduleを多用しているリポジトリや、たくさんのリソースやdata参照があるとplanが遅くなってしまう。 個人的にはterraformはできる限り、validate, planを実行してイテレーションを回したいと思っている。

どうしてもドキュメントからはわからない場合、ドキュメントをあまり見ないで実装したりすることもあるので、なるべく試行回数を増やしたい。

しかし、planが遅いとその分だけ待ち時間になってしまう。 そのため、terraformのオプションを変えてパラレル実行数を増やしたりするわけだが、なかなか難しい場合もある。

そこで、target指定を使うのが定番なのだが、target指定もコピペするのは大変に煩わしい。 また、依存関係がある場合は一つだけだと実行できない場合がある。

色々検討して生成AIを活用してtfzというツールを作成した。

tfz
#

tfzは大変シンプルなツールで、terraform plan(apply) -targetをfzfで選択して実行できるというものである。
手元でterraform実行している方はぜひ一度使ってみてほしい。

https://github.com/inamuu/tfz

Image

フィルタリング

Image

インストールは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をかけて差分がないことを確認するフローにすることで、大変時間効率がよくなったと思う。

ほんといい時代になった。