在 Azure Cosmos DB 账户中使用 for_each 创建虚拟网络规则

37次阅读
没有评论

问题描述

希望在 Azure Cosmos DB 账户中创建一组子网规则(subnet rules)。尝试使用动态块和 for_each 在资源上进行配置,但每次都遇到相同的错误。用户想知道自己是否走错了方向。

以下是用户的当前尝试配置:

resource "azurerm_cosmosdb_account" "db" {
  name                = local.name
  location            = var.location
  resource_group_name = var.resource_group_name
  offer_type          = "Standard" #(Required) 指定此 CosmosDB 账户使用的套餐类型 - 目前只能设置为 Standard。
  enable_free_tier    = var.enable_free_tier
  kind                = var.kind

  identity {
    type = "SystemAssigned"
  }

  ip_range_filter = join(",", local.network_rules.ip_rules)

  dynamic "virtual_network_rule" {
    for_each = var.virtual_network_subnet_ids
    content {
      id = each.value
    }
  }
}

用户目前遇到的错误如下:

Error: each.value cannot be used in this context
│
│   on .terraform/modules/azurerm_cosmosdb_account/azurerm_cosmosdb_account/main.tf line 27, in resource "azurerm_cosmosdb_account" "db":
│   27:       id = each.value
│
│ A reference to "each.value" has been used in a context in which it
│ unavailable, such as when the configuration no longer contains the value in
│ its "for_each" expression. Remove this reference to each.value in your
│ configuration to work around this error.

解决方案

请注意以下操作可能涉及版本差异及风险,做好相关备份。

使用正确的迭代器参数

在 Terraform 中,动态块使用的不是 each 关键字,而是 iterator 参数的值。如果省略该参数,它将使用动态块的名称作为默认值。正如文档所述:

iterator 参数(可选)设置一个临时变量的名称,该变量表示复杂值的当前元素。如果省略,则变量的名称默认为 dynamic 块的标签。

在你的情况下,将 each.value 替换为 virtual_network_rule.value,这样你的配置会变成这样:

dynamic "virtual_network_rule" {
  for_each = var.virtual_network_subnet_ids
  content {
    id = virtual_network_rule.value
  }
}

如果你想要使用 iterator 参数,它会类似这样:

dynamic "virtual_network_rule" {
  for_each = var.virtual_network_subnet_ids
  iterator = "rule"
  content {
    id = rule.value
  }
}

最佳实践建议

使用 Terraform 动态块时,确保在使用 for_each 参数时,正确指定迭代器参数。迭代器参数通常是动态块名称后加上 .value。这将确保你的配置在 Terraform 中正确工作。

在更新配置之前,务必备份现有配置,以防出现意外问题。

总结

通过为 Azure Cosmos DB 账户配置虚拟网络规则时,要正确使用动态块和迭代器参数。确保将 each.value 替换为适当的迭代器参数,如 virtual_network_rule.value。备份配置并确保在更新配置之前了解所使用 Terraform 版本的差异和潜在风险。

参考链接

正文完