😸
Makefileでterraformコマンドを打とう
想定する読者
・terraformを初めて使う人
・makefileを初めて使う人
前回までのおさらい
この記事から読んでも問題ありませんが、一応こちらの記事からの続きで書いています。
aws-vaultでMFAを有効にしながらterraformを使う準備をしよう
makefileでterraformのコマンドを実行しよう
terraformコマンドはmain.tfを置いているディレクトリで実行する必要があるため、環境ごとにディレクトリを分けることの多いterraformはディレクトリの移動が多くなって面倒です。
そこでmakefileからterraformコマンドを打つようにしましょう。
makfileを作る
下記のようなmakefileをリポジトリ直下に置きます
Makefile
assert-command = $(if $(shell which $1),,$(error '$1' command is missing))
assert-var = $(if $($1),,$(error $1 variable is not assigned))
$(call assert-command,aws)
$(call assert-command,terraform)
$(call assert-command,aws-vault)
DIR_ABS = $(abspath $(DIR))
TFCMD := aws-vault exec $${MFA_ROLE} -- terraform -chdir=$(DIR)
.DEFAULT_GOAL := confirm
check-variables:
@$(call assert-var,DIR)
confirm: check-variables
@echo "--------------------------------------------------"
@echo " DIR = [$(DIR)]"
@echo " DIR_ABS = [$(DIR_ABS)]"
@echo " TF_VAR_region = [$${TF_VAR_region}]"
@echo " MFA_ROLE = [$${MFA_ROLE}]"
@echo " terraform workspace is [$(shell $(TFCMD) workspace show)]"
@echo "--------------------------------------------------"
@echo ""
plan: check-variables confirm
@$(TFCMD) plan
実行方法
make plan DIR='/Users/xxxxx/xxxx/'
解説
下記は関数を作っています。
Makefile
assert-command = $(if $(shell which $1),,$(error '$1' command is missing))
assert-var = $(if $($1),,$(error $1 variable is not assigned))
1つ目の関数は下記のように実行し、必要なコマンドがインストールされていなければアラートを出します。
Makefile
$(call assert-command,aws)
$(call assert-command,terraform)
$(call assert-command,aws-vault)
2つ目の関数はcheck_variablesというMakefileで定義したコマンドの中でDIRというシェル変数や必要な変数が揃っているかの確認をします。
check-variables:
@$(call assert-var,DIR)
もし以下のようにDIRを指定せずに実行すると
make check-variables
以下のようなアラートが出ます。
*** DIR variable is not assigned. Stop.
下記については
Makefile
plan: check-variables confirm
@$(TFCMD) plan
下記のように実行することで、check-variablesとconfirmを実行したのちに@$(TFCMD) planを実行することができます。
make plan DIR='/Users/xxxxx/xxxx/'
実行するだけなら下記のような@がない書き方でも大丈夫ですが、打ったコマンド自体もログに出てきてしまうので、ログをスッキリさせるために@をつけています。
@$(TFCMD) plan
$(TFCMD) plan
Discussion