Terraform创建AWS安全组时提示ingress属性值不合法如何解决
问题根因
你使用的AWS Provider v3.x版本存在特殊校验规则:
- 当
ingress/egress以对象列表的形式直接赋值时,Terraform要求该对象的所有属性必须显式声明,哪怕是空值 - 官方文档中标注的可选属性,仅适用于单独使用
ingress {}/egress {}嵌套块的写法,两种写法的校验逻辑不同
解决方案
方案1:保留现有列表写法,补全所有缺失属性
你只需要在每个ingress、egress的对象中,给报错提示的缺失字段赋值为空即可:
resource "aws_security_group" "sg_oregon" { name = "tf-sg" description = "Allow web traffics" vpc_id = aws_vpc.vpc_terraform.id ingress = [ { description = "HTTP" from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] ipv6_cidr_blocks = [] prefix_list_ids = [] security_groups = [] self = false }, { description = "HTTPS" from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] ipv6_cidr_blocks = [] prefix_list_ids = [] security_groups = [] self = false }, { description = "SSH" from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] ipv6_cidr_blocks = [] prefix_list_ids = [] security_groups = [] self = false } ] egress = [ { description = "for all outgoing traffics" from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] ipv6_cidr_blocks = ["::/0"] prefix_list_ids = [] security_groups = [] self = false } ] tags = { Name = "sg-for-subnet" } }
方案2:改用官方文档推荐的嵌套块写法
这种写法不需要显式声明空的可选属性,更简洁,后续维护也更方便:
resource "aws_security_group" "sg_oregon" { name = "tf-sg" description = "Allow web traffics" vpc_id = aws_vpc.vpc_terraform.id ingress { description = "HTTP" from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } ingress { description = "HTTPS" from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } ingress { description = "SSH" from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } egress { description = "for all outgoing traffics" from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] ipv6_cidr_blocks = ["::/0"] } tags = { Name = "sg-for-subnet" } }
内容的提问来源于stack exchange,提问作者Abhishek Kumar
相关产品推荐
相关产品推荐

