使用“事件”调用类型时,AWS Lambda未被调用

3

我有两个 lambda 函数,其中 test1 会调用 test2。我希望以“点火就走”的心态异步调用 test2

以下是这两个 lambda 函数的代码。当我将 InvocationType 设置为 RequestResponse 时,函数会被调用并在 CloudWatch 中记录日志。但是当我将 InvocationType 改为 Event 时,在 CloudWatch 中没有记录表明该函数被调用了。

test1:

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类型也无法工作)。 我还阅读了有关传递参数的大小限制,但在这种情况下,我只传递“Hello”......是什么原因呢?
编辑:我还应该补充说明,在每种情况下,我都会收到202个响应代码,这表示成功调用,但我在日志中看不到执行函数的任何迹象。
编辑2:我已将await添加到test1的末尾,但仍然没有看到CloudWatch中调用test2的任何迹象。

你可以尝试使用invokeAsync吗? - Thales Minussi
1
我知道。只是试图捕捉一些未经确认的错误,因为你的代码看起来很好。我自己使用过那段代码,它也运行正常(不再有源代码了,但我确定它完全相同)。 - Thales Minussi
1
使用 invokeAsync 会导致相同的行为 - 没有 CloudWatch 日志。 - Wuubb
在异步调用时,你可以直接使用await等待 Promise 吗?await lambda.invoke(params).promise() - Thales Minussi
1
不会,因为它只会等待成功执行对其他函数的调用(在内部,我认为它会将有效载荷发送到 SQS 队列,然后 Lambda 在此之后接收它),因此,实质上,您只需要等待消息被放置在 SQS 中。 - Thales Minussi
显示剩余3条评论
1个回答

5

我认为只是缺少了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日志以查看它是否已被调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接