つまるところ
- 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型からワークスペースに対応するパラメータを読み出すのとどちらが高い可読性とスケーラビリティを持つのか実環境で使い分けてみよう。