このブログをご覧のみなさん、こんにちは。

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 は更新頻度が高く、機能拡張されていくので、なるべく最新版で実行するように心がけた方が良いでしょう。