【问题标题】:AWS Lambda not invoked when using 'Event' invocation type使用“事件”调用类型时未调用 AWS Lambda
【发布时间】:2019-08-12 09:39:06
【问题描述】:

我有 2 个 lambda,test1,它调用 test2。我想以“一劳永逸”的心态异步调用test2

以下是两个 lambda 的代码。当我将InvocationType 设置为RequestResponse 时,该函数被调用并且CloudWatch 中有一个日志。当我将InvocationType 更改为Event 时,CloudWatch 中没有被调用函数的记录。

测试1:

const AWS = require('aws-sdk');
const lambda = new AWS.Lambda();

exports.handler = async (event) => {
    const params = {
        'FunctionName': 'test2',
        'InvocationType': 'Event',
        'Payload': JSON.stringify('Hello')
    };

    const response = await lambda.invoke(params).promise();
    return response;
};

测试2:

exports.handler = async (event) => {
    console.log(event);
    return 'Success';
};

IAM 策略包括调用权限(否则RequestResponse 类型也不起作用)。我也读过limits on the size of the args you can pass,但在这种情况下,我只是传递“你好”......什么给了?

编辑:我还应该补充一点,在每种情况下我都会收到 202 的响应代码,这表明调用成功,我只是在日志中看不到函数正在执行的证据。

编辑 2:我已将 await 添加到 test1 的末尾,但仍未看到任何迹象表明在 CloudWatch 中调用了 test2。

【问题讨论】:

  • 您可以尝试改用invokeAsync 吗?
  • 使用invokeAsync,您不需要提供InvocationType 参数,因此我们可以尝试将其排除。
  • 我知道。由于您的代码看起来不错,因此只是试图捕获一些未识别的错误。我自己使用过该代码,它运行良好(不再有源代码,但我确信它完全一样)
  • 使用 invokeAsync 会导致相同的行为 - 没有 CloudWatch 日志
  • 不,因为它只会等到它成功执行对另一个函数的调用(在内部,我认为它会将有效负载发送到 SQS 队列,然后 Lambda 会拾取它),所以,本质上,您只需要等待将消息放入 SQS

标签: node.js amazon-web-services asynchronous aws-lambda


【解决方案1】:

我认为只是缺少await

exports.handler = async (event) => {
    const params = {
        'FunctionName': 'test2',
        'InvocationType': 'Event',
        'Payload': JSON.stringify('Hello')
    };

    await lambda.invoke(params).promise();
};

如果没有await,来自lambda.invoke(params).promise() 的promise 将退出lambda 执行而不解决该promise。

因为 lambda 是异步调用的,所以没有返回结果。

您可以查看test2 lambda 的 CloudWatch 日志,看看是否已被调用。

【讨论】:

    猜你喜欢
    • 2018-04-15
    • 2019-09-28
    • 2015-11-10
    • 2021-08-04
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    相关资源
    最近更新 更多