Terraform shows warnings while creating Internal LB with GKE NEG Backend

Hello!

I’m trying to create an Internal regional Application Load Balancer with GKE NEG as a backend using Terraform. I had no issues during the first run, but when I update my application (Jira), which causing removing and adding back endpoints to NEG, there’s a warning message. Meanwhile, all resources were created and works as expected.

Please find my Terraform code below:

data "google_compute_network_endpoint_group" "ilb_network_endpoint_group_zonal" {
  count   = var.environment == "qa" || var.environment == "test" || var.environment == "dev" ? 1 : 0
  name    = "name-${var.environment}-jira-neg"
  project = local.project_id
  zone    = "europe-west3-a"

  depends_on = [
    helm_release.jira
  ]
}

resource "google_compute_region_health_check" "ilb_health_check_zonal" {
  count   = var.environment == "qa" || var.environment == "test" || var.environment == "dev" ? 1 : 0
  name    = "name-${var.environment}-ilb-health-check"
  project = local.project_id
  region  = local.region
  
  timeout_sec         = 5
  check_interval_sec  = 5
  healthy_threshold   = 2
  unhealthy_threshold = 2

  http_health_check {
    port         = "8080"
    request_path = "/status"
    port_specification = "USE_FIXED_PORT"
  }
}

resource "google_compute_region_backend_service" "ilb_backend_service_zonal" {
  count                 = var.environment == "dev" || var.environment == "test" || var.environment == "qa" ? 1 : 0
  name                  = "name-${var.environment}-ilb-backend-service"
  project               = local.project_id
  region                = local.region
  health_checks         = [google_compute_region_health_check.ilb_health_check_zonal[0].id]
  protocol              = "HTTP"
  load_balancing_scheme = "INTERNAL_MANAGED"
  enable_cdn            = false
  session_affinity      = "GENERATED_COOKIE"
  locality_lb_policy    = "RING_HASH"
  timeout_sec           = 300

  backend {
    group                 = data.google_compute_network_endpoint_group.ilb_network_endpoint_group_zonal[0].id
    balancing_mode        = "RATE"
    max_rate_per_endpoint = 1000
    capacity_scaler       = 1.0
  }

  consistent_hash {
    minimum_ring_size = 1024
  }
}

resource "google_compute_region_url_map" "ilb_url_map_zonal" {
  count           = var.environment == "dev" || var.environment == "test" || var.environment == "qa" ? 1 : 0
  name            = "name-${var.environment}-ilb-url-map"
  project         = local.project_id
  region          = local.region
  default_service = google_compute_region_backend_service.ilb_backend_service_zonal[0].id
}

resource "google_compute_region_target_http_proxy" "ilb_target_http_proxy_zonal" {
  count   = var.environment == "dev" || var.environment == "test" || var.environment == "qa" ? 1 : 0
  name    = "name-${var.environment}-ilb-https-proxy"
  project = local.project_id
  region  = local.region
  url_map = google_compute_region_url_map.ilb_url_map_zonal[0].id
}

resource "google_compute_forwarding_rule" "ilb_global_forwarding_rule_zonal" {
  count                 = var.environment == "dev" || var.environment == "test" || var.environment == "qa" ? 1 : 0
  name                  = "name-${var.environment}-ilb-global-forwarding-rule"
  project               = local.project_id
  region                = local.region
  network               = data.google_compute_network.network.self_link
  subnetwork            = data.google_compute_subnetwork.subnet.self_link
  ip_protocol           = "TCP"
  load_balancing_scheme = "INTERNAL_MANAGED"
  port_range            = "80"
  target                = google_compute_region_target_http_proxy.ilb_target_http_proxy_zonal[0].self_link  
  ip_address            = data.google_compute_address.nginx_ingress_ip.address
}

NEG changes during application update:

jira    83s     Normal  Detach          service/jira    Detach 1 network endpoint(s) (NEG "name-test-jira-neg" in zone "europe-west3-a")
jira    69s     Normal  Attach          service/jira    Attach 1 network endpoint(s) (NEG "name-test-jira-neg" in zone "europe-west3-a")

