首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >AWS Lambda: NodeJs自定义层

AWS Lambda: NodeJs自定义层
EN

Stack Overflow用户
提问于 2020-05-06 15:20:51
回答 1查看 898关注 0票数 1

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

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

代码语言:javascript
代码运行次数:0
运行
复制
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",

@定制/服务模块package.json包含以下内容:

代码语言:javascript
代码运行次数:0
运行
复制
{
  "name": "@common/service",
  "version": "1.0.0",
  "main": "index.js",
  "license": "ISC",
  "dependencies": {
    /***
  }
}

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2021-01-14 22:04:07

尝试使用AWS Lambda层

使用层有两个主要好处。

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

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

  1. 在AWS中构建和部署一个层。一层只不过是一个“裸露”的npm项目,真的。您可以在其中安装常用的NodeJS模块,而不是其他模块。
  2. 假设您使用无服务器应用程序模型来部署AWS Lambda函数,则配置Lambda函数以使用该层。下面是SAM文件的精简版本,它说明了这一点:
代码语言:javascript
代码运行次数:0
运行
复制
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 require语法。例如,假设我将mysql库放在上面的CommonDependenciesLayer中。只要我的Lambda函数指向SAM文件中的层,我所要做的就是代码中的require('mysql')。它会在那里的。

当您开始工作时,在层部署方面有一些需要考虑的微妙之处。

  • 我是否想每次都建立这一层?(可能不是,但我建议您这样做,因为您正在学习层和Lambdas是如何一起工作的)。
  • 我的层组件多久改变一次?
  • 我想公开我的图层吗?
  • 我想从另一个帐户中使用一个公开可用的层吗?
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61638895

复制
相关文章

相似问题

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