如何基于AWS CloudWatch按Lambda及客户端公网IP统计调用量?
基于AWS原生功能按客户端IP统计Lambda调用次数的方案
方案1:CloudWatch Logs Insights 构建可视化报表
- 直接复用现有CloudWatch日志组,通过Logs Insights编写查询语句,提取Lambda名称、客户端IP并统计调用次数。
- 查询示例(假设客户端IP在日志的
requestContext.identity.sourceIp字段中):
fields @timestamp, event.requestContext.identity.sourceIp as client_ip, @logStream as lambda_name | filter @message contains 'requestContext' | stats count(*) as call_count by client_ip, lambda_name | sort call_count desc
- 执行查询后,可直接查看表格形式的统计结果,也能将该查询添加到CloudWatch仪表盘中作为自定义小部件,满足按Lambda和IP分组统计的需求。
- 优势:无需额外开发,操作成本低,直接利用现有日志数据。
方案2:自定义指标结合维度(时序图表需求)
- 如果需要时序图表展示调用趋势,可在Lambda代码中主动上报带维度的自定义指标到CloudWatch:
- 修改Lambda代码,提取客户端IP和当前Lambda名称作为维度,调用CloudWatch的
PutMetricData接口上报调用次数。 - Python代码示例:
- 修改Lambda代码,提取客户端IP和当前Lambda名称作为维度,调用CloudWatch的
import boto3 import os cloudwatch = boto3.client('cloudwatch') def handler(event, context): # 提取客户端IP client_ip = event['requestContext']['identity']['sourceIp'] # 获取当前Lambda函数名称 lambda_name = os.environ['AWS_LAMBDA_FUNCTION_NAME'] # 上报自定义指标 cloudwatch.put_metric_data( Namespace='API_Gateway_Lambda_Calls', MetricData=[ { 'MetricName': 'CallCount', 'Dimensions': [ {'Name': 'ClientIP', 'Value': client_ip}, {'Name': 'LambdaFunction', 'Value': lambda_name} ], 'Value': 1, 'Unit': 'Count' } ] ) # 原有业务逻辑 # logger.info(str(event)) return { 'statusCode': 200, 'body': 'Success' }
- 上报完成后,在CloudWatch中创建时序图表时,可按
LambdaFunction和ClientIP维度拆分数据,展示每个IP对不同Lambda的调用次数趋势。 - 注意:CloudWatch对维度数量有上限,若客户端IP量级极大(超过千级),建议优先使用Logs Insights方案。
方案3:API Gateway访问日志(更轻量化的数据源)
- 开启API Gateway的访问日志功能,直接将请求日志输出到CloudWatch日志组,日志中默认包含客户端IP、请求资源路径(对应Lambda绑定的API资源)等信息,无需在Lambda中额外记录请求event。
- 配置访问日志时,可自定义格式确保包含
$context.identity.sourceIp(客户端IP)和$context.resourcePath(API资源路径)字段。 - 后续同样通过CloudWatch Logs Insights查询统计,相比Lambda日志,访问日志更轻量化,不依赖Lambda的日志输出逻辑。
内容的提问来源于stack exchange,提问作者user2913139
相关产品推荐
相关产品推荐

