AWS Step Functions状态机执行成功但无法跳转下一步超时问题排查
AWS Step Functions状态机无法向下跳转故障解决方案
核心故障特征
- 用于PDF生成的状态机此前运行正常,7月23日突发故障
- 第一步任务可正常触发,内部执行日志显示完成,但无法向下一步传递数据,最终触发超时
- 已尝试调整超时时间、调高状态转换限流配额均无效
根因定位
结合Lambda代码与状态机配置,故障大概率由以下几个可复现的原因导致:
- Lambda回调配置缺失:代码注释标注需要冻结数据库连接,但未配置
context.callbackWaitsForEmptyEventLoop = false参数,数据库连接池的长连接、S3客户端的残留连接会占用事件循环,导致调用callback()后Lambda不会立即向Step Functions返回结果,最终触发超时。该问题在7月AWS对Node.js运行时版本更新后集中出现,此前旧版本运行时对事件循环空闲判定阈值更宽松,所以未暴露。 - 状态传递Payload超限:Step Functions单步状态传递的Payload最大限制为256KB,若返回内容中包含完整HTML文本、签名Payload等大字段,超过阈值后会被Step Functions拒绝接收,表现为回调超时。
- Lambda网络配置变更:若7月23日前后将该Lambda调整至VPC内部部署,未配置公网出口或Step Functions VPC端点的情况下,Lambda无法将执行结果返回至Step Functions公共服务端点,导致超时。
修复步骤
1. 补全Lambda回调配置
在Lambda函数入口处添加如下配置,强制调用callback后立即返回结果:
exports.lambdaHandler = (event, context, callback) => { // 新增以下行,匹配注释中冻结数据库连接的需求 context.callbackWaitsForEmptyEventLoop = false; console.log(event); // 剩余原有代码不变 }
2. 裁剪返回Payload
删除返回对象中不需要传递到下一步的冗余大字段,仅保留必要字段:
// 原返回逻辑中移除sqsPayload等非必要大字段,避免超限 callback(null, { 'isAllowed': true, 'sqsQueData': data.sqsQueData, 'uploadedHtmlUri': process.env.APP_CDN + uploadData.Key, });
同时在回调前增加日志确认Payload大小:
const output = { 'isAllowed': true, 'sqsQueData': data.sqsQueData, 'uploadedHtmlUri': process.env.APP_CDN + uploadData.Key, }; console.log('Output payload size:', Buffer.byteLength(JSON.stringify(output))); callback(null, output);
3. 核查Lambda网络配置
- 若Lambda部署在VPC内,确认子网路由表配置了NAT网关,或已创建Step Functions的Interface类型VPC端点
- 确认Lambda执行角色保留基础权限,无需额外Step Functions权限即可完成同步任务返回
4. 验证运行时兼容性
确认Lambda使用的Node.js运行时版本,若此前为14.x版本,升级至18.x或20.x LTS版本后,重新测试database-layer依赖的兼容性,确保数据库查询回调可正常触发。
内容的提问来源于stack exchange,提问作者Sultan Haider
相关产品推荐
相关产品推荐

