使用Terraform部署Azure资源时Network Security Rule创建失败排查
问题分析与修复方案
错误原因
你的Terraform配置中,azurerm_network_security_rule资源使用了单数形式的地址前缀参数,而当前AzureRM Provider版本要求使用复数数组形式的参数。Azure API接收请求时,无法将字符串格式的单数参数解析为预期的数组类型,因此返回InvalidRequestFormat错误。
具体来说,配置中的:
source_address_prefix = "*"destination_address_prefix = "*"
这两个参数在新版本AzureRM Provider中已被弃用,API期望接收数组格式的参数值。
修复后的配置
将单数参数替换为复数数组形式,修正后的完整配置如下:
resource "azurerm_resource_group" "example" { name = "example-resource-group" location = "West US" } resource "azurerm_virtual_network" "example" { name = "example-vnet" address_space = ["10.0.0.0/16"] location = azurerm_resource_group.example.location resource_group_name = azurerm_resource_group.example.name } resource "azurerm_subnet" "example" { name = "example-subnet" resource_group_name = azurerm_resource_group.example.name virtual_network_name = azurerm_virtual_network.example.name address_prefixes = ["10.0.1.0/24"] } resource "azurerm_network_security_group" "example" { name = "example-nsg" location = azurerm_resource_group.example.location resource_group_name = azurerm_resource_group.example.name } resource "azurerm_network_security_rule" "example" { name = "example-nsg-rule" priority = 100 direction = "Inbound" access = "Allow" protocol = "Tcp" source_port_range = "*" destination_port_range = "22" # 替换为复数数组形式的参数 source_address_prefixes = ["*"] destination_address_prefixes = ["*"] resource_group_name = azurerm_resource_group.example.name network_security_group_name = azurerm_network_security_group.example.name }
额外检查点
- 确认使用的AzureRM Provider版本:建议使用3.x及以上版本,这类版本对NSG规则的参数格式有明确要求。
- 端口范围参数:如果仅指定单个端口,
source_port_range和destination_port_range使用字符串(如"22")是合法的,无需修改。
内容的提问来源于stack exchange,提问作者Venki
相关产品推荐
相关产品推荐

