variables.tfとterraform.tfvarsの違いを改めて言語化してみた

GCP

つまるところ

  • variables.tfはvariable(変数)の宣言を行うところ
  • terraform.tfvarsはvariables.tfで定義されたvariableに値を代入するところ
  • variableには初期値を定義できて、すべてのvariableに初期値が定義されていればterraform.tfvarsは存在しなくてもデプロイできる
  • 宣言と代入が分かれているので、prodやstagingといった環境別に異なるパラメータでインフラストラクチャをデプロイできる

ふたつのファイルの違い

variables.tf

Terraformのvariable(変数)を宣言するために使われる。デフォルト値を定義しておくこともできる。

variable "image" {
  type = string
}
variable "max_scale" {
  type = number
  default = 1
}
variable "container_name" {
  type = string
}

terraform.tfvars

variable型の値をセットするために使われる。ただし新たなterraform.tfvarsの中では新たな変数の宣言はできない。代入が省略されるとvariables.tf内で定義されたデフォルト値が入る。

image = "us-docker.pkg.dev/cloudrun/container/hello"
#max_scale = 1 
container_name="hello_dev"

terraform planの実行

ディレクトリ構造

.
├── env
│   ├── dev
│   │   ├── main.tf
│   │   ├── terraform.tfvars
│   │   └── variables.tf
│   └── prod
│       ├── main.tf
│       ├── terraform.tfvars
│       └── variables.tf
├── modules
│   ├── backend
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   └── frontend
├── provider.tf
└── terraform.tfstate.d

./env/dev

image = "us-docker.pkg.dev/cloudrun/container/hello"
#max_scale = 1 
container_name="hello_dev"

max_scale はコメントアウトしているが、default値の1が入っている。

$ terraform plan

Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # module.backend.google_cloud_run_service.container will be created
  + resource "google_cloud_run_service" "container" {
      + autogenerate_revision_name = true
      + id                         = (known after apply)
      + location                   = "asia-northeast1"
      + name                       = "hello_dev"
      + project                    = ******
      + status                     = (known after apply)

      + metadata {
          + annotations      = {
              + "autoscaling.knative.dev/maxScale" = "1"
            }
...
Plan: 1 to add, 0 to change, 0 to destroy.

───────────────────────────────────────────────────────────────────────────────

./env/prod

image = "us-docker.pkg.dev/cloudrun/container/hello"
max_scale = 2
container_name="hello_prod"

maxScaleにはprodフォルダ内のterraform.tfvarsで代入された2が代入されている。

$ terraform plan

Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # module.backend.google_cloud_run_service.container will be created
  + resource "google_cloud_run_service" "container" {
      + autogenerate_revision_name = true
      + id                         = (known after apply)
      + location                   = "asia-northeast1"
      + name                       = "hello_prod"
      + project                    = "******"
      + status                     = (known after apply)

      + metadata {
          + annotations      = {
              + "autoscaling.knative.dev/maxScale" = "2"
            }
...
Plan: 1 to add, 0 to change, 0 to destroy.

気になるところ

terraform.tfvarsを環境別に定義するのと、ワークスペース(terraform workspace)を使ってmap型からワークスペースに対応するパラメータを読み出すのとどちらが高い可読性とスケーラビリティを持つのか実環境で使い分けてみよう。

タイトルとURLをコピーしました