Lambda层node_modules

时间:2018-12-15 01:14:15

标签: node.js amazon-web-services aws-lambda

我正在创建一个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);
  });
};

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

3 个答案:

答案 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中的路径:

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

这意味着我的示例采用以下结构...

nodejs/
  node_modules/
  src/
    event.js
  package.json
template.yaml

保留sam构建支持

另外一个要警惕的陷阱……

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

    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');