在 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(仅字符串、数字、对象、数组、truefalsenull)。

如果您想在广义上共享您的 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 层上传。您的函数代码不需要更改,可以像通常那样引用层中的库,而不是将它们单独打包。