首页 > 解决方案 > 如何从另一个 Node.js Lambda 函数调用 AWS Python Lambda 函数

问题描述

我是 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///////////////////////
};

我得到如下输出:

BEGIN
DONE
标志:0
修改外的 img 数组:[[[2,3,5],[6,7,8]],[[12,13,15],[16,17,18]]]
SENT
修改后的 img里面的数组:[[[23,31,54],[63,71,86]],[[12,133,115],[162,117,18]]]


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

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

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

标签: pythonnode.jsamazon-web-servicesaws-lambdaaws-sdk

解决方案


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

您正在使用async handler,因此您的函数在它有机会调用另一个函数之前完成。

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


推荐阅读