Cognito中Custom Message Lambda触发器无法正常工作问题咨询
核心问题答复
Cognito的自定义消息类触发事件不会持久存储,也没有原生的待处理请求重放机制。如果触发器调用失败,Cognito会直接回退到默认邮件模板发送验证消息,或直接抛出调用错误,所有失败的触发事件不会留存等待触发器恢复后重新执行。如果需要补发验证邮件,只能通过用户主动触发重新发送验证邮件接口,或后台调用AdminResendConfirmationCode接口实现。
触发器失效排查方向
你当前的Lambda代码存在async函数混用callback的兼容问题,这是最可能导致近期触发器失效的原因:Node.js 16及以上版本的Lambda运行时对async函数的返回逻辑做了调整,同时使用async声明和callback回调会出现执行提前终止、返回值不生效的问题,建议修改代码直接用return返回event对象,同时增加边界判断避免属性读取报错。
修改后参考代码:
exports.handler = async (event) => { if(event.userPoolId === process.env.USER_POOL_ID && event.triggerSource === "CustomMessage_SignUp") { // 增加属性存在性判断,避免空值报错 if(event.request?.codeParameter && event.userName && event.callerContext?.clientId && event.request?.userAttributes?.email) { const { codeParameter } = event.request const { userName, region } = event const { clientId } = event.callerContext const { email } = event.request.userAttributes const url = 'some url' const link = `<a href="${url}?code=${codeParameter}&username=${userName}&clientId=${clientId}®ion=${region}&email=${email}" target="_blank">here</a>` event.response.emailSubject = "Your verification link"; event.response.emailMessage = `Thank you for signing up. Click ${link} to verify your email.`; } } // 直接返回event替代callback return event; };
其他排查点:
- 确认Lambda运行时版本,若近期自动升级到Node.js 18/20版本,可先降级到Node.js 16验证是否恢复
- 检查Lambda对应环境变量
USER_POOL_ID是否和绑定的用户池ID完全一致,跨区域新建用户池后需同步更新该变量 - 查看Lambda的CloudWatch运行日志,确认是否存在报错、执行超时等问题:CustomMessage触发器最大执行时长限制为5秒,超时会直接被Cognito判定为调用失败
- 确认Cognito用户池的触发器配置中,已正确绑定该Lambda到自定义消息触发源,且消息模板配置没有覆盖Lambda返回的内容
内容的提问来源于stack exchange,提问作者Vienna
相关产品推荐
相关产品推荐

