【发布时间】: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