首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lambda层node_modules

Lambda层node_modules
EN

Stack Overflow用户
提问于 2018-12-15 09:14:15
回答 3查看 11.9K关注 0票数 8

我正在创建一个lambda层,捆绑了一些依赖项,包括node_modules。我正在成功地创建一个层,但是当我试图从我的代码中请求一个模块时,控制台告诉我找不到该模块。以下是代码

代码语言:javascript
复制
var Promise = require('promise');
module.exports.handler = function(event, context, callback) {   
  new Promise(function (resolve, reject) {
    setTimeout(function() {
      callback(null, "helloWorld2");
    }, 9000);
  });
};

如何从层中引用节点模块?

EN

回答 3

Stack Overflow用户

发布于 2019-03-12 04:21:40

您是如何运行您的lambda的?如果通过sam cli,下面这样的东西已经作为我的template.yaml工作了。

示例模板

代码语言:javascript
复制
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层的目录结构应该是……

代码语言:javascript
复制
nodejs/
  node_modules/

..。这意味着为了使本地安装的node_modules目录作为层工作,您的package.json文件必须嵌套在名为nodejs的文件夹中。

请注意上述示例template.yaml中的路径

  1. ExampleFunction.Properties.CodeUri设置为nodejs/
  2. ExampleFunction.Properties.Handler应设置为处理程序文件的路径,相对于nodejs/.
  3. NodeModulesLayer.Properties.ContentUri设置为同时包含template.yaml文件和nodejs目录的文件夹。

这意味着我的示例假设结构如下...

代码语言:javascript
复制
nodejs/
  node_modules/
  src/
    event.js
  package.json
template.yaml

保留sam构建支持

另一个需要注意的问题是……

关于在template.yaml中定义函数资源,在CodeUriHandler中放入路径的哪一部分方面有一定的“灵活性”。在某些情况下,做……

代码语言:javascript
复制
    Properties:
      CodeUri: nodejs/src/
      Handler: event.handler

..。效果和做…一样好。

代码语言:javascript
复制
    Properties:
      CodeUri: nodejs/
      Handler: src/event.handler

但是,如果您使用的是sam build命令,则前者将不起作用。该命令期望在CodeUri目录中找到package.json。因此,请坚持使用CodeUri: nodejs/,并使用Handler值在访问处理程序所需的任何其他文件夹层次结构中导航。

票数 8
EN

Stack Overflow用户

发布于 2019-01-13 22:20:14

试试这个,简单的例子如何在nodejs中设置lambda层:

https://medium.com/@anjanava.biswas/nodejs-runtime-environment-with-aws-lambda-layers-f3914613e20e

票数 2
EN

Stack Overflow用户

发布于 2020-11-14 05:16:59

为了寻址你的模块,你必须使用带有'/opt‘前缀的路径。如果它是你的文件,你把它打包到myLib.zip里面,里面有myLib.js,你应该这样写:

代码语言:javascript
复制
const myModule = require('/opt/myLib);

如果您插入已安装的依赖项,则上传带有node_modules文件夹和地址的node_modules.zip为:

代码语言:javascript
复制
const module = require('/opt/node_modules/lib_name');
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53788753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档