TECHSCORE BLOG

クラウドCRMを提供するシナジーマーケティングのエンジニアブログです。

チーム開発におけるTerraformバージョンアップ戦略

はじめに

私の所属しているチームでは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コマンドを呼び出すだけで適切なバージョンで実行されるので便利です。

最後に

ソフトウェアを継続的にバージョンアップしていくためには、バージョンアップ作業を可能なかぎり軽量にしておくのがよいです。我々のチームでは無理のないバージョンアップ方針を定めて、便利なツールを採用することにより、持続可能なサイクルを作り出せたのではないかと思います。

末廣 雅利(スエヒロ マサトシ)
インフラエンジニア歴もうすぐ20年。
コロナ禍のステイホームでピアノを習い始めてもうすぐ3年。なかなか上達しなくて悪戦苦闘中。


シナジーマーケティング株式会社では一緒に働く仲間を募集しています。