gpt4 book ai didi

node.js - 使用 Lambda Layers + Cloud Formation 在 lambda 之间共享 node_modules 文件夹

转载 作者:行者123 更新时间:2023-12-03 07:26:27 25 4
gpt4 key购买 nike

我有一个项目,它使用无服务器框架 ( this ) 来定义要使用的 AWS 资源。我有各种 .yml 文件,它们描述了项目运行所需的每个资源。

最近,我必须为我的 lambda 安装多个 NPM 软件包,它们已经变得非常大,以兆字节计 (>3MB),因此无法再从控制台查看代码。

由于在每个 lambda 中包含 node_modules 并不是最佳实践,而且它们非常繁重,因此我想知道是否使用 Lambda Layer 在 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(称为serverless.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 结构的 serverless-functions.yml:

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 Formation 管理的 YML 模板创建资源,以创建 Lambda 层,我可以将所有 lambda 分配给该层,以便它们共享 node_modules 文件夹。我希望必须使用 CloudFormation YML 模板 在资源文件夹内创建一个新的serveless.yml,以某种方式将我的 lambda 绑定(bind)到我的 lambda。

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

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

哪里可以找到解决此问题的模板?或者在 Lambda 之间共享 node_modules 的最佳实践是什么?

最佳答案

一般来说,使用 Lambda 层是存储共享代码的好方法,因为您可以减少冗余并保持较小的部署包大小。也可以使用 Serverless 框架创建层,因此您可以将它们包含到现有模板中并由 Serverless/CloudFormation 管理。这是documentation的链接带有配置示例和解释。以下是如何向 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 }

关于node.js - 使用 Lambda Layers + Cloud Formation 在 lambda 之间共享 node_modules 文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71219386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com