在node.js中的AWS lambda函数之间共享代码

问题描述:

似乎不可能传递一些在另一个AWS lambda函数中作为AWS lambda函数调用的代码(包含数据和函数)。在node.js中的AWS lambda函数之间共享代码

例如,借此customConfigLambda

var callbackPayload = {}; 

callbackPayload.fooData = 'fooFromData'; 
callbackPayload.fooFunction = function() {return 'fooFromFunction'; }; 

exports.handler = (event, context, callback) => { 
    callback(null, callbackPayload); 
}; 

当我打电话的另一个AWS lambda函数之前的AWS lambda函数喜欢这里:

var AWS = require('aws-sdk'); 
AWS.config.update({accessKey: '123', secretAccessKey: 'abc', region: 'us-east-1' }); 
var lambda = new AWS.Lambda({region: 'us-east-1'}); 

exports.handler = (event, context, callback) => { 
    var params = {FunctionName: 'customConfigLambda'}; 
    lambda.invoke(params, function(err, callbackPayload) { 
     if (err) { 
      // do nothing 
     } 
     else { 
      console.log('callbackPayload:', JSON.stringify(callbackPayload, null, 2)); 
     } 
    }); 
}; 

那我只能看到callbackPayload.fooData但不callbackPayload.fooFunction

如何在多个其他AWS lambda函数之间共享一些callbackPayload.fooFunction(s)

有关使用回调参数的文档:

它说这对result(在代码中callbackPayload):

结果 - 被一个可选参数,您可以使用该参数提供成功执行功能的 结果。所提供的结果必须是 JSON.stringify兼容。如果提供了错误,则忽略此参数 。

要成为JSON.stringify兼容,您不能在那里有任何功能。请参阅http://json.org/以查看什么是有效的JSON(仅限字符串,数字,对象,数组,true,falsenull)。

如果你想在广义上您的AWS lambda函数之间共享代码,你必须require在二者的同一节点模块,这样您就可以将一组通用的功能,所有AWS的Lamda的处理程序。但是你不能绕过它们之间的任意代码,因为这些代码将无法在JSON.stringify中生存。

作为一个测试,你可以尝试在浏览器中运行以下命令:

var callbackPayload = {}; 

callbackPayload.fooData = 'fooFromData'; 
callbackPayload.fooFunction = function() {return 'fooFromFunction'; }; 

alert(JSON.stringify(callbackPayload)); 

(见DEMO) 或这节点:

var callbackPayload = {}; 

callbackPayload.fooData = 'fooFromData'; 
callbackPayload.fooFunction = function() {return 'fooFromFunction'; }; 

console.log(JSON.stringify(callbackPayload)); 

和看到的结果是:

{"fooData":"fooFromData"} 

在序列化过程中,这些功能被剥离出来。

当然,你可以做这样的事情:

callbackPayload.fooFunction 
    = function() {return 'fooFromFunction'; }.toString(); 

,并得到一个JSON结果:

{"fooData":"fooFromData","fooFunction":"function() {return 'fooFromFunction'; }"} 

,你可以在另一端理论上eval但我真的不能推荐它。

+0

谢谢,我希望有一种方法:)关于'需要'在不同的lambda函数中定制模块是否有涉及普通代码(即没有ZIP/S3文件上传)的方式?关于'eval',我猜只有当函数没有输入参数时才能工作。 – TPPZ

+1

@TPPZ您可以看看无服务器项目(以前称为JAWS) - 请参阅此信息:http://docs.serverless.com/docs/installing-serverless它可以帮助您很多部署许多共享的功能一些常见的代码库。至于评估函数,你可以评估一个字符串'“函数(x){return x;}”',并且eval的结果将是一个可以使用参数运行的函数。我不推荐它,因为它会变得混乱 - 例如,函数中的符号无法访问它所在的原始范围,而是它所在的范围。 – rsp

+0

好的,谢谢你的链接和细节。为了完整起见,可以这样做:'var fooFunctionParsed = eval('('+ callbackPayload.fooFunction +')');'然后像'const inputX = 42; const outputX = fooFunctionParsed(inputX);'。我没有调查过像'this'这样的示波器,但是对于简单的帮助器/化妆品功能,返回输入参数的组合,'eval'似乎是最快的解决方案。 – TPPZ