Workspaceが増えると、resource
の管理、及びそれに付随するvariable
の管理が辛くなってきます。
ここでは、count
を例にリファクタリングを考えたいと思います。
リソースの個数管理
resource
におけるmeta-argument1として、count
を設定することができます。
これは数値を設定することで、設定されたリソースの個数を指定することができます。例えば、GCPのリソースの場合は以下に使います。
variable "count_standard" {
default = {
"prod" = 1
"dev" = 1
}
}
resource "google_compute_instance" "standard" {
name = "sample"
count = var.count_standard
machine_type = "n1-standard-1"
zone = "asia-northeast1-b"
boot_disk {
initialize_params {
image = "debian-cloud/debian-9"
}
}
...(以下略)...
}
さて、上のコードではカウントの値をvariable
に切り出しています。また、カウントの数値は1
なので、作成されるリソースは1つになります。
上の例のようにworkspace
機能を用いて、開発環境と本番環境など複数の環境で、リソースの個数を変えたい場合は、変更者が特に気を使う必要があります。環境が多くなればなるほど、設定するカウントの個数も増えていくので、設定ミスが発生する可能性も上がります。
作成したいリソースが、要件上、1つもしくはある定数のみしか扱わない場合、コンストな変数を使うことができればこのような不安を払拭することができます。
そこで、リソースが定数の場合にはlocals
で、コンストな変数に見せかけるようにします2。以下が書き換えたコードです。
variable "use_standard" {}
locals {
"cont_standard" = "${var.use_standard == "" ? 0 : 1}"
}
resource "google_compute_instance" "standard" {
name = "sample"
count = local.count_standard
machine_type = "n1-standard-1"
zone = "asia-northeast1-b"
boot_disk {
initialize_params {
image = "debian-cloud/debian-9"
}
}
...(以下略)...
}
locals
を使って、リソースの有無をuse_standard
によって決定するように書き換えました。
少しはマシになりましたが、今度は作成の有無を決定するvariable
の管理が大変になります。複数のworkspace
がある場合はなおさらです。そこで、list
とcontains
関数を用いて改善してみます。
variable "use_standard" {
default = [
"prod"
"dev"
]
}
locals {
"cont_standard" = "${contains(var.use_standard, terraform.workspace) ? 0 : 1}"
}
resource "google_compute_instance" "standard" {
name = "sample"
count = local.count_standard
machine_type = "n1-standard-1"
zone = "asia-northeast1-b"
boot_disk {
initialize_params {
image = "debian-cloud/debian-9"
}
}
...(以下略)...
}
resource
, locals
, variable
をそれぞれ別ファイルで管理すると、count
については対応するvariable
を変更するだけになります。移行時のPRも、ブロックの意味が取りやすいので、読みやすいかと思います。