Search code examples
terraformterraform-provider-gcp

for each module reference between modules with a map object


im trying to create an instance group with reference to an GCE, but im unable to refer to the id from instance group to link to the GCE

variable "compute_engine_instances" {
  type = map(object({
    instance_name = string
    machine_type  = string
    zone          = string
    tags          = list(string)
    image_name    = string
    image_project = string
    labels        =object({
    app_id      = number
    cost_center = string
    owner       = string
    email       = string
  })
  }))
}
module "qat_hosted_pacs_compute_engines" {
  source = "../modules/compute_engine"

  for_each      = var.compute_engine_instances
  project_id    = var.project_id
  instance_name = each.value.instance_name
  machine_type  = each.value.machine_type
  tags          = each.value.tags
  labels        = each.value.labels
  subnetwork    = var.subnetwork
  zone          = each.value.zone
  image_name    = each.value.image_name
  image_project = each.value.image_project
}
variable "instance_group" {
  type = map(object({
    group_manager_name = string
    zone = string
  }))
  
}
module "qat_hosted_pacs_app_grp" {
  source             = "../modules/instance_groups"
  for_each = var.instance_group
  group_manager_name = each.value.group_manager_name
  zone               = each.value.zone
  project_id         = var.project_id
  instances          = module.qat_hosted_pacs_compute_engines.vm_name   #unable to figure out how to reference the GCE
}

#output.tf looks like this for compute engine module

output "compute_engine_instances" {
  value = {
    for k, v in module.qat_hosted_pacs_compute_engines : k => v.vm_name
  }
}

The root module looks like this for compute engine

data "google_compute_image" "compute_image" {
  name    = var.image_name
  project = var.image_project
}

resource "google_compute_instance" "generic_instance" {
  project      = var.project_id
  name         = var.instance_name
  machine_type = var.machine_type
  zone         = var.zone

  tags   = var.tags
  labels = var.labels

  boot_disk {
    initialize_params {
      image = data.google_compute_image.compute_image.self_link
    }
    auto_delete = true
  }

  network_interface {
    subnetwork = var.subnetwork
  }
}

#outputs.tf here looks like this for gce resource

output "vm_name" {
  value       = google_compute_instance.generic_instance.id
  description = "The name of the VM"
}

And the instance group manager looks like this

resource "google_compute_instance_group" "igm" {
  name    = var.group_manager_name
  zone    = var.zone
  project = var.project_id

  instances = var.instances
  named_port {
    name = "http"
    port = "8080"
  }

  named_port {
    name = "https"
    port = "8443"
  }

  lifecycle {
    create_before_destroy = true
  }
}

i get the foll. error

Error: Unsupported attribute

  on main.tf line 45, in module "qat_hosted_pacs_app_grp":
  45:   instances          = module.qat_hosted_pacs_compute_engines.vm_name
    |----------------
    | module.qat_hosted_pacs_compute_engines is object with 2 attributes

This object does not have an attribute named "vm_name".

terraform tf vars file

compute_engine_instances ={
    "test-adi"={

    instance_name = "test-vm"
    machine_type  = "n1-standard-1"
    zone           = "us-east4-b"
    tags   = ["foo","bar"]
    image_name    = "gold-centos-7"
    image_project = "dev-cietools"
    labels = {
  app_id      = "56"
  cost_center = "156"
  owner       = "ops"
  email       = "ops"
}}
    "test-adi-2"={

    instance_name = "test-vm-2"
    machine_type  = "n1-standard-1"
    zone           = "us-east4-b"
    tags   = ["foo","bar"]
    image_name    = "centos-7"
    image_project = "dev-cietools"
    labels = {
  app_id      = "56"
  cost_center = "856"
  owner       = "ops"
  email       = "ops"
}
}
}
subnetwork = "sandbox-us-east4"
project_id = "cloudops-dev01-sb"


instance_group = {
  "igm" = {
    group_manager_name = "test"
    zone = "us-east4-b"
  }
}

Solution

  • Since you used for_each in your google_compute_instance_group module, you have to use key to refer to individual instances of the module, e.g.

     instances          = module.qat_hosted_pacs_compute_engines["test-adi"].vm_name
    

    or if you want to pass all vm_name created for all values of for_each, you can do:

    instances          = values(module.qat_hosted_pacs_compute_engines)[*].vm_name