Terraform v0.14.3动态赋值cidr_blocks至安全组入规则失败求助
解决Terraform v0.14.3中AWS安全组Ingress规则CIDR块动态拼接的错误
这个问题的核心是Terraform从v0.12后期到v0.14版本,对表达式解析的规则变得更严格了,尤其是字符串拼接的处理逻辑。
为什么v0.14.3会报错?
你错误信息里的代码是cidr_blocks = [aws_eip.lb.public_ip/32],这里Terraform会把/当成算术除法运算符,它尝试将aws_eip.lb.public_ip这个字符串类型的IP地址当作数字来做除法,自然就会抛出"需要数字"的错误。
而你尝试的["aws_eip.lb.public_ip/32"]也不行,因为这只是一个普通的字符串字面量,Terraform不会把里面的aws_eip.lb.public_ip识别为资源引用,只会把它当成纯文本。
至于v0.12能正常运行,是因为早期v0.12版本的表达式解析器对这种模糊写法有兼容性处理,会自动把aws_eip.lb.public_ip/32识别为字符串拼接操作,但从v0.13开始,Terraform收紧了语法规则,要求必须明确声明字符串操作。
正确的解决方法
有两种可靠的方式可以实现动态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" cidr_blocks = ["${aws_eip.lb.public_ip}/32"] } tags = { Name = "allow_tls" } }使用
format函数(Terraform推荐方式)
用format函数来格式化字符串,可读性更强,也是新版本Terraform更推荐的写法: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 = [format("%s/32", aws_eip.lb.public_ip)] } tags = { Name = "allow_tls" } }
这两种写法都能在v0.14.3中正常运行,明确告诉Terraform要把IP地址和/32拼接成一个合法的CIDR字符串。
内容的提问来源于stack exchange,提问作者Saurabh Chaturvedi
相关产品推荐
相关产品推荐

