如何从另一个 Node.js Lambda 函数调用 AWS Python Lambda 函数

问题描述 投票:0回答:2

我是 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'。如果条件满足,我需要通过将有效负载作为“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”数组,但如果条件已修改,则在内部的“img”数组。

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

我认为这是因为我没有太多 NodeJS 知识。
有人可以告诉我哪里出错了吗?

python node.js amazon-web-services aws-lambda aws-sdk
2个回答
0
投票

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

你正在使用 async handler,所以你的函数在它有机会调用另一个函数之前完成。

为了克服这个问题,您可以将代码包装在

new Promise
中的处理程序中,如AWS 文档 中所示。


0
投票

你在哪里调用你的调用,试试这个:

try {
let newLambda = new AWS.Lambda();
let lambdaResult = await newLambda.invoke(newLambdaParams).promise();
} catch (error) {
//handle any errors
}
© www.soinside.com 2019 - 2024. All rights reserved.