Terraform创建AWS安全组(aws_security_group)时遇ingress必填属性错误的技术咨询
解决Terraform AWS安全组Ingress配置错误
我完全理解你的困惑——明明这些属性看起来根本用不上,却被强制要求填写。这个错误的根源在于你采用了将ingress定义为嵌套对象列表的写法,而Terraform的AWS Provider对这种写法有严格的属性校验规则:哪怕你不需要某些属性,也必须显式指定它们(哪怕是空值)。不过更简单、更符合最佳实践的解决方式是切换到独立ingress块的写法。
问题原因拆解
当你把ingress写成一个对象列表时,Terraform会把它当作单一参数处理,要求每个对象必须完整包含prefix_list_ids、security_groups和self这些属性,不能省略。这和你可能在文档里看到的示例不同,因为官方文档更常用独立ingress块的写法——这种写法允许你只填写需要的属性,不需要的会自动使用默认值(比如self默认是false,空列表属性默认是空数组)。
修复后的配置代码
把你的规则拆分成多个独立的ingress块,这样就不用再填写那些用不到的属性,配置也会更清晰易读:
resource "aws_security_group" "allow_tls_ssh" { name = "allow_tls" description = "Allow TLS, SSH and HTTP inbound traffic" vpc_id = aws_vpc.vpc.id # TLS 访问规则 ingress { description = "TLS from VPC" from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = [aws_vpc.vpc.cidr_block] ipv6_cidr_blocks = [aws_vpc.vpc.ipv6_cidr_block] } # SSH 访问规则(仅用于测试) ingress { description = "SSH from VPC" from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = [aws_vpc.vpc.cidr_block] ipv6_cidr_blocks = [aws_vpc.vpc.ipv6_cidr_block] } # HTTP 访问规则 ingress { description = "HTTP from VPC" from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = [aws_vpc.vpc.cidr_block] ipv6_cidr_blocks = [aws_vpc.vpc.ipv6_cidr_block] } tags = { Name = "allow_tls_ssh" } }
补充说明
关于你看到的aws_vpc.vpc.cidr_block will be known only after apply提示,这是正常现象:因为VPC资源还未创建,它的CIDR块信息要等到terraform apply执行阶段才会生成,Terraform会自动处理这种依赖关系,不会影响配置的执行。
另外虽然你是学习测试,还是啰嗦一句:生产环境绝对不要把SSH端口开放给整个VPC CIDR,测试完成后记得及时执行terraform destroy销毁资源哦。
内容的提问来源于stack exchange,提问作者Jose A. Matarán
相关产品推荐
相关产品推荐

