このブログをご覧のみなさん、こんにちは。
Azure Storage で Terraform の状態管理ファイル terraform.tfstate を管理する方法によって、複数人や CI で Terraform の管理ができるようになります。
しかし、ここで一点注意事項があります。それは
- 複数人や CI 環境で Terraform の管理をする場合 Terraform のバージョンを統一する必要がある
ということです。
これは Terraform が作成する terraform.tfstate
ファイルに実行した Terraform のバージョン情報が含まれており、下位互換はするのですが、上位互換はしないためです。
どういう動作をするかというと、以下のようになります。
0.7.0
で作成されたterraform.tfstate
ファイルを0.7.1
で同期: できる0.7.1
で作成されたterraform.tfstate
ファイルを0.7.0
で同期: できない
この辺りは意識していないと、「 CI 環境はバージョン固定で、ローカルの Mac は常に最新を入れて実行したら CI 側がエラーになった」なんてことが起こる可能性があります。というか起こりました。
そこで、ローカルにインストールしたバージョンに依存させず、ローカルと CI 環境といった具合に環境が異なっていても、また、実行者が異なっていても同じ Terraform のバージョンで運用出来るようになるととても幸せなのではないか?と思って解決策を考えました。
Environment
- Mac Book Pro
- OS X Yosemite 10.10.5
- Terraform 0.7.1
Terraform のバージョン問題を Docker で解決する方法
タネを明かすと「なんだ、そんなことか」と思われるでしょうが、実行環境を Docker コンテナ上にすることが、この問題を解決できます。また、自分で Terraform の Docker Image を準備しなくても Docker Hub に HashiCorp 社の公式 Terraform イメージが存在しています。このイメージを使って、バージョンを固定して実行したいなら以下のコマンドになります。
$ docker run --rm --name terraform --env-file /${PWD}/.env -v ${PWD}:/terraform -w /terraform hashicorp/terraform:0.7.1 plan
バージョンを固定せず、常に最新版で実行したいなら以下のコマンドになります。
$ docker run --rm --name terraform --env-file ${PWD}/.env -v ${PWD}:/terraform -w /terraform hashicorp/terraform:latest plan
Terraform は更新頻度が高く、機能拡張されていくので、なるべく最新版で実行するように心がけた方が良いでしょう。