在 node.js 中的 AWS lambda 函数之间共享代码
Share code between AWS lambda functions in node.js
似乎无法传递在另一个 AWS lambda 函数中作为 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
)的说明:
result – is an optional parameter that you can use to provide the
result of a successful function execution. The result provided must be
JSON.stringify
compatible. If an error is provided, this parameter is
ignored.
为了 JSON.stringify
兼容,你不能在那里有任何功能。查看 http://json.org/ 以了解什么是有效的 JSON(仅字符串、数字、对象、数组、true
、false
和 null
)。
如果您想在广义上共享您的 AWS Lambda 函数之间的代码,您必须 require
它们中的相同 Node 模块,这样您就可以提供一组通用的函数您所有的 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
在另一端,但我真的不推荐它。
截至 AWS Reinvent 2018,亚马逊推出了 Lambda Layers。
Lambda Layers, a way to centrally manage code and data that is shared across multiple functions.
想法是,现在您可以将常用组件放在 ZIP 文件中,然后将其作为 Lambda 层上传。您的函数代码不需要更改,可以像通常那样引用层中的库,而不是将它们单独打包。
似乎无法传递在另一个 AWS lambda 函数中作为 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
)的说明:
result – is an optional parameter that you can use to provide the result of a successful function execution. The result provided must be
JSON.stringify
compatible. If an error is provided, this parameter is ignored.
为了 JSON.stringify
兼容,你不能在那里有任何功能。查看 http://json.org/ 以了解什么是有效的 JSON(仅字符串、数字、对象、数组、true
、false
和 null
)。
如果您想在广义上共享您的 AWS Lambda 函数之间的代码,您必须 require
它们中的相同 Node 模块,这样您就可以提供一组通用的函数您所有的 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
在另一端,但我真的不推荐它。
截至 AWS Reinvent 2018,亚马逊推出了 Lambda Layers。
Lambda Layers, a way to centrally manage code and data that is shared across multiple functions.
想法是,现在您可以将常用组件放在 ZIP 文件中,然后将其作为 Lambda 层上传。您的函数代码不需要更改,可以像通常那样引用层中的库,而不是将它们单独打包。