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

Terraform for_each遍历map内嵌list配置前缀列表报错排查

问题原因

触发Inappropriate value for attribute "cidr": string required.报错的核心原因有两个:

  1. dynamic "entry"块当前直接遍历用户map,entry.value.allowlist是CIDR组成的列表类型,但cidr属性要求传入单个字符串值,类型不匹配
  2. 原配置的过滤逻辑v.allowlist != ""存在逻辑错误:allowlist本身是列表类型,和空字符串做比较属于无效判断,无法正确过滤掉没有配置白名单的用户
实现方案

核心思路是先把嵌套的用户配置打平,把每个用户allowlist下的单个CIDR拆成独立条目,每条条目绑定对应所属用户的description,再将打平后的集合传入动态块遍历即可。

  1. 首先定义打平条目的局部值:
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
  ])
}
  1. 修改前缀列表资源配置,将动态块的遍历对象替换为打平后的条目集合:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 09:16:10