我正在创建一个lambda层,捆绑了一些依赖项,包括node_modules。我正在成功地创建一个层,但是当我试图从我的代码中请求一个模块时,控制台告诉我找不到该模块。以下是代码
var Promise = require('promise');
module.exports.handler = function(event, context, callback) {
new Promise(function (resolve, reject) {
setTimeout(function() {
callback(null, "helloWorld2");
}, 9000);
});
};如何从层中引用节点模块?
发布于 2019-03-12 04:21:40
您是如何运行您的lambda的?如果通过sam cli,下面这样的东西已经作为我的template.yaml工作了。
示例模板
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Description: example of node.js lambda function using layer for dependencies
Resources:
ExampleFunction:
Type: AWS::Serverless::Function
Properties:
Runtime: nodejs8.10
CodeUri: nodejs/
Handler: src/event.handler
Layers:
- !Ref NodeModulesLayer
NodeModulesLayer:
Type: AWS::Serverless::LayerVersion
Properties:
Description: full set of function dependencies
ContentUri: ./
CompatibleRuntimes:
- nodejs6.10
- nodejs8.10
LicenseInfo: 'Available under the MIT-0 license.'
RetentionPolicy: Retain指向本地层
SAM开发人员指南包括一个关于的页面。在我写这篇文章的时候,他们并没有真正深入到如何引用本地文件路径中的层,而是专注于对远程托管层的引用。
我发现棘手的方面是,node.js层的目录结构应该是……
nodejs/
node_modules/..。这意味着为了使本地安装的node_modules目录作为层工作,您的package.json文件必须嵌套在名为nodejs的文件夹中。
请注意上述示例template.yaml中的路径
ExampleFunction.Properties.CodeUri设置为nodejs/ExampleFunction.Properties.Handler应设置为处理程序文件的路径,相对于nodejs/.NodeModulesLayer.Properties.ContentUri设置为同时包含template.yaml文件和nodejs目录的文件夹。这意味着我的示例假设结构如下...
nodejs/
node_modules/
src/
event.js
package.json
template.yaml保留sam构建支持
另一个需要注意的问题是……
关于在template.yaml中定义函数资源,在CodeUri和Handler中放入路径的哪一部分方面有一定的“灵活性”。在某些情况下,做……
Properties:
CodeUri: nodejs/src/
Handler: event.handler..。效果和做…一样好。
Properties:
CodeUri: nodejs/
Handler: src/event.handler但是,如果您使用的是sam build命令,则前者将不起作用。该命令期望在CodeUri目录中找到package.json。因此,请坚持使用CodeUri: nodejs/,并使用Handler值在访问处理程序所需的任何其他文件夹层次结构中导航。
发布于 2019-01-13 22:20:14
试试这个,简单的例子如何在nodejs中设置lambda层:
https://medium.com/@anjanava.biswas/nodejs-runtime-environment-with-aws-lambda-layers-f3914613e20e
发布于 2020-11-14 05:16:59
为了寻址你的模块,你必须使用带有'/opt‘前缀的路径。如果它是你的文件,你把它打包到myLib.zip里面,里面有myLib.js,你应该这样写:
const myModule = require('/opt/myLib);如果您插入已安装的依赖项,则上传带有node_modules文件夹和地址的node_modules.zip为:
const module = require('/opt/node_modules/lib_name');https://stackoverflow.com/questions/53788753
复制相似问题