Warning message:

 Error: Provider produced inconsistent final plan
 
 When expanding the plan for
 google_compute_region_backend_service.ilb_backend_service_zonal[0] to
 include new values learned so far during apply, provider
 "registry.terraform.io/hashicorp/google" produced an invalid new value for
 .backend: planned set element
 cty.ObjectVal(map[string]cty.Value{"balancing_mode":cty.StringVal("RATE"),
 "capacity_scaler":cty.NumberIntVal(1), "description":cty.StringVal(""),
 "failover":cty.UnknownVal(cty.Bool), "group":cty.UnknownVal(cty.String),
 "max_connections":cty.NullVal(cty.Number),
 "max_connections_per_endpoint":cty.NullVal(cty.Number),
 "max_connections_per_instance":cty.NullVal(cty.Number),
 "max_rate":cty.NullVal(cty.Number),
 "max_rate_per_endpoint":cty.NumberIntVal(1000),
 "max_rate_per_instance":cty.NullVal(cty.Number),
 "max_utilization":cty.NullVal(cty.Number)}) does not correlate with any
 element in actual.
 
 This is a bug in the provider, which should be reported in the provider's
 own issue tracker.

Steps to Reproduce:

  1. Create GKE service with NEG using annotations:
annotations:
      cloud.google.com/neg: '{"exposed_ports": {"80":{"name": "name-${environment}-jira-neg"}}}'
  1. Use Terraform code above to deploy Internal regional Application Load Balancer while using NEG as a backend.
  2. Update app parameters to trigger adding and removing endpoints to NEG and run terraform apply

Second execution of terraform apply shows no issues.

One more thing, I have no issues with the similar solution, but with External HTTPS Load Balancer instead.

What I tried so far:

  • I tried to add a delay beforedata.google_compute_network_endpoint_group.ilb_network_endpoint_group_zonal to address some possible internal processes in GCP - no luck with 360s delay;
  • Reported issue to GCP Support - they found no issues with created resources;
  • Reported issue on GitHub - no solution so far.

I wonder if anyone has the same issue? If yes, pls let me know if there’s a way to solve it and how did you do that. If you found no solution, please thumbs up of my issue report.

Thanks in advance!

I found a work around which is quite strange:

resource "google_compute_region_backend_service" "ilb_backend_service_zonal" {
  count                 = var.environment == "dev" || var.environment == "test" || var.environment == "qa" ? 1 : 0
  name                  = "name-${var.environment}-ilb-backend-service"
  project               = local.project_id
  region                = local.region
  health_checks         = [google_compute_region_health_check.ilb_health_check_zonal[0].id]
  protocol              = "HTTP"
  load_balancing_scheme = "INTERNAL_MANAGED"
  enable_cdn            = false
  session_affinity      = "GENERATED_COOKIE"
  locality_lb_policy    = "RING_HASH"
  timeout_sec           = 300

  backend {
    group           = "projects/${local.project_id}/zones/europe-west3-a/networkEndpointGroups/name-${var.environment}-jira-neg"
    #group                 = data.google_compute_network_endpoint_group.ilb_network_endpoint_group_zonal[0].id
    balancing_mode        = "RATE"
    max_rate_per_endpoint = 1000
    capacity_scaler       = 1.0
  }

  consistent_hash {
    minimum_ring_size = 1024
  }
  
  depends_on = [
    helm_release.jira
  ]
}

Meanwhile, at tfstate it’s identical to .id:

    {
      "mode": "data",
      "type": "google_compute_network_endpoint_group",
      "name": "ilb_network_endpoint_group_zonal",
      "provider": "provider[\"registry.terraform.io/hashicorp/google\"]",
      "instances": [
        {
          "index_key": 0,
          "schema_version": 0,
          "attributes": {
            "default_port": 0,
            "description": "{\"cluster-uid\":\"5b267696-062b-44ae-b771-a1946ce02abf\",\"namespace\":\"jira\",\"service-name\":\"jira\",\"port\":\"80\"}",
            "id": "projects/project-id-test/zones/europe-west3-a/networkEndpointGroups/name-test-jira-neg",
            "name": "name-test-jira-neg",
            "network": "https://www.googleapis.com/compute/v1/projects/project-id-test/global/networks/name-test-vpc",
            "network_endpoint_type": "GCE_VM_IP_PORT",
            "project": "project-id-test",
            "self_link": "https://www.googleapis.com/compute/v1/projects/project-id-test/zones/europe-west3-a/networkEndpointGroups/name-test-jira-neg",
            "size": 1,
            "subnetwork": "https://www.googleapis.com/compute/v1/projects/project-id-test/regions/europe-west3/subnetworks/name-test-subnet",
            "zone": "https://www.googleapis.com/compute/v1/projects/project-id-test/zones/europe-west3-a"
          },
          "sensitive_attributes": []
        }
      ]
    },