首页 > 解决方案 > AWS Lambda:NodeJs 自定义层

问题描述

我是 nodejs 和 aws lambda 的新手。我正在尝试为我的一堆 lambda 函数创建具有常用函数的层。在 lambda 处理程序中,自定义模块的导入具有以下定义: let commonService = require('@common/service');

带有模块文件的 zip 具有以下结构:

nodejs
--node_modules
  --@custom
    --service
    --index.js
    --package.json  

但我得到了错误: "errorMessage": "Error: Cannot find module '@common/service'\nRequire stack:\n- /var/task/index.js\n- /var/runtime/UserFunction.js\n- /var/runtime/index.js",

@custom/service模块 package.json 包含以下内容:

{
  "name": "@common/service",
  "version": "1.0.0",
  "main": "index.js",
  "license": "ISC",
  "dependencies": {
    /***
  }
}

提前致谢!

标签: node.jsaws-lambdaaws-lambda-layers

解决方案


尝试使用AWS Lambda 层

使用图层有两个主要好处。

  • 它允许您将基本依赖项部署在一个地方并集中管理它们。
  • 它缩小了您的 Lambda 应用程序部署的大小。无需node_modules每次上传大量文件夹层次结构。

如何使用它们?这是一个相当深入的话题,但它的要点是您可以:

  1. 在 AWS 中构建和部署一个层。一个 Layer 只不过是一个“裸”的 npm 项目,真的。您在其中安装常用的 NodeJS 模块,仅此而已。
  2. 假设您使用无服务器应用程序模型来部署 AWS Lambda 函数,您可以将 Lambda 函数配置为使用该层。这是 SAM yaml 文件的精简版本,它说明了这一点:
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: My Serverless App
Parameters:
  # ...

Globals:
  Function:
    Runtime: nodejs10.x
  #   Environment:
  #     Variables:
  #       NODE_ENV: test

Resources:

  CommonDependenciesLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
      LayerName: my-common-deps
      Description: Common dependencies for my NodeJS apps
      ContentUri: ../common-deps/
      RetentionPolicy: Retain
    Metadata:
      BuildMethod: nodejs10.x

  performSomeFunction:
    Type: 'AWS::Serverless::Function'
    Properties:
      FunctionName: performSomeFunction
      Handler: lambda.someFunction
      Layers:
        # You can either Ref a layer defined in this SAM file like this.
        # - !Ref CommonDependenciesLayer

        # ... or you can hard-code an external ARN
        # - arn:aws:lambda:us-east-1:nnnnnnnnnnnnn:layer:myapp-common-deps:5
      CodeUri: ./
      # ...
  1. 在您的 Lambda 代码中,您所做的就是使用普通的 CJS 要求语法。例如,假设我将mysql库放在我的CommonDependenciesLayer, 上面。只要我的 Lambda 函数指向 SAM 文件中的层,我所要做的就是require('mysql')在我的代码中。它会在那里。

当你开始工作时,有一些关于 Layer 部署的微妙之处需要考虑。

  • 我想每次都构建图层吗?(可能不会,但我建议您在学习 Layers 和 Lambdas 如何协同工作时这样做)。
  • 我的图层组件多久更改一次?
  • 我想公开我的图层吗?
  • 我想从另一个帐户使用公开可用的图层吗?

推荐阅读