Terraform多条件配置问题:按需创建CloudWatch告警及可选维度
问题修正方案
核心问题分析
你的Terraform配置存在两个关键问题:
- count参数逻辑错误:当前三元表达式仅返回
1或0,无法根据dynamodb_table_list的长度生成对应数量的告警资源; - 维度判断逻辑错误:直接将列表与字符串比较,且返回值
1/0不符合维度值要求,无法实现仅当指定索引名称存在时添加维度的需求。
步骤1:修正count参数,生成对应数量的资源
将count参数改为根据列表长度动态生成资源数量,仅在环境匹配且列表非空时创建对应数量的告警:
count = length(var.environment_vars["cloudwatch"]["dynamodb_table_list"]) > 0 && var.aws_environment == "environment" ? length(var.environment_vars["cloudwatch"]["dynamodb_table_list"]) : 0
步骤2:调整变量结构并实现条件维度添加
首先调整dynamodb_table_secondary_index变量,使其与dynamodb_table_list一一对应(无索引的表设为null):
environment_vars = { cloudwatch = { dynamodb_table_list = [ "x","y","z" ] dynamodb_table_eval_periods = [ "1","2","3" ] dynamodb_table_threshold = [ "100","100","200" ] # 与table_list索引对应,无索引则设为null dynamodb_table_secondary_index = [ "global_secondary_index_name", null, null ] } }
然后在资源中使用merge函数条件构造dimensions,仅当对应表的索引名称不为null时添加GlobalSecondaryIndexName维度:
resource "aws_cloudwatch_metric_alarm" "dynamodb_units" { count = length(var.environment_vars["cloudwatch"]["dynamodb_table_list"]) > 0 && var.aws_environment == "environment" ? length(var.environment_vars["cloudwatch"]["dynamodb_table_list"]) : 0 alarm_name = "DynamoDB read capacity thoughput on ${var.environment_vars["cloudwatch"]["dynamodb_table_list"][count.index]} table is exceeding threshold" comparison_operator = "GreaterThanOrEqualToThreshold" evaluation_periods = var.environment_vars["cloudwatch"]["dynamodb_table_eval_periods"][count.index] metric_name = "ConsumedReadCapacityUnits" namespace = "AWS/DynamoDB" period = 60 # 建议用数字类型而非字符串 statistic = "Sum" threshold = var.environment_vars["cloudwatch"]["dynamodb_table_threshold"][count.index] alarm_description = "The number of read capacity units consumed over the specified time period" insufficient_data_actions = [] treat_missing_data = "notBreaching" alarm_actions = [] ok_actions = [] dimensions = merge( { TableName = var.environment_vars["cloudwatch"]["dynamodb_table_list"][count.index] }, # 仅当索引名称不为null时添加该维度 var.environment_vars["cloudwatch"]["dynamodb_table_secondary_index"][count.index] != null ? { GlobalSecondaryIndexName = var.environment_vars["cloudwatch"]["dynamodb_table_secondary_index"][count.index] } : {} ) }
额外优化点
- 将
period参数从字符串"60"改为数字60,符合Terraform对该参数的类型要求; - 使用插值语法
${}简化alarm_name的拼接,比join更直观。
内容的提问来源于stack exchange,提问作者DisplayName
相关产品推荐
相关产品推荐

