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

Terraform嵌套count/dynamic创建aws_security_group_rule报错如何解决

Terraform AWS安全组规则配置错误修正方案

错误原因

  • aws_security_group_rule 资源没有名为sg的支持块,自定义动态块名不符合Terraform资源规范,直接触发不支持块类型报错
  • from_port、to_port属于aws_security_group_rule的根级别必填参数,写入自定义动态块内会导致Terraform无法识别到资源必填配置
  • 原计数判断逻辑中,列表类型的ingress_cidr_tcp与空字符串对比无实际意义,存在逻辑隐患

修正后代码

保持你原有变量定义不变的前提下,我们先通过local处理端口与CIDR的配对关系,再生成安全组规则:

# 原有变量定义保持不变即可
variable "ingress_ports_tcp" {
  type    = list(list(number))
  default = [[22], [443, 80]]
}

variable "ingress_cidr_tcp" {
  type    = list(list(string))
  default = [["1", "2", "3"], ["4", "5"]]
}

# 结构预处理+资源定义
locals {
  # 先校验端口列表和CIDR列表长度一致,避免索引越界
  ingress_tcp_pairs = length(var.ingress_ports_tcp) == length(var.ingress_cidr_tcp) ? [
    for idx in range(length(var.ingress_ports_tcp)) : {
      ports = var.ingress_ports_tcp[idx]
      cidrs = var.ingress_cidr_tcp[idx]
    }
  ] : []

  # 展平为单端口对应对应CIDR组的结构,方便生成独立规则
  flattened_tcp_rules = flatten([
    for pair in local.ingress_tcp_pairs : [
      for port in pair.ports : {
        port  = port
        cidrs = pair.cidrs
      }
    ]
  ])
}

resource "aws_security_group_rule" "tcp_ingress" {
  for_each          = { for k, v in local.flattened_tcp_rules : "${v.port}-${k}" => v }
  type              = "ingress"
  protocol          = "tcp"
  from_port         = each.value.port
  to_port           = each.value.port
  cidr_blocks       = each.value.cidrs
  security_group_id = aws_security_group.default-sg[0].id
}

注意:示例中的CIDR值为占位符,实际使用请替换为符合规范的CIDR地址段,比如192.168.0.0/24。

效果说明

生成的3条安全组规则完全符合需求:

  • 22端口允许来源CIDR 1、2、3访问
  • 80端口允许来源CIDR4、5访问
  • 443端口允许来源CIDR4、5访问

内容的提问来源于stack exchange,提问作者Maya Ray

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 01:30:02