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 } } ] ])...) }
修改说明
- 新增
flatten函数将多层嵌套的列表打平,保证merge函数可以正确合并所有规则对象 - 修正了for循环的嵌套逻辑,补全了对象构造的键值对应关系,符合Terraform语法要求
- 修正了源地址的取值逻辑,删除了错误的二次索引调用
- 优化了正则匹配规则,更精准识别CIDR地址和安全组ID,返回的数组格式完全匹配你期望的输出结构
- 生成的键名规则和属性结构和你给出的预期输出完全一致
内容的提问来源于stack exchange,提问作者Abhishek Solanki
相关产品推荐
相关产品推荐

