😸

Makefileでterraformコマンドを打とう

2023/07/02に公開

想定する読者

・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