ようへいの日々精進XP

よかろうもん

俺の Makefile 〜 Terraform 編 〜

tl;dr

terraform に限らずですが, コマンドのオプションとかちゃんと覚えていられないので, Makefile にまとめておいて, make xxxx で叩くのが個人的なトレンドです. LinuxmacOS では特に何もしなくても make コマンドを叩けるので, Makefile に定型処理を書いておくことで, コマンドオプションのうろ覚えによるオペミスなども防げるのではないかと考えています.

俺の Makefile

こだわりの help

terraform コマンドはパスが通っている前提です. 環境に応じて terraform のパスは書き換えてください.

help: ## ヘルプを表示する
    @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'

init: ## terraform init を実行
    @terraform init

validate: ## tf ファイルを検証する
    @terraform validate && printf "\e[32m***** validated ******\e[m\n"

plan: validate ## terraform plan を実行する
    @terraform plan

apply: validate ## terraform apply を実行する
    @terraform apply

show: ## terraform show を実行する
    @terraform show

destroy: ## terraform destroy を実行する
    @terraform destroy

refresh: ## terraform refresh を実行する
    @terraform refresh

test: ## ローカル環境で circleci を実行する
    @circleci build .circleci/config.yml

こだわりは help で, rake -T みたいな感じでタスクの一覧を確認することが出来ます. 以下のような感じです.

$ make help
apply                          terraform apply を実行する
destroy                        terraform destroy を実行する
help                           ヘルプを表示する
init                           terraform init を実行
plan                           terraform plan を実行する
refresh                        terraform refresh を実行する
show                           terraform show を実行する
test                           ローカル環境で circleci を実行する
validate                       tf ファイルを検証する

$ make
apply                          terraform apply を実行する
destroy                        terraform destroy を実行する
help                           ヘルプを表示する
init                           terraform init を実行
plan                           terraform plan を実行する
refresh                        terraform refresh を実行する
show                           terraform show を実行する
test                           ローカル環境で circleci を実行する
validate                       tf ファイルを検証する

ね, いいでしょう〜.

タスクに依存関係を

例えば, terraform planterraform apply する場合, 直前に terraform validate も叩きたい場合, 以下のように Makefile を定義しておくと, validate してから planapply が動きます.

...
validate: ## tf ファイルを検証する
    @terraform validate && printf "\e[32m***** validated ******\e[m\n"

plan: validate ## terraform plan を実行する
    @terraform plan

apply: validate ## terraform apply を実行する
    @terraform apply
...

例えば, terraform plan してみます.

$ make plan
***** validated ******
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

...

------------------------------------------------------------------------

No changes. Infrastructure is up-to-date.

This means that Terraform did not detect any differences between your
configuration and real physical resources that exist. As a result, no
actions need to be performed.

validate を実行して, 特に問題が無いので, 引き続き plan が動いていることがわかります.

以上

細かすぎて伝わらないかもしれない tips でした. make コマンド奥深いです.