🤖

Terraformのバージョン定義のお話

2025/03/10に公開

なぜやろうと思ったのか

TerraformのCI(GithubActions)でterraform planをかけてたんですが、ここ最近やたらこんなエラーが出るようになりました。

 Error: Unsupported Terraform Core version
│ 
│   on provider.tf line 6, in terraform:
│    6:   required_version = "~> 1.10.0"
│ 
│ This configuration does not support Terraform version 1.11.1. To proceed,
│ either choose another supported Terraform version or update this version
│ constraint. Version constraints are normally set for good reason, so
│ updating the constraint may lead to other errors or unexpected behavior.
╵
Error: Terraform exited with code 1.
Error: Process completed with exit code 1.

GithubActionsのrunner-imagesで利用しているのが、「ubuntu-latest」を利用していているので、runner-imagesで利用されているTerraformのバージョンが上がってしまっている?

今まではterraformのバージョンの指定箇所を都度都度変えてました。

provider.tf

terraform {
  required_version = "~> 1.10.0"
  backend "s3" {
    bucket         = "prod-terraform-state"
    dynamodb_table = "prod-state-lock"
    key            = "instances/instances-tfstate.tf"
    region         = "ap-northeast-1"
  }
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.49.0"
    }
  }
}

.terraform-version

1.10.0

毎回これを書き換えるのはだるいなーと思ってたんですが、色々調べたらうまく対応する方法がありそうなので、今回見直しを行いました。

対応

Provider.tf

今まで、

  • required_version = "~> 1.10.0"

と書いていたんですが、これだと「Any Terraform v1.10.x, but not v1.11.x or later」になってしまい、「1.11.x」だとエラーとなってしまうので、以下の通りに書き換えました。

  • required_version = ">= 1.10.0, < 2.0.0"

これであれば、「Terraform v1.10.0 or greater, but less than v2.0.0」となるので「v1.11.x」にバージョンアップしてもとりあえずCIでコケることはなくなるかと思います。
一応v2に変わる時はチェックポイントを設けておいた方がいいのかなと思い、「< 2.0.0」の記述は入れています。

変更前

terraform {
  required_version = "~> 1.10.0"
  backend "s3" {
    bucket         = "prod-terraform-state"
    dynamodb_table = "prod-state-lock"
    key            = "instances/instances-tfstate.tf"
    region         = "ap-northeast-1"
  }
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.49.0"
    }
  }
}

変更後

terraform {
  required_version = ">= 1.10.0, < 2.0.0"
  backend "s3" {
    bucket         = "prod-terraform-state"
    dynamodb_table = "prod-state-lock"
    key            = "instances/instances-tfstate.tf"
    region         = "ap-northeast-1"
  }
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.49.0"
    }
  }
}

.terraform-version

これも調べていて初めて知ったのですが、バージョンを記述する以外の書き方もあることが分かりました。

  • min-required:required_version値に合致する最小のバージョンをインストールする
  • latest-allowed:required_version値に合致する最大のバージョンをインストールする

どっちがいいかなとちょっと悩んだんですが、基本的にCIのrunner-imagesのTerraformのマイナーバージョンがどんどん上がってしまうので基本的には追従する形が良いかなと思うので「latest-allowed」にしました。
このあたりは、扱っているものの性質やチームの方針によって変わってくるかと思います。
一旦、こちらでやってみて問題がありそうだったら見直していこうかと思います。

変更前

1.10.0

変更後

latest-allowed

所感

今回は、工数削減(CIのrunner-imagesのterraformバージョンアップ時の対応工数)を優先して変更しましたが、terraformのバージョン管理ってどうすべきか結構難しいですね。。。。
なんか他にいいやり方があるようであれば、教えてほしいです。。。w

参考サイト

https://developer.hashicorp.com/terraform/tutorials/configuration-language/versions
https://zenn.dev/sway/articles/terraform_staple_fixversion
https://dev.classmethod.jp/articles/tfenv-terraform-version/

NaviPlusテックブログ

Discussion