AWS Lambda 直接调用发送两个即时响应

AWS Lambda direct invocation sends two immediate responses

我有一个使用 lambda.invoke 通过 AWS SDK 触发的 lambda 函数,它每次都会发送具有相同请求 ID 的重复请求。目前 运行 NodeJS 与 AWS 中的 lambdas。 - AWS 开发工具包版本 2.557.0 - NodeJS 版本 10

我尝试将 AWS 客户端配置为 maxRetries 为 0,httpOptions 超时为 30000,connectTimeout 为 10000。

AWS.config.update({
  maxRetries: 0,
  httpOptions: {
    timeout: 30000,
    connectTimeout: 10000
  }
})

正在调用 lambda.invoke,内容如下:

const result = await lambda.invoke({
    FunctionName: process.env.INTAKES_FUNCTION_NAME,
    Payload: JSON.stringify(intakesEvent)
  }, function(err, data) {
    if (err) {
      console.log(`Lamda Error: ${JSON.stringify(err, null, 2)}`)
      throw err;
    } else {
      console.log('Lambda Result: ' +  data);
    }
}).promise();

我确定调用发生了,因为我可以在 Cloudwatch 中看到日志。但是,我看到调用 lambda.invoke 的函数中的日志只出现一次,而调用的 lambda 函数中的日志出现两次。 AWS SDK 分配的请求 ID 相同。

我做了一些研究并得出结论,需要解决幂等性问题,但我不明白为什么 100% 的时间都会发生这种情况。 Cloudwatch 和 Lambda 日志显示 0% 的错误,没有任何超时,但是在 20 - 50 毫秒的差异内使用 lambda.invoke 触发了两个重复的请求。我遇到的其他帖子表明他们遇到过这种情况,重复事件之间有 10 分钟的延迟。

有没有人遇到过这种情况?

[回答] 根据以下 Arun K 的回答:

const result = await lambda.invoke({
    FunctionName: process.env.INTAKES_FUNCTION_NAME,
    Payload: JSON.stringify(intakesEvent)
}).promise();

问题是回调和 promise 语法混合导致了某种双重触发。修复此问题消除了双重立即重试问题。

我能看到的唯一问题是,您混合了承诺和回调语法。修复该问题后,您应该能够从 lambda 中看到实际错误。

try {
  const result = await lambda.invoke({
    FunctionName: process.env.INTAKES_FUNCTION_NAME,
    Payload: JSON.stringify(intakesEvent)
  }).promise();
} catch (err) {
   console.log('error: ', err)
}