Terraform for_each遍历map内嵌list配置前缀列表报错排查
问题原因
触发Inappropriate value for attribute "cidr": string required.报错的核心原因有两个:
dynamic "entry"块当前直接遍历用户map,entry.value.allowlist是CIDR组成的列表类型,但cidr属性要求传入单个字符串值,类型不匹配- 原配置的过滤逻辑
v.allowlist != ""存在逻辑错误:allowlist本身是列表类型,和空字符串做比较属于无效判断,无法正确过滤掉没有配置白名单的用户
实现方案
核心思路是先把嵌套的用户配置打平,把每个用户allowlist下的单个CIDR拆成独立条目,每条条目绑定对应所属用户的description,再将打平后的集合传入动态块遍历即可。
- 首先定义打平条目的局部值:
locals { prefix_list_entries = flatten([ for user_key, user_val in var.users : [ for cidr in user_val.allowlist : { cidr = cidr description = user_val.description } ] if length(user_val.allowlist) > 0 ]) }
- 修改前缀列表资源配置,将动态块的遍历对象替换为打平后的条目集合:
resource "aws_ec2_managed_prefix_list" "sftp" { count = local.prefix_list_enabled ? 1 : 0 name = "User Whitelist" address_family = "IPv4" max_entries = 10 # 可根据实际条目总数调整,确保大于等于打平后的条目数量 dynamic "entry" { for_each = local.prefix_list_entries content { cidr = entry.value.cidr description = entry.value.description } } }
效果说明
- 基于你给出的示例变量,最终会生成3条前缀列表条目:
200.0.0.1/32、200.0.0.5/32、200.0.0.10/32,第1条关联user1的description,后2条关联user2的description - 过滤逻辑自动跳过
allowlist为空列表的用户,不会生成无效配置 - 所有传入
cidr字段的值都是单个字符串,完全符合资源参数的类型要求,不会再触发类型报错
内容的提问来源于stack exchange,提问作者Lloyd
相关产品推荐
相关产品推荐

