如何输出使用 for_each 创建的资源的多个实例的属性?

How do I output an attribute of multiple instances of a resource created with for_each?

假设我有一张环境地图可以提供给 for_each

environments = {
    "0" = "dev"
    "1" = "test"
    "2" = "stage"
}

然后出于某种原因我想为每个环境创建一个 Azure 资源组。

resource "azurerm_resource_group" "resource_group" {
  for_each = var.environments
  name     = "${var.resource-group-name}-${each.value}-rg"
  location = var.location
}

如何获得输出?我试过新的 splat 没有用。

output "name" {
  value = "${azurerm_resource_group.resource_group[*].name}"
}

output "id" {
  value = "${azurerm_resource_group.resource_group[*].id}"
}

output "location" {
  value = "${azurerm_resource_group.resource_group[*].location}"
}

错误:不支持的属性

in output "id":
   6:   value = "${azurerm_resource_group.resource_group[*].id}"

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

如何输出使用 for_each 创建的资源的多个实例的属性?

编辑: for_each 不适用于输出

output "name"{
  value = { for k, v in var.environments : v => azurerm_resource_group.resource_group[k].name }
}

output "id"{
  value = { for k, v in var.environments : v => azurerm_resource_group.resource_group[k].id }
}

output "location"{
  value = { for k, v in var.environments : v => azurerm_resource_group.resource_group[k].location }
}

示例输出,

id = {
  "dev" = "xxx"
  "stage" = "yyy"
  "test" = "zzz"
}

[*] 是一个 shorthand 用于从对象列表中提取属性。 for_each 使资源显示为对象的 map,因此 [*] 运算符不合适。

但是,for expressions 是一种更通用的机制,可以通过为源集合的每个元素评估任意表达式,将列表或映射转换为另一个列表或映射。

因此我们可以将 azurerm_resource_group 个对象的映射简化为 个这些对象的名称 的映射,如下所示:

output "name" {
  value = { for k, group in azurerm_resource_group.resource_group: k => group.name }
}

您的输入映射使用数字索引作为键,这是不常见但允许的。因此,输出的结果值将是这样的:

{
  "0" = "something-dev-rg"
  "1" = "something-test-rg"
  "2" = "something-stage-rg"
}

for_each 中的映射更常见的是包含一个有意义的名称作为键,以便生成的实例由该有意义的名称标识,而不是通过递增整数标识。如果您将配置更改为使用环境名称作为键,则名称映射将如下所示:

{
  "dev"   = "something-dev-rg"
  "test"  = "something-test-rg"
  "stage" = "something-stage-rg"
}