我有一个使用serverless-framework (这)来定义要使用的AWS资源的项目。我有各种.yml文件,它们描述了项目需要运行的每个资源。
最近,我不得不为我的lambda安装了几个NPM包,它们变得非常大(大于3MB),因此从控制台上看不出代码。
因为在每个lambda中包含node_modules并不是最好的实践,而且它们是非常沉重的,所以我想知道如何使用Lambda层在Lambda之间共享node_modules。
作为.yml,我在它们之间都有一个名为provider.yml的共享结构,类似于:
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)的文件,它是我用来部署的文件:
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:
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在项目中应该在哪里进行呢?现在这个项目是这样的:
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的最佳实践是什么?
发布于 2022-02-24 22:06:38
一般来说,使用Lambda层是存储共享代码的好方法,因为您可以减少冗余并保持部署包的大小。也可以使用Serverless框架创建层,因此可以将它们包含到现有的模板中,并由Serverless/CloudFormation管理它们。这里有一个指向文档的链接,其中包含配置示例和说明。下面是如何向serverless.yaml文件中添加层的一个示例:
layers:
NodeModules:
path: layer
package:
artifact: layer.zip
name: layer
compatibleRuntimes:
- nodejs12.x
- nodejs14.x
functions:
- ${file(./serverless-functions.yml)}然后,从serverless-functions.yaml文件中的每个Lambda函数中,您可以引用该层,如下所示:
lambdaName:
handler: src/handlers/auth/example.run
name: ${self:custom.base}lambdaName
layers:
- { Ref: NodeModulesLambdaLayer }https://stackoverflow.com/questions/71219386
复制相似问题