如何移除ECS CloudWatch Dashboard中集群名的[]符号(字符串列表必填)
问题:移除CloudWatch Dashboard中ECS集群名称的[]符号
我正在为ECS创建CloudWatch Dashboard,但由于变量采用字符串列表类型,负载均衡器名称出现了形如[ "mis-app-cluster" ]的[]符号。请问是否有方法可以移除该符号?注:字符串列表为必填项。
配置数据
{ my-dashboard-name = "MIS-Dev-Cloudwatch-Dashboard-ECS" aws-region = "eu-west-1" targets = ["mis-app-cluster"] metrics = ["CPUUtilization", "MemoryUtilization"] service_name = ["mis-fileserver", "mis-nginx", "mis-odi", "mis-oraclebi", "mis-ords", "mis-restdataservices"] aws-namespace = "AWS/ECS" dim = "ClusterName" stat = "Average" period = 300 }
ALB模块代码
locals { widget-def-alb = [for metric in var.metrics : { type = "metric", x = 0, y = 0 width = 18, height = 8, properties = { metrics = [for targetgroup in var.target_groups : [var.aws-namespace, metric,"TargetGroup", targetgroup, var.dim, var.targets]], title = "${var.aws-namespace}: ${metric}", region = var.aws-region, period = var.period, stat = var.stat, view = "timeSeries", legend = { position = "right" } } } ] } resource "aws_cloudwatch_dashboard" "cw-dashboard-alb" { count = var.aws-namespace == "AWS/ApplicationELB" ? 1 : 0 dashboard_name = var.dashboard-name dashboard_body = jsonencode({ start = "-PT9H" widgets = local.widget-def-alb }) }
模块调用代码
module "create-dashboard" { source = "../" for_each = { for service in local.dashboards : service.my-dashboard-name => service if length(regexall(".*ALB.*", service.my-dashboard-name)) > 0 } dashboard-name = each.value.my-dashboard-name aws-region = each.value.aws-region targets = each.value.targets metrics = each.value.metrics aws-namespace = each.value.aws-namespace dim = each.value.dim target_groups = each.value.target_groups stat = each.value.stat period = each.value.period }
当前输出结果
{ "legend": { "position": "right" }, "metrics": [ [ "AWS/ECS", "CPUUtilization", "ServiceName", "mis-fileserver", "ClusterName", [ "mis-app-cluster" ] ], [ ".", "MemoryUtilization", ".", ".", ".", [ "mis-app-cluster" ] ] ], "period": 300, "region": "eu-west-1", "stat": "Average", "title": "mis-fileserver", "view": "timeSeries", "timezone": "UTC" }
解决方案
问题根源在于模块代码中直接将列表类型的var.targets传入了metrics数组,导致序列化为嵌套列表结构。针对你的场景,有两种处理方式:
方法1:提取列表单个元素(适配单元素必填列表)
修改模块中widget-def-alb的metrics定义,将var.targets替换为var.targets[0],直接取列表第一个元素作为字符串传入:
metrics = [for targetgroup in var.target_groups : [var.aws-namespace, metric,"TargetGroup", targetgroup, var.dim, var.targets[0]]],
修改后,输出中的[ "mis-app-cluster" ]会变为"mis-app-cluster",符合CloudWatch指标的格式要求。
方法2:遍历多元素列表(适配未来多集群场景)
如果后续targets可能包含多个集群名称,可以通过嵌套for循环生成对应指标条目,并用flatten展开嵌套数组:
metrics = flatten([for targetgroup in var.target_groups : [for target in var.targets : [var.aws-namespace, metric,"TargetGroup", targetgroup, var.dim, target]] ]),
这种方式会为每个targetgroup和target的组合生成独立的指标条目,同时避免嵌套列表的问题。
内容的提问来源于stack exchange,提问作者DineshS
相关产品推荐
相关产品推荐

