如何通过boto3(Python SDK)获取Lambda CloudWatch指标日志洞察
问题解决说明
核心认知澄清
MemoryUsedInMB 不是AWS/Lambda命名空间下的原生CloudWatch指标,无法直接通过get-metric-data接口获取。该值是Lambda每次执行结束后,自动写入CloudWatch Logs的REPORT日志行中的字段,对应日志字段为@maxMemoryUsed(单位为字节)。
原有配置的问题修正
你之前编写的get-metric-data配置存在两个问题,会导致查不到Lambda指标数据:
- 缺少必填的维度参数:
AWS/Lambda命名空间下的所有指标,必须至少指定FunctionName维度,值为你要查询的Lambda函数名称;如果需要查询指定版本/别名的指标,需要额外增加Resource维度,值格式为函数名:版本/别名。 - 时间格式错误:接口要求的ISO时间格式后缀为时区标识(如UTC时区用
Z),你之前写的0000后缀不符合格式规范。
修正后可正常查询Lambda原生指标(如你示例中的Invocations)的配置文件如下:
{ "MetricDataQueries": [ { "Id": "myRequest", "MetricStat": { "Metric": { "Namespace": "AWS/Lambda", "MetricName": "Invocations", "Dimensions": [ { "Name": "FunctionName", "Value": "替换为你的目标Lambda函数名" } ] }, "Period": 3600, "Stat": "Sum" }, "Label": "myRequestLabel", "ReturnData": true } ], "StartTime": "2022-05-31T10:40:00Z", "EndTime": "2022-05-31T14:12:00Z" }
对应的执行命令保持不变:
aws cloudwatch get-metric-data --cli-input-json file://test_file.json
获取MemoryUsedInMB的两种方案
方案1:直接通过CloudWatch Logs Insights查询(无需额外配置)
直接调用CloudWatch Logs接口查询日志提取字段即可,无需提前做指标转换。
查询语句示例:
fields @timestamp, @requestId, @maxMemoryUsed/1000/1000 as MemoryUsedInMB, @memorySize/1000/1000 as MemoryAllocatedInMB | filter @type = "REPORT" | sort @timestamp desc | limit 20
对应的CLI执行命令:
aws logs start-query --log-group-name /aws/lambda/替换为你的目标Lambda函数名 --start-time 1653993600 --end-time 1654006320 --query-string 'fields @timestamp, @requestId, @maxMemoryUsed/1000/1000 as MemoryUsedInMB | filter @type = "REPORT" | sort @timestamp desc | limit 20'
执行后拿到查询ID,再调用aws logs get-query-results --query-id 替换为上一步返回的查询ID即可拿到具体的内存使用数据。
方案2:转为自定义指标后通过get-metric-data查询
如果你需要长期通过get-metric-data拉取该指标,可以在对应Lambda的日志组下配置指标过滤器,将日志中的@maxMemoryUsed字段提取为自定义命名空间下的指标,配置完成后就可以和查询原生Lambda指标一样,指定对应维度拉取MemoryUsedInMB数据。
内容的提问来源于stack exchange,提问作者S Shriram Chenniappa
相关产品推荐
相关产品推荐

