You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
  } 
}

额外优化建议:

  1. 去掉冗余的变量声明(比如原代码里的let user, User可以直接用const User),让代码更简洁易读。
  2. 确认models.User.create()确实返回Promise——如果它是基于回调的旧方法,记得用util.promisify把它包装成Promise,否则await不会生效,依然会引发执行异常。
  3. 现代Lambda开发已经不再依赖context参数,除非你需要手动设置超时等特殊属性,完全可以省略。

修改后,函数会在return或throw时明确终止执行上下文,Cognito能立刻收到响应,自然不会触发重试了。

内容的提问来源于stack exchange,提问作者Erick Yataco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:31:54