如何将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函数
- 登录AWS控制台,进入Lambda服务,创建一个新的Python函数(Python是比较直观的选择,其他语言也可以)。
- 替换函数代码为以下示例:
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"
- 配置Lambda的IAM角色:给角色添加以下权限(通过IAM策略编辑器添加即可):
ecs:DescribeServices(允许拉取ECS服务信息)cloudwatch:PutMetricData(允许上报CloudWatch指标)
步骤2:创建CloudWatch Events定时规则
- 进入CloudWatch服务,选择「规则」→「创建规则」。
- 选择「计划的」触发类型,设置定时表达式(比如每5分钟执行一次:
cron(*/5 * * * ? *))。 - 目标选择刚才创建的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服务器或本地机器可运行定时任务,这是最简单的方案:
- 在机器上安装AWS CLI并配置好权限(确保拥有
ecs:DescribeServices和cloudwatch:PutMetricData权限)。 - 创建一个shell脚本(比如
send_desired_count.sh),内容和上面sidecar的脚本类似。 - 添加cron任务,比如每5分钟执行一次:
*/5 * * * * /path/to/send_desired_count.sh
额外提示
- 你可以自定义指标的命名空间和维度,方便后续在CloudWatch中筛选和设置告警。
- 如果需要监控多个ECS服务,只需修改Lambda或脚本中的服务列表,即可批量处理。
内容的提问来源于stack exchange,提问作者Sachin
相关产品推荐
相关产品推荐

