【问题标题】:Why does my await lambda.invoke function invoke lambda multiple times?为什么我的 await lambda.invoke 函数会多次调用 lambda?
【发布时间】:2020-05-18 17:36:20
【问题描述】:

目前

我有一个调用另一个 lambdaYlambdaX

拉姆达 X:

"use strict";

const AWS = require('aws-sdk');
AWS.config.region = 'ap-southeast-2';
var lambda = new AWS.Lambda();

exports.handler = async (event) => {

  //the final return
  var dataToSave = []

  //data to be added to array
  let returnLoad;

  var params = {
    FunctionName: 'lambdaY', // the lambda function we are going to invoke
    InvocationType: 'RequestResponse',
    LogType: 'Tail', //Set to Tail to include the execution log in the response.
  };

  try {
    await lambda.invoke(params, function(err, data) {
      if (err) {
        console.log("Error");
        console.log(err, err.stack);
      } else {
        console.log("Success");
        console.log(data);
        returnLoad = data.Payload;
      }
    }).promise();

    dataToSave.push(returnLoad);

  } catch (err) {
      console.log('some error occurred...');
  }

  const response = {
      statusCode: 200,
      body: JSON.stringify(dataToSave)
  };
  return response;
}

拉姆达Y:

exports.handler = async (event) => {
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

问题

由于某种原因,每当我调用 lambdaX 时,lambdaY 都会调用 2 次以上。请注意,lambdaX 会返回正确的响应,但我想避免不必要地多次调用 lambdaY

我需要对我的代码进行哪些更改? (或 lambda 配置)

日志:

注意:2 个 lambdaY 日志同时被调用。

注意:LambdaX 结果正常且符合预期。没有重复的日志。

【问题讨论】:

  • 您是否确认 lambdaY 两次都由 lambdaX 启动?例如,由于配置问题,触发 lambdaX 的事件也可能触发 lambdaY。也许尝试记录 lambdaY 的有效负载以确认它来自 lambdaX。
  • 另外,您是否检查了日志以确保 lambdaX 仅被触发一次?
  • @jpetty,是的,lambdaX 的日志显示它只被触发一次,而 lambdaY 的日志显示来自 X 的有效负载(当我包含一个有效负载来测试该问题时)
  • 感谢@Wronski,通常会看到重复的 lambda 调用是由 failure retries 引起的。 lambdaY 可能失败导致 lambdaX 重试。 lambdaX 的日志中有什么?它是否从 lambdaY 获得了成功的响应?
  • @jpetty,我已经为 lambdaX 添加了日志。它们符合预期,没有显示错误。

标签: javascript amazon-web-services promise aws-lambda async-await


【解决方案1】:

您的代码滥用了 AWS 开发工具包。具体来说,它同时使用回调和承诺功能both。它应该使用其中一个,但不能同时使用。

我会将其更改为仅使用承诺(并且显然会为此添加一些错误处理):

const data = await lambda.invoke(params).promise();
const returnLoad = data.Payload;

【讨论】:

    猜你喜欢
    • 2021-11-29
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多