Terraform构造列表时筛选Azure区域以提取主区域的实现问询
实现逻辑
你可以用Terraform内置的reduce函数实现带状态的遍历筛选:按输入列表顺序逐个检查区域,只要当前区域的配对没有被提前标记为排除,就将它加入主区域列表,同时把它的配对区域加入排除集合,后续遇到配对区域时直接跳过。
完整代码实现
locals { # 原有区域配对映射,按需补充所有用到的区域即可 pairs = { # 欧洲区域 northeurope = "westeurope" westeurope = "northeurope" # 英国区域 uksouth = "ukwest" ukwest = "uksouth" } # 迭代筛选逻辑 primary_calc = reduce( # 初始状态:保存已选中的主区域列表、已排除的配对区域集合 { primaries = [], excluded = [] }, var.locations, (prev, curr) => { if !contains(prev.excluded, curr) then { primaries = concat(prev.primaries, [curr]) excluded = concat(prev.excluded, [local.pairs[curr]]) } else prev } ) # 最终输出的主区域列表 primaries = local.primary_calc.primaries }
效果验证
该实现完全覆盖你给出的所有测试场景:
- 输入
["westeurope"],输出["westeurope"] - 输入
["northeurope", "westeurope"],输出["northeurope"] - 输入
["westeurope", "uksouth", "northeurope"],输出["westeurope", "uksouth"] - 其余场景均符合预期规则
兼容优化(可选)
如果存在没有配置配对的区域,可以把local.pairs[curr]替换为lookup(local.pairs, curr, "${curr}_non_exist_pair"),避免取值报错,未配对的区域会直接作为主区域保留。
内容的提问来源于stack exchange,提问作者Paul Hatcher
相关产品推荐
相关产品推荐

