问题描述
希望在 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 版本的差异和潜在风险。
参考链接
正文完