Lambda 层 node_modules

Jam*_*unn 7 amazon-web-services node.js 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);
  });
};
Run Code Online (Sandbox Code Playgroud)

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

RH *_*ker 8

你是如何运行你的 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

Run Code Online (Sandbox Code Playgroud)

指向本地层

SAM 开发人员指南包括一个关于使用层的页面。在我写这篇文章的时候,他们并没有真正了解如何在本地文件路径上引用图层,而是专注于对远程托管图层的引用。

我发现棘手的方面是 node.js 层的目录结构应该是......

nodejs/
  node_modules/
Run Code Online (Sandbox Code Playgroud)

...这意味着为了让您本地安装的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

Run Code Online (Sandbox Code Playgroud)

保留山姆构建支持

另一个需要警惕的问题......

关于在 中定义函数资源template.yaml,在将路径的哪些部分放入CodeUriHandler. 在某些情况下,做...

    Properties:
      CodeUri: nodejs/src/
      Handler: event.handler
Run Code Online (Sandbox Code Playgroud)

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

    Properties:
      CodeUri: nodejs/
      Handler: src/event.handler
Run Code Online (Sandbox Code Playgroud)

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


小智 2

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

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