Terraform v0.14.3动态赋值cidr_blocks失败问题咨询
解决Terraform 0.14.3中AWS安全组Ingress规则动态赋值CIDR块的报错问题
你遇到的这个Invalid operand错误,根源是Terraform 0.14版本对表达式解析的校验比0.12更严格了。让我们先拆解问题原因,再给出两种可靠的解决办法:
错误原因分析
你写的aws_eip.lb.public_ip/32被Terraform当成了算术除法运算——它试图把IP地址这个字符串当作数字来除以32,自然会报错说“需要数字类型的左操作数”。虽然0.12版本的宽松规则可能自动把这种写法识别成字符串拼接,但0.14收紧了语法要求,必须明确告诉Terraform这是字符串操作。
正确的实现方式
方法1:使用字符串插值语法(兼容0.12+)
这种写法和你最初的思路一致,只要确保变量被正确包裹在字符串插值标记里即可:
resource "aws_security_group" "allow_tls" { name = "saurabh_security_group" ingress { description = "TLS from VPC" from_port = 443 to_port = 443 protocol = "tcp" # 用${}包裹变量,明确执行字符串拼接 cidr_blocks = ["${aws_eip.lb.public_ip}/32"] } tags = { Name = "allow_tls" } }
方法2:使用format函数(更推荐,可读性更强)
用Terraform内置的format函数生成合法的CIDR字符串,这种写法更清晰,也更符合现代Terraform的最佳实践:
resource "aws_security_group" "allow_tls" { name = "saurabh_security_group" ingress { description = "TLS from VPC" from_port = 443 to_port = 443 protocol = "tcp" # 通过format函数格式化出正确的CIDR格式 cidr_blocks = [format("%s/32", aws_eip.lb.public_ip)] } tags = { Name = "allow_tls" } }
这两种写法都能正确把EIP的公网IP和/32拼接成合法的CIDR地址,让Terraform正常生成安全组规则。
内容的提问来源于stack exchange,提问作者Saurabh Chaturvedi
相关产品推荐
相关产品推荐

