使用“事件”调用类型时未调用 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 Appsync 从 Lambda 调用变异?

如何使用AWS Lambda和SNS事件触发Spring Cloud功能的重试

如何从 lambda 调用 IAM 授权的 AWS ApiGateway 端点?

如何使用 IAM 在 AWS Lambda 中调用 AppSync?

aws lambda函数为单个事件多次触发

使用来自共享资源的 api-gatewayv2 时未绑定 aws cdk lambda