Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Terraform and GCS : how to create a multi zone LB

I want to create a load balancer adressing two or more instances on several zones of the same region in GCP

I start like that : - create a backend service adressing two instance groups :

resource "google_compute_backend_service" "www-service" {
  name     = "${var.environment}-www-service"
  protocol = "HTTP"
  port_name   = "http"

  backend {
    group = "${google_compute_instance_group.instance-group-0.self_link}"
  }

  backend {
    group = "${google_compute_instance_group.instance-group-1.self_link}"
  }

  health_checks = ["${google_compute_health_check.health-check1.self_link}"]
}

Then I have two instance groups, each one with a one instance with that syntax :

resource "google_compute_instance_group" "instance-group-0" {
  count        = "${var.web_count}"
  name = "${var.environment}-instance-group-0"

  instances = ["${google_compute_instance.www.self_link}"]

  named_port {
    name = "http"
    port = "80"
  }
  network = "${google_compute_network.platform-network.self_link}"
}

I get an error :

google_compute_backend_service.www-service: Resource 'google_compute_instance_group.instance-group-0' not found for variable 'google_compute_instance_group.instance-group-0.self_link'

I see that switching the backend/group declarations in the backend_service moves the error to group-1, so I can guess that this is not the proper syntax, although you can create a backend_service with multiple instance groups in the Google GUI.

I have two questions :

Q1. How can I create backend_service with multiple instance groups ? what is the right syntax ?

Q2. Is it possible to reference a compute_instance in a compute_instance_group via a syntax like :

instances = ["${google_compute_instance.www.[count.index].self_link}"]

(the above syntax does not work)

like image 723
Yves Avatar asked Nov 20 '25 19:11

Yves


1 Answers

Thanks for your answer

Finally I found the syntax across multiple Github tickets :

resource "google_compute_instance_group" "instance-group-0" {
  name = "${var.environment}-instance-group-0"
  zone = "${data.google_compute_zones.available.names[0]}" 

  instances = ["${slice(google_compute_instance.www.*.self_link, 0, floor(var.web_count/2)-1)}"]

  named_port {
    name = "http"
    port = "80"
  }
  network = "${google_compute_network.platform-network.self_link}"
} 

same for instance group 1, but different slice

Then :

resource "google_compute_instance" "www" {
  count        = "${var.web_count}"
  zone         =  "${data.google_compute_zones.available.names[floor((2*count.index)/var.web_count)]"}

I must say that different design decisions can be taken : - use a region managed instance group is simpler, except the template is static - use Kubernetes

like image 174
Yves Avatar answered Nov 24 '25 06:11

Yves



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!