Hello,
In my local variable called instance_groups
, I’m trying to do a lookup of a resource output "resource google_container_node_pool" "this"
I’m passing the output directly as it is which is a map. For some reason is throwing me the below error.
I tried google_container_node_pool.this[each.key].managed_instance_group_urls
as suggested but it doesn’t work since I don’t have a for_each in my nested for loop.
I also tried this group = lookup(google_container_node_pool.this[value.name].managed_instance_group_urls, value.name, null)
but didn’t work.
Does anybody know how to deal with lookup when having two for loops and getting and passing a resource output in a form of map?
Thanks,
Locals:
locals {
instance_groups = flatten([
for key, value in var.node_pools : [
for i, j in value.instance_named_ports : {
zone = value.location
name = j.name
port = j.port
node_pool_name = value.name
group = lookup(google_container_node_pool.this.managed_instance_group_urls, value.name, null)
}
]
])
}
Var file:
variable "node_pools" {
type = map(object({
name = string
cluster_name = string
location = string
node_config = object({
machine_type = string
image_type = string
labels = map(string)
oauth_scopes = list(string)
taint = list(map(string))
tags = list(string)
})
autoscaling = object({
min_node_count = number
max_node_count = number
})
management = object({
auto_repair = bool
auto_upgrade = bool
})
upgrade_settings = object({
max_surge = number
max_unavailable = number
})
instance_named_ports = map(object({
name = string
port = number
}))
}))
}
Resource:
resource "google_container_node_pool" "this" {
for_each = var.node_pools //== null ? {} : var.node_pools
name = each.value.name
location = each.value.location
cluster = each.value.cluster_name != null ? each.value.cluster_name : google_container_cluster.this[0].id
node_config {
machine_type = each.value.node_config.machine_type
image_type = each.value.node_config.image_type
labels = each.value.node_config.labels
oauth_scopes = each.value.node_config.oauth_scopes
tags = each.value.node_config.tags
dynamic "taint" {
iterator = rule
for_each = each.value.node_config.taint
content {
key = rule.value["key"]
value = rule.value["value"]
effect = rule.value["effect"]
}
}
}
autoscaling {
min_node_count = each.value.autoscaling.min_node_count
max_node_count = each.value.autoscaling.max_node_count
}
management {
auto_repair = each.value.management.auto_repair
auto_upgrade = each.value.management.auto_upgrade
}
upgrade_settings {
max_surge = each.value.upgrade_settings.max_surge
max_unavailable = each.value.upgrade_settings.max_unavailable
}
}
Output:
output "managed_instance_group_urls" {
value = {
for url in google_container_node_pool.this:
url.name => flatten(url.*.managed_instance_group_urls)
}
}
Error:
│ Error: Missing resource instance key
│
│ on ../nodepool.tf line 9, in locals:
│ 9: group = lookup(google_container_node_pool.this.managed_instance_group_urls, value.name, null)
│
│ Because google_container_node_pool.this has "for_each" set, its attributes must be accessed on specific instances.
│
│ For example, to correlate with indices of a referring resource, use:
│ google_container_node_pool.this[each.key]```
Example of google_container_node_pool.this.managed_instance_group_urls
Output
managed_instance_group_urls = {
"pool-1" = [
"https://www.googleapis.com/compute/v1/projects/xxxxxxxx/zones/us-central1-a/instanceGroups/gke-xxxxxxx",
]
"pool-2" = [
"https://www.googleapis.com/compute/v1/projects/xxxxxxxx/zones/us-central1-a/instanceGroups/gke-zzzzzz",
]
"pool-3" = [
"https://www.googleapis.com/compute/v1/projects/xxxxxxxx/zones/us-central1-a/instanceGroups/gke-yyyyyy",
]
}
Desired result:
[
{
"group" = [
"https://www.googleapis.com/compute/v1/projects/xxxxxxxx/zones/us-central1-a/instanceGroups/gke-xxxxxxx",
]
"name" = "https"
"node_pool_name" = "pool-1"
"port" = 31313
"zone" = "us-west1"
},
{
"group" = [
"https://www.googleapis.com/compute/v1/projects/xxxxxxxx/zones/us-central1-a/instanceGroups/gke-zzzzzz",
]
"name" = "http"
"node_pool_name" = "pool-2"
"port" = 80
"zone" = "us-west1"
},
{
"group" = [
"https://www.googleapis.com/compute/v1/projects/xxxxxxxx/zones/us-central1-a/instanceGroups/gke-yyyyyy",
]
"name" = "https"
"node_pool_name" = "pool-3"
"port" = 31313
"zone" = "us-west1"
},
]