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

Terraform用嵌套for循环配置Security Group报for表达式错误如何解决

错误原因

你遇到的Invalid 'for' expression报错是因为第二层{ for port in ports: }对象构造语句缺少键定义,Terraform构造对象时必须指定键 => 值的对应关系,你直接在值的位置嵌套了另一层for对象,不符合语法要求。同时你取值时存在逻辑错误,var.ingress_cidr_tcp[idx_port]已经是当前端口组对应的源地址列表,循环时直接取遍历值即可,不需要再加索引调用。

修正后的配置

你只需要修改locals块即可,变量定义不需要调整:

locals {
  my_rules = merge(flatten([
    for idx_port, port_group in var.ingress_ports_tcp : [
      for port in port_group : {
        for idx_cidr, source_addr in var.ingress_cidr_tcp[idx_port] :
        "${idx_port}-${port}-${idx_cidr}" => {
          port              = port
          cidrs             = length(regexall("^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+/[0-9]+$", source_addr)) > 0 ? [source_addr] : null
          security_group_id = length(regexall("^sg-.+", source_addr)) > 0 ? [source_addr] : null
        }
      }
    ]
  ])...)
}

修改说明

  1. 新增flatten函数将多层嵌套的列表打平,保证merge函数可以正确合并所有规则对象
  2. 修正了for循环的嵌套逻辑,补全了对象构造的键值对应关系,符合Terraform语法要求
  3. 修正了源地址的取值逻辑,删除了错误的二次索引调用
  4. 优化了正则匹配规则,更精准识别CIDR地址和安全组ID,返回的数组格式完全匹配你期望的输出结构
  5. 生成的键名规则和属性结构和你给出的预期输出完全一致

内容的提问来源于stack exchange,提问作者Abhishek Solanki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:48:03