Terraform执行plan报cidr_block无效错误,应如何排查解决?
Terraform VPC CIDR无效报错排查方案
报错原文:
Error: expected cidr_block to contain a valid Value, got: with err: invalid CIDR address:
on ..\vpc.tf line 2, in resource "aws_vpc" "main": 2: cidr_block = var.cidr
第一步:排查模块实例化逻辑错误
你当前将VPC、安全组的所有资源都定义在了同一个模块目录下,调用时两次引用同个source = "../"实例化了两次模块:
实例化module "security_group"时仅传入了安全组相关参数,未传入必填的cidr参数,导致该实例下的aws_vpc.main资源的cidr_block取值为空,直接触发上述报错。第二步:修复模块调用逻辑
两种修复方案二选一即可:- 拆分独立模块:将VPC资源、安全组资源分别放在两个独立的模块目录下,比如
./modules/vpc和./modules/security-group,调用时分别引用对应source即可,安全组模块不需要定义VPC资源,直接通过参数传入vpc_id即可。 - 单模块单次实例化:如果确实需要将VPC和安全组绑定在同一个模块,只需实例化一次模块,同时传入所有参数即可,示例:
module "vpc_with_sg" { source = "../" # VPC配置参数 cidr = "10.0.0.0/16" # 安全组配置参数 sg-name = "Test" sg-description = "Test Description" protocol = "tcp" allowed_ip = ["10.10.0.0/20", "10.20.0.0/20"] allowed_ports = [22, 443] }- 拆分独立模块:将VPC资源、安全组资源分别放在两个独立的模块目录下,比如
第三步:补充变量校验避免同类问题
在模块的variables.tf文件中为所有必填变量增加类型声明和校验规则,漏传参数时可以提前抛出清晰的报错提示,示例:
variable "cidr" { type = string description = "VPC网段CIDR" validation { condition = can(cidrnetmask(var.cidr)) error_message = "传入的cidr不是合法的IPv4 CIDR地址。" } }
- 第四步:修复安全组规则隐藏缺陷
你当前定义的入站安全组规则存在逻辑隐患:count = length(var.allowed_ip),但allowed_ports和allowed_ip的长度可能不匹配,当两者数量不一致时会触发索引取值错误。建议改成用setproduct遍历IP和端口的组合,或者调整为按端口数量做count,避免索引不匹配问题。
内容的提问来源于stack exchange,提问作者alphatango165
相关产品推荐
相关产品推荐

