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

如何将ECS服务的DesiredCount作为自定义指标发送至CloudWatch?

如何将ECS服务的DesiredCount发送为CloudWatch自定义指标

Got it, let's break down how to get your ECS service's DesiredCount into CloudWatch as a custom metric. Below are three practical methods you can choose from based on your setup:

方法1:CloudWatch Events + Lambda函数(推荐)

This is the most serverless and low-maintenance approach. Here's how to set it up:

步骤1:创建Lambda函数

  1. 登录AWS控制台,进入Lambda服务,创建一个新的Python函数(Python是比较直观的选择,其他语言也可以)。
  2. 替换函数代码为以下示例:
import boto3

ecs_client = boto3.client('ecs')
cloudwatch_client = boto3.client('cloudwatch')

def lambda_handler(event, context):
    # 替换为你的ECS集群名和服务名
    cluster_name = "your-cluster-name"
    service_names = ["your-service-name"]  # 支持批量处理多个服务
    
    response = ecs_client.describe_services(
        cluster=cluster_name,
        services=service_names
    )
    
    for service in response['services']:
        desired_count = service['desiredCount']
        # 上报自定义指标
        cloudwatch_client.put_metric_data(
            Namespace='ECS/Custom',
            MetricData=[
                {
                    'MetricName': 'DesiredCount',
                    'Dimensions': [
                        {
                            'Name': 'ClusterName',
                            'Value': cluster_name
                        },
                        {
                            'Name': 'ServiceName',
                            'Value': service['serviceName']
                        }
                    ],
                    'Value': desired_count,
                    'Unit': 'Count'
                }
            ]
        )
    return "Metrics sent successfully"
  1. 配置Lambda的IAM角色:给角色添加以下权限(通过IAM策略编辑器添加即可):
    • ecs:DescribeServices(允许拉取ECS服务信息)
    • cloudwatch:PutMetricData(允许上报CloudWatch指标)

步骤2:创建CloudWatch Events定时规则

  1. 进入CloudWatch服务,选择「规则」→「创建规则」。
  2. 选择「计划的」触发类型,设置定时表达式(比如每5分钟执行一次:cron(*/5 * * * ? *))。
  3. 目标选择刚才创建的Lambda函数,完成规则配置。

这样,Lambda会定期拉取DesiredCount并上报到CloudWatch,你可以在CloudWatch的ECS/Custom命名空间下找到这个指标。

方法2:使用ECS任务的Sidecar容器

如果你的ECS任务已经在运行,可以添加一个轻量的sidecar容器来定期上报指标:

  • 创建一个简单的Docker镜像,里面包含AWS CLI和一个shell脚本,脚本内容示例:
#!/bin/bash
CLUSTER_NAME="your-cluster-name"
SERVICE_NAME="your-service-name"

while true; do
    DESIRED_COUNT=$(aws ecs describe-services --cluster $CLUSTER_NAME --services $SERVICE_NAME --query 'services[0].desiredCount' --output text)
    aws cloudwatch put-metric-data --namespace "ECS/Custom" --metric-name "DesiredCount" --dimensions ClusterName=$CLUSTER_NAME,ServiceName=$SERVICE_NAME --value $DESIRED_COUNT --unit Count
    sleep 300  # 每5分钟执行一次
done
  • 在你的ECS任务定义中添加这个sidecar容器,确保任务的IAM角色(或任务执行角色)拥有ecs:DescribeServices和cloudwatch:PutMetricData权限。
  • 注意:如果你的服务有多个任务实例,这个sidecar会重复上报相同指标。可以通过设置分布式锁让仅一个实例运行该逻辑,或者接受重复上报(CloudWatch会自动聚合)。

方法3:使用EC2/本地定时任务(Cron)

如果你有一台EC2服务器或本地机器可运行定时任务,这是最简单的方案:

  1. 在机器上安装AWS CLI并配置好权限(确保拥有ecs:DescribeServices和cloudwatch:PutMetricData权限)。
  2. 创建一个shell脚本(比如send_desired_count.sh),内容和上面sidecar的脚本类似。
  3. 添加cron任务,比如每5分钟执行一次:
*/5 * * * * /path/to/send_desired_count.sh

额外提示

  • 你可以自定义指标的命名空间和维度,方便后续在CloudWatch中筛选和设置告警。
  • 如果需要监控多个ECS服务,只需修改Lambda或脚本中的服务列表,即可批量处理。

内容的提问来源于stack exchange,提问作者Sachin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:02:36