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


はじめに

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

何を作ったか

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

コンポーネントを分ける話の詳細 -> 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などのツール入れたくない場合に結構有効かなと思うので是非使ってみてください。