Amit
Amit

Reputation: 1672

Error - Missing resource instance key : Because google_compute_instance has "count" set, its attributes must be accessed on specific instances

I am trying to pass mat_ip of google compute instances created in module "microservice-instance" to another module "database". Since I am creating more than one instance, I am getting following error for output variable in module "microservice-instance".

Error: Missing resource instance key

  on modules/microservice-instance/ms-outputs.tf line 3, in output "nat_ip":    3:   value = google_compute_instance.apps.network_interface[*].access_config[0].nat_ip

Because google_compute_instance.apps has "count" set, its attributes must be accessed on specific instances.

For example, to correlate with indices of a referring resource, use:
    google_compute_instance.apps[count.index]

I have looked at following and using the same way of accessing attribute but its not working. Here is code - main.tf

provider "google" {
  credentials = "${file("../../service-account.json")}"
  project = var.project
  region =var.region

  
}

# Include modules
module "microservice-instance" {
  count = var.appserver_count
  source = "./modules/microservice-instance"
  appserver_count = var.appserver_count
}
module "database" {
  count  = var.no_of_db_instances
  source = "./modules/database"
  nat_ip = module.microservice-instance.nat_ip
  no_of_db_instances = var.no_of_db_instances
}

./modules/microservice-instance/microservice-instance.tf

resource "google_compute_instance" "apps" {
  count        = var.appserver_count
  name         = "apps-${count.index + 1}"
  # name         = "apps-${random_id.app_name_suffix.hex}"
  machine_type = "f1-micro"

  boot_disk {
    initialize_params {
      image = "ubuntu-os-cloud/ubuntu-1804-lts"
    }
  }

  network_interface {
    network = "default"

    access_config {
      // Ephemeral IP
    }
  }
}

./modules/microservice-instance/ms-outputs.tf

output "nat_ip" {
  value = google_compute_instance.apps.network_interface[*].access_config[0].nat_ip
}

./modules/database/database.tf

resource "random_id" "db_name_suffix" {
  byte_length = 4
}

resource "google_sql_database_instance" "postgres" {
  name             = "postgres-instance-${random_id.db_name_suffix.hex}"
  database_version = "POSTGRES_11"
  settings {
    tier = "db-f1-micro"

    ip_configuration {

      dynamic "authorized_networks" {
        for_each = var.nat_ip
        # iterator = ip

        content {
          # value = ni.0.access_config.0.nat_ip
          value = each.key
        }
      }

    }
  }
}

Upvotes: 3

Views: 1576

Answers (1)

Marcin
Marcin

Reputation: 238995

You are creating var.appserver_count number of google_compute_instance.apps resources. So you will have:

google_compute_instance.apps[0]
google_compute_instance.apps[1]
...
google_compute_instance.apps[var.appserver_count - 1]

Therefore, in your output, instead of:

output "nat_ip" {
  value = google_compute_instance.apps.network_interface[*].access_config[0].nat_ip
}

you have to reference individual apps resources or all of them using [*], for example:

output "nat_ip" {
  value = google_compute_instance.apps[*].network_interface[*].access_config[0].nat_ip
}

Upvotes: 4

Related Questions