调用AWS lambda函数,等到完成

时间:2017-05-05 02:48:10

标签: amazon-web-services aws-lambda

我使用以下nodeJS lambda函数来调用java lambda函数。

var AWS = require('aws-sdk');

    var lambda = new AWS.Lambda({httpOptions:{timeout: 300000}});

    exports.handler = function(event, context) {
      var params = {

        FunctionName: 'sensi', // the lambda function we are going to invoke
        InvocationType: 'RequestResponse',
        Payload: '{"input":"alum_ROW,10,-1"}',
        LogType:'Tail'
      };

      lambda.invoke(params, function(err, data) {
        if (err) {
          context.fail(err);
        } else {
          context.succeed(data.LogResult);
        }
      })
    };

调用者lambda的执行成功,我正在调用的函数正在正确执行。问题是调用者lambda在被调用的lambda函数结束之前结束,我得到了#34; null" as data.payload和十六进制字符作为data.LogResult。显然,我们需要等到被叫lambda完成。

在我试图打电话的lambda下面

public boolean run(String input ){

        String [] inputs= input.split(",");

        String systemId=inputs[0];
        int iterations=Integer.parseInt(inputs[1]);
        int output=Integer.parseInt(inputs[2]);

       //custom code

       return true;
    }

此功能位于课程内" Launchers.Launcher"因此" sensi" lambda函数有处理程序" Launchers.Launcher :: run"

编辑:@JOHN提供的解决方案

添加:context.callbackWaitsForEmptyEventLoop = false;

1 个答案:

答案 0 :(得分:4)

编译你的问题,(纠正我,如果我错了,我会编辑答案):

  1. 你有一个lambda X,它调用lambda Y。
  2. Lambda Y为每次执行返回一些值Z。
  3. 在调用lambda Y时,您希望lambda X接收值Z.
    1. 您希望在 lambda Y结束执行后使用返回值Z 调用回调。
  4. 根据您的params

    1. 您通过指定synchronous请求RequestResponse执行,这对此有用(接收lambda Y的结果)。
    2. 您通过指定4KB来请求lambda Y生成的最后Tail个日志。
    3. 根据文档并且鉴于我在编辑您的问题时是正确的,LogResult不是您正在寻找的,但Payload是。

      以下内容来自响应元素部分:

        

      LogResult

           

      它是Lambda函数的base64编码日志   调用。仅当调用类型为时,才会出现此情况   RequestResponse并且请求了日志。

           

      响应将以下内容作为HTTP正文返回。

        

      有效负载

           

      它是由...返回的对象的JSON表示   Lambda函数。仅当调用类型为时,才会出现此情况   RequestResponse

      API_Invoke Reference

      编辑(添加示例):

      根据我的上述描述,我创造了两个lambdas,X和Y.

      这是X的代码:

      let aws = require('aws-sdk');
      let lambda = new aws.Lambda();
      
      exports.handler = (event, context, callback) => {
          context.callbackWaitsForEmptyEventLoop = false;
      
          const params = {
              FunctionName: "Y", 
              InvocationType: "RequestResponse", 
              LogType: "Tail", 
              Payload: '{"name":"jonathan"}'
          };
      
          lambda.invoke(params, (err, res) => {
              if (err) {
                  callback(err);
              }
      
              console.log(JSON.stringify(res));
      
              callback(null, res.Payload);
          });
      };
      

      以下是Y的代码:

      exports.handler = (event, context, callback) => {
          context.callbackWaitsForEmptyEventLoop = false;
          console.log(JSON.stringify(event));
      
          setTimeout(() => {
             callback(null, "My name is Jonathan"); 
          }, 1000 * 10); // 10 seconds delay
      };
      
      • 你想要达到的目标是可行的。
      • Lambda X同步调用Lambda Y并等待其响应(等待10秒)。
      • 您正在访问回调输入的错误属性,您访问了LogResult属性而不是Payload属性。

      这是X的任意执行日志:

      START RequestId: a6a98e8d-31b9-11e7-aba1-d5d86092115f Version: $LATEST
      2017-05-05T17:38:40.805Z    a6a98e8d-31b9-11e7-aba1-d5d86092115f    {"StatusCode":200,"LogResult":"U1RBUlQgUmVxdWVzdElkOiBhNzVmMjIzZi0zMWI5LTExZTctYmRmYy0xMzJkMDc0Zjc3YzggVmVyc2lvbjogJExBVEVTVAoyMDE3LTA1LTA1VDE3OjM4OjMwLjY4NloJYTc1ZjIyM2YtMzFiOS0xMWU3LWJkZmMtMTMyZDA3NGY3N2M4CXsibmFtZSI6ImpvbmF0aGFuIn0KRU5EIFJlcXVlc3RJZDogYTc1ZjIyM2YtMzFiOS0xMWU3LWJkZmMtMTMyZDA3NGY3N2M4ClJFUE9SVCBSZXF1ZXN0SWQ6IGE3NWYyMjNmLTMxYjktMTFlNy1iZGZjLTEzMmQwNzRmNzdjOAlEdXJhdGlvbjogMTAwMjcuMjkgbXMJQmlsbGVkIER1cmF0aW9uOiAxMDEwMCBtcyAJTWVtb3J5IFNpemU6IDEyOCBNQglNYXggTWVtb3J5IFVzZWQ6IDE3IE1CCQo=","Payload":"\"My name is Jonathan\""}
      END RequestId: a6a98e8d-31b9-11e7-aba1-d5d86092115f
      REPORT RequestId: a6a98e8d-31b9-11e7-aba1-d5d86092115f  Duration: 11233.34 ms   Billed Duration: 11300 ms   Memory Size: 128 MB Max Memory Used: 30 MB  
      

      请注意回调输入的结构:

      {
        "StatusCode": 200,
      
        // this is the logs that Y's printed to the "console" (base64 encoded)
        "LogResult": "U1RBUlQgUmVxdWVzdElkOiBhNzVmMjIzZi0zMWI5LTExZTctYmRmYy0xMzJkMDc0Zjc3YzggVmVyc2lvbjogJExBVEVTVAoyMDE3LTA1LTA1VDE3OjM4OjMwLjY4NloJYTc1ZjIyM2YtMzFiOS0xMWU3LWJkZmMtMTMyZDA3NGY3N2M4CXsibmFtZSI6ImpvbmF0aGFuIn0KRU5EIFJlcXVlc3RJZDogYTc1ZjIyM2YtMzFiOS0xMWU3LWJkZmMtMTMyZDA3NGY3N2M4ClJFUE9SVCBSZXF1ZXN0SWQ6IGE3NWYyMjNmLTMxYjktMTFlNy1iZGZjLTEzMmQwNzRmNzdjOAlEdXJhdGlvbjogMTAwMjcuMjkgbXMJQmlsbGVkIER1cmF0aW9uOiAxMDEwMCBtcyAJTWVtb3J5IFNpemU6IDEyOCBNQglNYXggTWVtb3J5IFVzZWQ6IDE3IE1CCQo=",
      
      
        "Payload": "\"My name is Jonathan\"" // <--- this is the returned value
      }
      

      希望这能回答你的问题。