AWS Lambda指标统计调用次数与实际调用次数不符问题咨询
现象原因分析
1. 参数调用错误触发重试
你当前使用位置参数传递invoke方法参数不符合boto3接口规范,invoke方法的位置参数顺序为FunctionName、InvocationType、LogType、ClientContext、Payload,你直接将payload放在第三个位置,会导致参数传值错误,Lambda服务端返回参数异常响应,进一步触发SDK重试逻辑。
2. boto3默认隐式重试机制
即便你未在Glue作业层面配置重试策略,boto3 SDK的Lambda客户端默认开启了自动重试逻辑,针对服务端5xx错误、限流429错误、网络超时、参数错误等场景会自动重试,默认标准模式下最多重试3次,加上原始请求刚好是4次调用,匹配你单次触发出现4次计数的现象。
3. Glue分布式执行重复运行代码
你配置了2个工作节点的Glue ETL作业,如果Lambda调用代码写在executor端运行的数据转换逻辑(如map、foreach算子)中,而非driver端的全局唯一逻辑,代码会随数据分区分配到多个工作节点并行执行,进一步放大调用次数,2次触发逻辑叠加每个请求3次重试就会出现16次的计数结果。
调用次数匹配说明
Lambda的Invocations指标统计的是所有成功到达Lambda服务端点的调用请求,不管是用户主动触发还是SDK、上层服务自动重试的请求,只要服务端完成接收就会计数,因此指标统计值和实际到达服务端的调用次数是完全对应的,你观测到的数值差本质是存在未被你感知的额外请求被发送到了Lambda。
修复建议
- 修正Lambda调用的参数写法,改用关键字参数避免位置顺序错误:
lambda_response = lambda_client.invoke( FunctionName=target_lambda_arn, InvocationType='RequestResponse', Payload=json_payload )
- 显式配置boto3客户端的重试策略,关闭不必要的自动重试:
from botocore.config import Config lambda_config = Config( retries = { 'max_attempts': 1, 'mode': 'standard' } ) lambda_client = boto3.client('lambda', region_name='eu-west-1', config=lambda_config)
- 调整Lambda调用代码的位置,确保仅在Glue作业的driver端执行一次,避免写入executor端的分布式处理逻辑中。
内容的提问来源于stack exchange,提问作者Emile Beukes
相关产品推荐
相关产品推荐

