Help us understand the problem. What is going on with this article?

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

はじめに

こんにちわ!都内でエンジニアをやっている、これから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などのツール入れたくない場合に結構有効かなと思うので是非使ってみてください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした