【问题标题】:How to call an AWS Python Lambda function from another Node.js Lambda function如何从另一个 Node.js Lambda 函数调用 AWS Python Lambda 函数
【发布时间】:2021-09-23 04:16:03
【问题描述】:

我是 JavaScript 和 AWS 的新手。我正在努力将 Python AWS Lambda 函数连接到 Node.js AWS Lambda 函数。

我想从主 Lambda 函数(假设是父 lambda)的中间行调用一个单独的 Lambda 函数(假设是子 lambda),并在父 lambda 中使用子 lambda 的返回值。

我的子 lambda 是在 Python 3.6 中实现的,而父 lambda 是在 Node.js 12.x 中实现的。 我想停止执行父 lambda,直到子 lambda 返回它的值。

但似乎父 lambda 中的其余代码行在完成子 lambda 执行之前执行。

我使用以下链接为父 lambda 设置了所需的策略。
https://www.sqlshack.com/calling-an-aws-lambda-function-from-another-lambda-function/

我有一个分配给变量“img”的数组。如果满足条件,我需要通过将 Payload 作为“img”数组传递来调用子 lambda,以对该数组进行一些额外的计算并将其返回给父 lambda。最后用返回的数组替换“img”变量。

下面是我在父 lambda 中用于调用子 lambda 的代码块。 请注意,“returnArr”是从子 lambda 返回的数组。

const AWS = require('aws-sdk');
AWS.config.region = 'ap-southeast-2';
var lambda = new AWS.Lambda();

exports.handler = async (event, ctx, callback) => {
    //////////code lines for other operations////////////

    let img = [[[2,3,5],[6,7,8]],[[12,13,15],[16,17,18]]];
    let flag=0;
    if(condition){
        console.log("BEGIN");
        var params = {
                FunctionName: 'childFunction', // child lambda function written in Pyton 3.6
                InvocationType: 'RequestResponse',
                Payload: JSON.stringify({ "sendImg" : img})
            };
            lambda.invoke(params, function(err, data) {
                console.log("SENT");
                if (err) {
                console.log(err);
                } else {
                //console.log('Lambda_B said '+ data.Payload);
                let body1;
                flag = 1;
                if(typeof(data.Payload) == 'object') {
                    body1 = data.Payload;
                } else {
                    body1 = JSON.parse(data.Payload);
                }
                img = body1["returnArray"];
                console.log("Modified img array inside: ",img);
                }
            })
            console.log("DONE");
    }

    console.log("flag : "+flag);
    console.log("Modified img array outside: "+img);
    ////////Rest of the code///////////////////////
};

我得到如下输出:

开始
完成
标志:0
外部修改img数组:[[[2,3,5],[6,7,8]],[[12,13,15],[16,17,18]]]
已发送
里面修改了img数组:[[[23,31,54],[63,71,86]],[[12,133,115],[162,117,18]]]


根据输出,您可以看到 if 条件之外的 2 行代码在子 lambda 返回修改后的数组之前已经执行。
如果条件未修改,则外部的“img”数组,但修改了 if 条件内的“img”数组。

我想停止执行父 lambda,直到子 lambda 返回它的数组。

我认为这种情况正在发生,因为我没有太多 NodeJS 知识。
谁能告诉我哪里出错了?

【问题讨论】:

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


    【解决方案1】:

    父 lambda 在子 lambda 执行完成之前执行

    您正在使用async handler,因此您的函数在有机会调用其他函数之前完成。

    要克服这个问题,您可以将代码包装在new Promise 的处理程序中,如AWS docs 所示。

    【讨论】:

      猜你喜欢
      • 2017-01-01
      • 2021-09-19
      • 1970-01-01
      • 2018-05-19
      • 2018-06-09
      • 1970-01-01
      • 2022-12-05
      相关资源
      最近更新 更多