LoginSignup
1
0

More than 3 years have passed since last update.

Terraformの個数管理リファクタリング

Posted at

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がある場合はなおさらです。そこで、listcontains関数を用いて改善してみます。

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も、ブロックの意味が取りやすいので、読みやすいかと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0