Cognito PostConfirmation触发器Lambda未结束且触发3次重试问题咨询
问题:Cognito触发的Lambda函数执行时长达标但从未结束且触发3次重试?
我正在开发一个用于同步RDS用户表与Cognito的简单Lambda函数,代码如下:
async function main (event, context, callback) { try { let user, User User = models.User console.log('before insert',new Date()) user = await User.create({ name: event.request.userAttributes.name, lastName: event.request.userAttributes.family_name, email: event.request.userAttributes.email, organizationId: event.request.userAttributes['custom:organizationId'], roleId: event.request.userAttributes['custom:roleId'] }) console.log('after insert', new Date()) callback(null, event) console.log('after callback',new Date()) } catch (e) { console.error(e) callback(e, event) } }
根据日志显示,该函数执行时长符合5秒限制,但为何函数从未结束,且Cognito会进行3次重试?
分析与解决方案
这问题的核心坑点在于你混用了async/await和传统的callback回调模式,直接导致Lambda的执行上下文无法被正确终止。
具体原因拆解:
在async函数里调用callback()后,函数本身并没有停止执行——从你日志里能看到after callback的打印就说明这一点。Lambda运行时会同时做两件事:一是等待async函数返回的Promise被resolve/reject,二是处理callback传递的信号。这种双重逻辑会让运行时陷入混淆,最终导致上下文被挂起直到超时;而Cognito因为没收到明确的成功响应,就会触发默认的3次重试机制。
修复后的代码:
你需要统一使用async/await的风格,彻底抛弃callback,改用返回值或抛出错误来结束函数:
async function main (event) { try { const User = models.User console.log('before insert', new Date()) await User.create({ name: event.request.userAttributes.name, lastName: event.request.userAttributes.family_name, email: event.request.userAttributes.email, organizationId: event.request.userAttributes['custom:organizationId'], roleId: event.request.userAttributes['custom:roleId'] }) console.log('after insert', new Date()) // 直接返回event,Lambda会自动生成成功响应 return event } catch (e) { console.error(e) // 抛出错误,Lambda会将其作为失败响应返回给Cognito throw e } }
额外优化建议:
- 去掉冗余的变量声明(比如原代码里的
let user, User可以直接用const User),让代码更简洁易读。 - 确认
models.User.create()确实返回Promise——如果它是基于回调的旧方法,记得用util.promisify把它包装成Promise,否则await不会生效,依然会引发执行异常。 - 现代Lambda开发已经不再依赖
context参数,除非你需要手动设置超时等特殊属性,完全可以省略。
修改后,函数会在return或throw时明确终止执行上下文,Cognito能立刻收到响应,自然不会触发重试了。
内容的提问来源于stack exchange,提问作者Erick Yataco
相关产品推荐
相关产品推荐

