You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 09:57:40