如何用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 }
验证步骤
运行
terraform console,执行以下命令确认文件匹配结果:fileset("${path.module}/env/prod/external", "*/values.yaml")预期输出应为包含
IXCC/values.yaml和IXCB/values.yaml的集合。若使用方案一,执行以下命令确认解析后的规则数据:
local.security_group_rules预期输出应为包含两个目录规则的map,每个键对应YAML解析后的键值对。
最后运行
terraform plan,确认会生成2条安全组规则。
内容的提问来源于stack exchange,提问作者Shafeeq
相关产品推荐
相关产品推荐

