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

如何用Terraform读取多目录YAML创建AWS安全组规则?(执行无变更)

问题分析与解决方案

核心问题

你的Terraform配置未正确读取到YAML文件内容,导致没有生成预期的安全组规则,主要原因有两点:

1. 初始fileset路径匹配错误

你使用的fileset("${path.module}/env/prod/external/*/", "values.yaml")模式无法正确匹配目标文件。fileset的第一个参数是根目录,第二个参数是相对于根目录的匹配模式,正确的模式应该是"*/values.yaml"来匹配子目录下的values.yaml文件。

2. Locals配置中的字段错误

你的YAML文件中不存在principalMappings字段,直接循环该字段会得到空集合,最终导致local.security_group_rules为空,模块没有输入数据。


修正方案

方案一:使用Locals统一解析YAML(推荐)

先通过Locals读取并解析所有YAML文件,避免重复解析,同时确保数据正确:

locals.tf

locals {
  # 遍历external下的所有子目录,读取每个目录的values.yaml并解析
  security_group_rules = {
    for dir_name in fileset("${path.module}/env/prod/external", "*") :
    dir_name => yamldecode(file("${path.module}/env/prod/external/${dir_name}/values.yaml"))
  }
}

模块调用(aws_security_group_rules.tf)

module "security_group_rules" {
  source              = "../kem-infra-modules/iam-security-group-rules"
  # 遍历解析后的规则集合,用目录名作为唯一键
  for_each            = local.security_group_rules

  security_group_id   = module.security_group.security_group_id
  from_port           = each.value.fromPort
  description         = each.value.definition
  protocol            = upper(each.value.protocol)
  to_port             = each.value.toPort
  type                = each.value.type
  cidr_blocks         = each.value.sourceIpCidrs
}

方案二:直接修正fileset与模块调用

如果不想用Locals,直接调整fileset模式并优化YAML解析逻辑:

module "security_group_rules" {
  source              = "../kem-infra-modules/iam-security-group-rules"
  # 正确匹配所有子目录下的values.yaml
  for_each            = fileset("${path.module}/env/prod/external", "*/values.yaml")

  security_group_id   = module.security_group.security_group_id

  # 一次性解析文件内容,避免重复调用yamldecode和file
  rule_config         = yamldecode(file("${path.module}/env/prod/external/${each.value}"))
  from_port           = rule_config.fromPort
  description         = rule_config.definition
  protocol            = upper(rule_config.protocol)
  to_port             = rule_config.toPort
  type                = rule_config.type
  cidr_blocks         = rule_config.sourceIpCidrs
}

验证步骤

  1. 运行terraform console,执行以下命令确认文件匹配结果:

    fileset("${path.module}/env/prod/external", "*/values.yaml")
    

    预期输出应为包含IXCC/values.yaml和IXCB/values.yaml的集合。

  2. 若使用方案一,执行以下命令确认解析后的规则数据:

    local.security_group_rules
    

    预期输出应为包含两个目录规则的map,每个键对应YAML解析后的键值对。

  3. 最后运行terraform plan,确认会生成2条安全组规则。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:20:07