Terraform:如何合并三个列表以构建映射列表
问题:Terraform展平列表组合时未得到预期结果
原代码尝试将告警名称、对应阈值与每个SQS队列进行组合,但输出不符合预期:
locals { alarms = { names = ["NumberOfMessagesReceived", "NumberOfMessagesDeleted", "ApprNumberOfMessagesDelayed", "NumberOfMessagesSent", "NumberOfEmptyReceives", "ApprNumberOfMessagesNotVisible"], thresholds = ["1000", "50", "100", "100", "100", "50"] } sqs_queues = { queues = ["default", "general"] } alarms2 = flatten([ for name, threshold in local.alarms : [ for sqs_queue in local.sqs_queues : { alarm_name = name threshold_value = threshold sqs_queue_name = sqs_queue } ] ]) }
预期输出要求每个告警名称与对应阈值绑定,再分别和每个SQS队列组合,示例:
alarm_name = "NumberOfMessagesReceived" threshold_value = "1000" sqs_queue_name = "default" alarm_name = "NumberOfMessagesReceived" threshold_value = "1000" sqs_queue_name = "general"
问题原因
原代码错误地遍历了local.alarms这个map的键值对,此时name会取到"names"和"thresholds"两个字符串,threshold则是对应的整个列表,无法实现名称与阈值的一一配对。
修正后的代码
需要先将names和thresholds按索引配对成告警条目,再将每个条目与所有SQS队列组合:
locals { alarms = { names = ["NumberOfMessagesReceived", "NumberOfMessagesDeleted", "ApprNumberOfMessagesDelayed", "NumberOfMessagesSent", "NumberOfEmptyReceives", "ApprNumberOfMessagesNotVisible"], thresholds = ["1000", "50", "100", "100", "100", "50"] } sqs_queues = { queues = ["default", "general"] } # 先将名称和阈值按索引配对成单个告警对象 alarm_entries = [ for idx, name in local.alarms.names : { name = name threshold = local.alarms.thresholds[idx] } ] # 遍历每个告警条目,再绑定每个SQS队列,最后展平结果 alarms2 = flatten([ for entry in local.alarm_entries : [ for queue in local.sqs_queues.queues : { alarm_name = entry.name threshold_value = entry.threshold sqs_queue_name = queue } ] ]) }
验证结果
修正后的local.alarms2会生成预期的结构,每个告警名称+阈值的组合都会分别与"default"和"general"队列关联,完全符合需求。
内容的提问来源于stack exchange,提问作者Rad4
相关产品推荐
相关产品推荐

