You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 15:54:36