1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Dockerコンテナ上で、変更があるコンポーネントのdirだけterraformコマンドをうって回るmakeコマンドを整備する

Last updated at Posted at 2020-03-01

はじめに

こんにちわ!都内でエンジニアをやっている、これからSREをやっていきなnariと申します。
最近記事が書けてなかったんですが、3月から新しい職場ということもあって、今週は前職で作ったものの供養に5つくらい記事を書いていきたいと思います。

何を作ったか

Terraformでインフラをコード管理していて、以下の図のように細かいコンポーネントに分けて管理している場合、
pullrequestを打つ前にローカルでそれぞれのdirにcdしてterraformコマンドを打ってほしい(plan-allコマンドがほしい)ケースが多くあると思います。
スクリーンショット 2020-03-02 01.14.44.png

コンポーネントを分ける話の詳細 -> Terraformのコンポーネント分割について検討する

今回は、今まで個人利用の範囲ではBashscript書いてmakeコマンド(make plan/all)で直接呼び出していたものを、チームに共有するにあたってwindowsユーザーも使えるようにdockerコンテナを立ち上げてそこでterraform planを打つように変更したので、その仕組みを共有したいと思います。

ファイル構成

  • 構成としては、Dockerfileとplan_all.shとMakefileを作成していきます
Dockerfile
FROM hashicorp/terraform:0.12.xx

COPY . .
#大元のimageのENTRYPOINTを消す
ENTRYPOINT [] //❶

❶: hashicorp/terraformのイメージは、ENTRYPOINT ["terraform"]が設定されているので、docker runのフラグ(--entrypoint)で上書きするか、ここで[]で上書きしてしまう(実行をCOMMAND側に寄せる)のが良いと思います。

scripts/tf/plan_all.sh
#!/bin/sh -xe

export EXCLUDE_DIRS='^\.|scripts|modules|config|app|slack_bot_cdk|dockerfiles|event_pattern'
DIRS=$(git --no-pager diff HEAD --name-only | xargs -I {} dirname {} | egrep -v "$EXCLUDE_DIRS" | uniq) //❶
if [ -z "$DIRS" ]; then echo "No directories for plan."
	exit 0
fi
for dir in $DIRS //❷
do
	echo $dir
	(cd $dir && terraform init -input=false -no-color)
	(cd $dir && terraform plan -input=false -no-color)
done

❶: EXCLUDE_DIRSで指定したdir以外にHEADとの差分があるdirの名前をDIRSに代入しています
❷: DIRSそれぞれでterraform planを打って回ります

Makefile
build/tf:
	docker build -f dockerfiles/tf/Dockerfile -t vk-tf:latest .\
		--cache-from vk-tf:latest
plan/all:
	make build/tf
	docker run -e "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" -e "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" \
		vk-tf:latest scripts/tf/plan_all.sh //❶

❶: 定義したDockerfileのimageをbuildして、そいつを起動して作成したscripts/tf/plan_all.shを打っています。実際のオペレーションとしては、実行したい環境のAWSのENVをセットしてmake plan/allを打てば差分のあるコンポーネントでだけterraform planを打ってくれる感じになります

最後に

コンポーネント分けた+terragruntなどのツール入れたくない場合に結構有効かなと思うので是非使ってみてください。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?