はじめに
私の所属しているチームではTerraformを用いて多くのサービス基盤を構築しています。TerraformのコードはGitのプロジェクト単位で約20個あり、それぞれ対象の環境によってコードを更に分割しているのでterraform
の実行単位としては60個くらいあります。これらをチームで管理しています。
ひとりで開発している段階では毎週のようにterraform init -upgrade
して最新に追随していましたが、サービスインしてチームで管理するようになるとそうもいきません。プロバイダーは、まれにマイナーバージョンアップでも破壊的変更が入ることがあります。重要なインフラの変更を準備しているところに不用意にバージョンアップされると困ったことにもなりかねません。そこで我々はTerraformのバージョンアップ方針を定めて運用しています。
バージョンアップ方針
実はバージョンアップ方針というほど大それたものではないのですが、次の方針で運用しています。
- プロジェクト毎にバージョンを固定する
- 3ヶ月毎に最低バージョンを定めてバージョンアップを実施する
- tfenvを活用する
プロジェクト毎にバージョンを固定する
意図しないバージョンアップが発生しないように、Terraformおよびプロバイダーのバージョンを明示的に指定しています。
# versions.tf terraform { required_version = "1.5.7" required_providers { aws = { source = "hashicorp/aws" version = "5.22.0" } } }
3ヶ月毎に最低バージョンを定めてバージョンアップを実施する
バージョンを固定したまま塩漬けにするのはセキュリティや新機能への対応の点で望ましくありません。最新のバージョンからの乖離が大きくならないように、四半期毎に最低バージョンを定めてバージョンアップを実施しています。
たとえば2023年10月の時点では下記のバージョン以上になるよう、それぞれのプロジェクトの都合のよいタイミングでバージョンアップを進めています。
Terraform: 1.5.7 AWS Provider: 5.0.0
tfenvを活用する
上述のようにしてプロジェクト毎にバージョンアップを進めると、プロジェクトによってTerraformのバージョンに差異が生じることになります。そこで、tfenvを利用してTerraformのバージョン切り替えに柔軟に対応しています。
上記のrequired_version
で指定したバージョンをtfenv
が選択してくれるように、terraform
を実行するディレクトリ毎に次の内容で.terraform-version
を設置しています。
min-required
こうしておけば、バージョンの切り替えを意識することなく、適切なバージョンのterraform
を実行できます。
tfenv
はデフォルトでTFENV_AUTO_INSTALL
環境変数がtrue
に設定されているものとして動作します。つまりterraform
を実行するときに指定されたバージョンがインストールされていなければ自動的にインストールしてくれます。tfenv install ...
を実行する必要もありません。tfenv
の存在を意識することなくterraform
コマンドを呼び出すだけで適切なバージョンで実行されるので便利です。
最後に
ソフトウェアを継続的にバージョンアップしていくためには、バージョンアップ作業を可能なかぎり軽量にしておくのがよいです。我々のチームでは無理のないバージョンアップ方針を定めて、便利なツールを採用することにより、持続可能なサイクルを作り出せたのではないかと思います。
コロナ禍のステイホームでピアノを習い始めてもうすぐ3年。なかなか上達しなくて悪戦苦闘中。