Macでのterraform version管理

2 min read読了の目安(約2300字

Terraform logo

https://www.terraform.io/

記事の内容3行で

  1. Macで
  2. Terraformを
  3. Versioningしたい

選択肢

まだまだ変更の多いTerraformですので、プロジェクト毎にバージョンが異なっていることが多々あると思います。そのため、基本的にTerraformをそのままインストールして使うのは少ししんどいです。
なので、バージョニングしたいのでいくつか選択肢について使いながら検討しました。

  1. tfenv
  2. Docker

先にどちらが良いかの感想

結論から書くと、どちらも使う、というのが私の今のところの考えです。
理由ですが、まずTerraformのコマンドはバッチ処理チックに使用することが多いため

$ docker run
$ docker-compose run

的なものを用いて、Terraformコマンド実行毎に環境が生えた方が良い気がしています。
環境が変わることなくクリーンな感じで実行できる(言語化できてないです)ので安心感があります。本番運用するのであればこういった枠組みが欲しくなります。
一方で、Terraformの開発をしていくにあたって、関数やリソースの動作確認のためのデバッグを毎回Dockerで実行するのはしんどいです。
そこで便利なのが、TerraformのインタラクティブなREPLを起動してくれる下記コマンドです。

$ terraform console

開発時にはこれを使って、細かい処理について試しながらやっていくことになると思います。
そのため、冒頭のどちらも使うという結論になります。
あまり依存関係やライブラリが膨れ上がることも多くないと思うので、正直どちらでも良いといえば良い(例えば、開発時はdocker-compose.ymlに対してエントリーポイントを消してデーモン起動できるようにするとか)のですが、メンテナンスも面倒なことが少ないと思うので、Docker用のリソースを用意しておきながら、terraformのバージョン指定(≠固定)用に .terraform_version ファイルをおいておくことでローカルのTerraformを用いてもどのバージョンがサポートされているか分かる形にするのが柔軟で良いかなと思っています。

tfenv

https://github.com/tfutils/tfenv
pyenvのような良くあるバージョン切り替えをサポートしてくれる、Terraformのバージョン管理ツールです。ほぼほぼ公式チュートリアルにあることまんまですが...
  • tfenv インストール
shell
$ brew install tfenv
  • Terraform 最新バージョンインストール(どれでも良い)
shell
$ tfenv install
$ tfenv install latest
$ tfenv install {最新バージョン指定}
  • インストール可能なリスト
shell
$ tfenv list-remote
  • 手元のインストール済みリスト
shell
$ tfenv list

Docker

https://hub.docker.com/r/hashicorp/terraform/
Dockerもとてもシンプルですが、今回は Docker ファイルと docker-compose.yml ファイルを用いたdocker composeの構成にしてみます。
Docker
FROM hashicorp/terraform:0.15.0

WORKDIR /root/terraform/
ENTRYPOINT /bin/sh

docker-compose.yml
version: '3'
services:
  terraform:
    build:
      context: .
      dockerfile: Dockerfile
    tty: true
    image: terraform
    working_dir: /root/terraform/
    volumes:
      - .:/root/terraform/
    env_file: .env

envファイルはTerraformで構築するための環境変数ファイルです。

後はイメージをpull, buildしてrunすればOKです。

shell
$ docker-compose build

$ docker-compose run terraform init
$ docker-compose run terraform plan
$ docker-compose run terraform apply
$ docker-compose run terraform destroy
$ docker-compose run terraform import