我正在创建一个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);
});
};
如何从层中引用节点模块?
答案 0 :(得分:2)
您如何运行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开发人员指南在Working with Layers上包含一个页面。在撰写本文时,他们并没有真正涉足如何在本地文件路径中引用图层,而是专注于对远程托管图层的引用。
我发现棘手的方面是,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
另外一个要警惕的陷阱……
关于在template.yaml
中定义函数资源,在CodeUri
与Handler
中放置路径的哪一部分方面有一些“灵活性”。在某些情况下,做...
Properties:
CodeUri: nodejs/src/
Handler: event.handler
...的效果和效果一样...
Properties:
CodeUri: nodejs/
Handler: src/event.handler
但是,如果您使用的是sam build
命令,则前者将不起作用。该命令期望在package.json
目录内找到CodeUri
。因此,请坚持使用CodeUri: nodejs/
并使用Handler
值来浏览到达处理程序所需的任何其他文件夹层次结构。
答案 1 :(得分:1)
尝试以下简单示例,如何在nodejs中设置lambda层:
https://medium.com/@anjanava.biswas/nodejs-runtime-environment-with-aws-lambda-layers-f3914613e20e
答案 2 :(得分:0)
为了寻址您的模块,您必须使用带有'/ opt'前缀的路径。
如果是您的文件,并且其中包含myLib.zip
并打包到myLib.js
,则应输入:
const myModule = require('/opt/myLib);
如果插入已安装的依赖项,则将node_modules.zip
文件夹和地址上传为node_modules
:
const module = require('/opt/node_modules/lib_name');