使用“事件”调用类型时未调用 AWS Lambda
Posted
技术标签:
【中文标题】使用“事件”调用类型时未调用 AWS Lambda【英文标题】:AWS Lambda not invoked when using 'Event' invocation type 【发布时间】: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
【参考方案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 日志,看看是否已被调用。
【讨论】:
以上是关于使用“事件”调用类型时未调用 AWS Lambda的主要内容,如果未能解决你的问题,请参考以下文章
如何使用AWS Lambda和SNS事件触发Spring Cloud功能的重试
如何从 lambda 调用 IAM 授权的 AWS ApiGateway 端点?