如何突破CloudWatch限制实现账号级Lambda并发总量监控告警
解决方案
方案1:自定义聚合指标(推荐原生AWS方案)
- 编写一个定时触发的Lambda函数,每隔固定时间(比如1分钟)执行以下操作:
- 调用CloudWatch的
GetMetricDataAPI,批量获取所有Lambda函数的ConcurrentExecutions指标数据 - 在函数内部计算所有指标的总和
- 将计算得到的总和作为自定义指标(比如命名为
TotalLambdaConcurrentExecutions)发布到CloudWatch
- 调用CloudWatch的
- 基于这个自定义指标创建告警,当数值超过900时触发通知
关键代码片段示例
import boto3 import time cloudwatch = boto3.client('cloudwatch') lambda_client = boto3.client('lambda') def lambda_handler(event, context): # 获取所有Lambda函数列表 functions = [] paginator = lambda_client.get_paginator('list_functions') for page in paginator.paginate(): functions.extend([func['FunctionName'] for func in page['Functions']]) # 构造GetMetricData的查询参数 metric_queries = [] for idx, func_name in enumerate(functions): metric_queries.append({ 'Id': f'm{idx}', 'MetricStat': { 'Metric': { 'Namespace': 'AWS/Lambda', 'MetricName': 'ConcurrentExecutions', 'Dimensions': [{'Name': 'FunctionName', 'Value': func_name}] }, 'Period': 60, 'Stat': 'Maximum' }, 'ReturnData': True }) # 批量获取指标数据 response = cloudwatch.get_metric_data( MetricDataQueries=metric_queries, StartTime=time.time() - 60, EndTime=time.time() ) # 计算总和 total_concurrent = 0 for result in response['MetricDataResults']: if result['Values']: total_concurrent += result['Values'][0] # 发布自定义指标 cloudwatch.put_metric_data( Namespace='Custom/Lambda', MetricData=[{ 'MetricName': 'TotalLambdaConcurrentExecutions', 'Value': total_concurrent, 'Unit': 'Count' }] ) return {'total_concurrent': total_concurrent}
- 注意:给这个Lambda函数配置足够的权限(
cloudwatch:GetMetricData、cloudwatch:PutMetricData、lambda:ListFunctions) - 调整定时触发频率(比如1分钟),确保告警数据的时效性
方案2:使用CloudWatch Logs Insights + 指标导出
- 利用CloudWatch Logs Insights查询所有Lambda函数的并发日志数据,聚合计算总和
- 通过CloudWatch Logs Metric Filters将查询结果导出为自定义指标
- 基于该自定义指标创建告警
- 局限性:需要Lambda函数开启详细日志,且日志聚合的延迟可能比API查询高
方案3:分组告警+复合告警(折中方案)
如果不想写自定义代码,可以将Lambda函数分成多个组(每组不超过10个),为每个组创建基于指标数学表达式的告警,再用CloudWatch复合告警聚合所有组的状态——当各组并发总和的累加值接近900时触发通知
- 缺点:需要手动分组,阈值计算相对复杂,精准度不如自定义指标
补充:AWS CloudWatch基于指标数学的告警10个指标的限制是硬限制,上述方案都是通过聚合指标的方式绕过该限制,其中自定义聚合指标的方案最灵活且精准。
内容的提问来源于stack exchange,提问作者Bence
相关产品推荐
相关产品推荐

