Terraform如何通过for循环生成包含两类告警配置的map?
正确实现方案
你原来的写法不符合Terraform for表达式的语法规则:单次for迭代默认只能返回一组键值对,要实现为每个function生成两类告警的需求,需要结合merge函数和列表展开运算符将每次迭代生成的多组键值对合并为最终的大map。
修改后的locals块代码:
locals { alarms_with_math_expression = merge([ for function in var.functions : { "aws_lambda_fn_error-${function}" = { alarm_description = "Error rate has exceeded 60%" evaluation_periods = "2" threshold = "60" metric_query_id = "Lambda" metric_to_compare_name = "Errors" metric_to_compare_namespace = "AWS/Lambda" } "aws_lambda_log_process_error-${function}" = { alarm_description = "Processing error rate has exceeded 40%" evaluation_periods = "1" threshold = "40" metric_query_id = "LogProcessing" metric_to_compare_name = "LogProcessErrorCount" metric_to_compare_namespace = "TestLambda" } } ]...) }
以上代码兼容Terraform 0.12及以上所有主流版本。
实现逻辑说明:
- 内层for循环遍历
var.functions列表,每个元素会生成一个包含2个告警配置的子map,最终输出一个子map组成的列表 merge函数配合...展开运算符,会把列表中所有子map的键值对合并为一个完整的大map,最终结构完全符合你预期的4个键值对格式
你后续的resource块使用逻辑不需要修改,prod环境下会自动遍历所有4个告警配置批量创建资源,非prod环境不会生成任何告警资源。
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

