【问题标题】:AWS Lambda: NodeJs custom layerAWS Lambda:NodeJs 自定义层
【发布时间】:2020-08-21 15:12:52
【问题描述】:

我是 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.js aws-lambda aws-lambda-layers


    【解决方案1】:

    尝试使用AWS Lambda Layers

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

    • 它允许您将基础依赖项部署在一个地方并集中管理它们。
    • 它缩小了您的 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 如何协同工作)。
    • 我的图层组件多久更换一次?
    • 我想公开我的图层吗?
    • 我想从另一个帐户使用公开可用的图层吗?

    【讨论】:

      猜你喜欢
      • 2013-08-07
      • 2020-02-10
      • 1970-01-01
      • 1970-01-01
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 2021-03-21
      相关资源
      最近更新 更多