bakadevops
bakadevops

Reputation: 149

Produce repeating blocks inside a terraform resource

I am fairly new to terraform and trying to create a google_compute_backend_service using terraform and there are multiple backend blocks inside the resource as shown below:

resource "google_compute_backend_service" "app-backend" {
  log_config {
    enable      = "true"
    sample_rate = "1"
  }

  name             = "app-backend"
  port_name        = "http-34070"
  project          = "my-project"
  protocol         = "HTTP"
  session_affinity = "NONE"
  timeout_sec      = "30"

  backend {
    group = "insatnce-group1"
  }

  backend {
    group = "instance-group2"
  }

  backend {
    group = "instance-group3"
  }

  health_checks = [google_compute_http_health_check.app-http-l7.name]
}

As seen in the code block above the backend block repeats multiple times. I want to make it dynamic so I do not have to write multiple blocks manually.

I tried the following:

Created a variable in the variables.tf file that contains all the instance groups:

variable "groups" {
  type = list(object({
    name = string
  }))
  default = [{ name = "instance-group1"}, 
             { name = "instance-group2"}, 
             { name = "instance-group3"}]
}

And modified my resource block to this:

resource "google_compute_backend_service" "app-backend" {
  log_config {
    enable      = "true"
    sample_rate = "1"
  }

  name             = "app-backend"
  port_name        = "http-34070"
  project          = "my-project"
  protocol         = "HTTP"
  session_affinity = "NONE"
  timeout_sec      = "30"

  dynamic "backend" {
    for_each = var.groups
    iterator = item
    group = item.value.name
  }

  health_checks = [google_compute_http_health_check.app-http-l7.name]
}

However, when I execute terraform plan I get the following error:

Error: Unsupported argument
│
│   on backend_service.tf line 15, in resource "google_compute_backend_service" "app-backend":
│   15:     group = item.value.name
│
│ An argument named "group" is not expected here.

Where am I going wrong? Is there a better way to achieve this?

Upvotes: 1

Views: 1585

Answers (1)

Matthew Schuchard
Matthew Schuchard

Reputation: 28739

You can check the dynamic blocks documentation for the syntax. Otherwise, you had the right idea.

dynamic "backend" {
  for_each = var.groups

  content {
    group = backend.value.name
  }
}

You can also simplify the variable structure to make this even easier.

variable "groups" {
  type    = set(string)
  default = ["instance-group1", "instance-group2", "instance-group3"]
}

dynamic "backend" {
  for_each = var.groups

  content {
    group = backend.value
  }
}

Upvotes: 2

Related Questions