首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用lambda层+云形成在Lambda之间共享node_modules文件夹

使用lambda层+云形成在Lambda之间共享node_modules文件夹
EN

Stack Overflow用户
提问于 2022-02-22 10:12:10
回答 1查看 1K关注 0票数 0

我有一个使用serverless-framework ()来定义要使用的AWS资源的项目。我有各种.yml文件,它们描述了项目需要运行的每个资源。

最近,我不得不为我的lambda安装了几个NPM包,它们变得非常大(大于3MB),因此从控制台上看不出代码。

因为在每个lambda中包含node_modules并不是最好的实践,而且它们是非常沉重的,所以我想知道如何使用Lambda层在Lambda之间共享node_modules。

作为.yml,我在它们之间都有一个名为provider.yml的共享结构,类似于:

代码语言:javascript
复制
name: aws
runtime: nodejs14.x
lambdaHashingVersion: 20201221
region: ${opt:region, "eu-central-1"}
stage: ${opt:stage, "dev"}
profile: ${self:custom.profiles.${self:provider.stage}}
deploymentBucket:
 name: avatar-${self:provider.stage}-deploymentbucket
 versioning: true
 blockPublicAccess: true
environment:
 EXAMPLE_ENV_VAR: ${self:custom.baseResource}-envvar
USERPOOL:
 'Fn::ImportValue': ${self:custom.baseResource}-userPoolId
APP_CLIENT_ID:
 'Fn::ImportValue': ${self:custom.baseResource}-userPoolClientId
iamRoleStatements:
 - Effect: Allow
 Action:
  - dynamodb:Query
  - ...
Resource: "*"

然后,我有一个包含provider.yml和所有lambda(称为provider.yml)的文件,它是我用来部署的文件:

代码语言:javascript
复制
service: listOfLambdas
app: appname
frameworkVersion: '2'
projectDir: ../../

provider: ${file(../../resources/serverless-shared-config/provider.yml)}

package:
 individually: true
 exclude:
  - "**/*"

functions:
 - ${file(./serverless-functions.yml)}

最后,我有包含Lambdas结构的无服务器函数the:

代码语言:javascript
复制
lambdaName:
handler: src/handlers/auth/example.run
name: ${self:custom.base}lambdaName
description: Lambda description
events:
 - httpApi:
     method: POST
     path: /api/v1/example
package:
 include:
   - ../../node_modules/**

这包括Lambda中的node_modules文件夹。

如何创建具有由Cloud管理的YML模板的资源,以创建一个Lambda层,我可以将所有的Lambda分配给该层,以便它们共享node_modules文件夹。我希望必须在资源文件夹中创建一个新的serveless.yml,并使用CloudFormation YML模板将其绑定到我的lambda。

我需要由CloudFormation来管理它,这样我就可以使用项目所使用的所有资源建立一个公共堆栈,这样我就可以在启动时部署它。

那么,node_modules在项目中应该在哪里进行呢?现在这个项目是这样的:

代码语言:javascript
复制
Root
|_ lib
|_ node_modules
|_ resources
   |_serverless-shared-config
     |_provider.yml
   |_s3
     |_serverless.yml
   |_apigateay 
   |_ ... 
|_ services
   |_ lambda
      |_ src
         |_ index.js
         |_ ...
      |_ serverless.yml
      |_ serverless-functions.yml

为了解决这个问题,我在哪里可以找到一个模板?或者,在Lambdas之间共享node_modules的最佳实践是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-24 22:06:38

一般来说,使用Lambda层是存储共享代码的好方法,因为您可以减少冗余并保持部署包的大小。也可以使用Serverless框架创建层,因此可以将它们包含到现有的模板中,并由Serverless/CloudFormation管理它们。这里有一个指向文档的链接,其中包含配置示例和说明。下面是如何向serverless.yaml文件中添加层的一个示例:

代码语言:javascript
复制
layers:
  NodeModules:
    path: layer
    package:
      artifact: layer.zip
    name: layer
    compatibleRuntimes:
      - nodejs12.x
      - nodejs14.x

functions:
 - ${file(./serverless-functions.yml)}

然后,从serverless-functions.yaml文件中的每个Lambda函数中,您可以引用该层,如下所示:

代码语言:javascript
复制
lambdaName:
  handler: src/handlers/auth/example.run
  name: ${self:custom.base}lambdaName
  layers:
    - { Ref: NodeModulesLambdaLayer }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71219386

复制
相关文章

相似问题

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