Azure/vnet/azurerm Terraform模块子网委托块的正确语法及报错解决咨询
如何正确使用Azure/vnet/azurerm Terraform模块配置子网委托?
问题描述
我尝试使用Azure/vnet/azurerm Terraform模块部署Azure虚拟网络,编写了如下代码:
module "vnet" { source = "Azure/vnet/azurerm" resource_group_name = "my-resources" address_space = ["10.0.0.0/16"] subnet_prefixes = ["10.0.1.0/24", "10.0.2.0/24"] subnet_names = ["subnet1", "subnet2"] subnet_delegation = { subnet2 = { name = "Microsoft.DBforPostgreSQL/flexibleServers" actions = "Microsoft.Network/virtualNetworks/subnets/join/action" } } }
执行terraform plan时出现以下错误:
Error: Invalid function argument │ │ on .terraform/modules/vnet/main.tf line 30, in resource "azurerm_subnet" "subnet": │ 30: name = lookup(delegation.value, "service_name") │ ├──────────────── │ │ delegation.value is "Microsoft.Network/virtualNetworks/subnets/join/action" │ │ Invalid value for "inputMap" parameter: lookup() requires a map as the first argument. Error: Invalid function argument │ │ on .terraform/modules/vnet/main.tf line 30, in resource "azurerm_subnet" "subnet": │ 30: name = lookup(delegation.value, "service_name") │ ├──────────────── │ │ delegation.value is "Microsoft.DBforPostgreSQL/flexibleServers" │ │ Invalid value for "inputMap" parameter: lookup() requires a map as the first argument.
请问正确的subnet_delegation语法应该是什么样的?
解决方案
我之前也踩过这个坑,错误的核心是你的subnet_delegation结构不符合模块的预期配置规则,模块要求每个子网的委托配置是包含map元素的列表,同时还有两个细节需要调整:
- 使用
service_name而非name作为委托服务名称的键(模块代码中通过lookup(delegation.value, "service_name")来读取这个值) actions必须是字符串列表类型,不能是单个字符串
修正后的代码如下:
module "vnet" { source = "Azure/vnet/azurerm" resource_group_name = "my-resources" address_space = ["10.0.0.0/16"] subnet_prefixes = ["10.0.1.0/24", "10.0.2.0/24"] subnet_names = ["subnet1", "subnet2"] subnet_delegation = { subnet2 = [ { service_name = "Microsoft.DBforPostgreSQL/flexibleServers" actions = ["Microsoft.Network/virtualNetworks/subnets/join/action"] } ] } }
关键说明:
- 每个子网的委托规则被包裹在列表中:这是因为模块支持为单个子网配置多个不同的委托规则,即使你只需要一个,也需要用列表包裹。
service_name字段:模块内部通过这个键名来读取委托的服务名称,所以必须替换你原来的name。actions为列表类型:这既符合Azure Terraform Provider对子网委托的要求,也匹配模块的变量定义。
修改后重新执行terraform plan,应该就能正常通过了。
内容的提问来源于stack exchange,提问作者Elies
相关产品推荐
相关产品推荐

