簡體   English   中英

調用AWS lambda函數,等到完成

[英]invoking AWS lambda function, wait until completion

我使用以下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函數結束之前結束,我得到“null”作為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. 你有一個lambda X,它叫lambda Y.
  2. Lambda Y為每次執行返回一些值Z.
  3. 在調用lambda Y時,您希望lambda X接收值Z.
    1. lambda Y結束執行 ,您希望使用返回值Z調用回調。

根據你的params

  1. 您通過指定RequestResponse請求synchronous執行,這有利於此目的(接收lambda Y的結果)。
  2. 您通過指定Tail請求lambda Y生成的最后4KB日志。

根據文檔並給出我正確編譯你的問題, LogResult不是你想要的,但Payload是。

以下內容來自“ 響應元素”部分:

LogResult

它是Lambda函數調用的base64編碼日志。 僅當調用類型為RequestResponse並且請求了日志時,才會出現此問題。

響應將以下內容作為HTTP正文返回。


有效載荷

它是Lambda函數返回的對象的JSON表示形式。 僅當調用類型為RequestResponse才會出現此問題。

API_Invoke參考


編輯(添加示例):

根據我上面的描述,我創造了兩個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
}

希望這能回答你的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM