Terraform脚本添加条件布尔值时的NSG关联报错问题
解决Terraform中NSG条件创建后的子网关联问题
这个问题我之前也碰到过!核心原因是当你给azurerm_network_security_group设置了count参数后,它就从单个资源变成了资源集合(哪怕count值是0或1),直接引用.id会触发Terraform的语法校验错误;而如果想通过element之类的函数取集合里的资源ID,关联资源本身又没有启用count,Terraform不允许在非迭代资源里引用迭代资源的索引。
下面给你两种可行的解决方案:
方案一:给关联资源添加相同的count条件
让关联资源的创建逻辑和NSG完全绑定,当DeployNSG为true时才创建关联,为false时跳过。这样既符合你的条件控制需求,又能正确引用NSG的ID:
resource "azurerm_subnet_network_security_group_association" "ServersNSGAssociation" { # 和NSG保持一致的count逻辑 count = var.DeployNSG ? 1 : 0 subnet_id = azurerm_subnet.ServersSubnet.id # 因为count=1时,集合里只有一个元素,用索引0直接引用即可 network_security_group_id = azurerm_network_security_group.ProdNSG[0].id }
如果你的Terraform版本是0.12及以上,count可以简化成更直观的写法:
count = var.DeployNSG
(Terraform会自动把布尔值true转为1,false转为0)
方案二:用条件表达式处理NSG ID引用(不推荐)
如果你不想给关联资源加count,可以用条件表达式判断NSG是否存在,不过这种方式有个隐患:当DeployNSG为false时,关联资源会试图引用一个空值,可能导致后续其他逻辑出问题,所以更推荐方案一。示例代码如下:
resource "azurerm_subnet_network_security_group_association" "ServersNSGAssociation" { subnet_id = azurerm_subnet.ServersSubnet.id network_security_group_id = var.DeployNSG ? azurerm_network_security_group.ProdNSG[0].id : "" }
另外建议你把代码里的旧插值语法(${var.xxx})改成Terraform 0.12+的直接引用方式,比如var.ProdNSG代替"${var.ProdNSG}",代码会更简洁易读。
内容的提问来源于stack exchange,提问作者Matty21202
相关产品推荐
相关产品推荐

