如何使用 lerna 将 monorepo 代码部署到 AWS Lambda?

Cra*_*bby 5 amazon-web-services aws-lambda lerna

我正在尝试制作两个 AWS Lambda 函数(用打字稿编写)。这两个函数共享用于与 API 交互的相同代码。为了不必将相同的代码复制到两个不同的 Lambda,我想将我的共享代码移动到本地模块,并使我的两个 Lambda 都依赖于该模块。

我最初尝试在两个 lambda 之间启动代码是使用 monorepo 和 lerna。我当前的项目结构如下所示:

- lerna.json
- package.json
- packages
  - api
    - package.json
  - lambdas
    - funcA
      - package.json
    - func B
      - package.json
Run Code Online (Sandbox Code Playgroud)

lerna.json:

{
  "packages": [
    "packages/api",
    "packages/lambdas/*"
  ],
  "version": "1.0.0"
}
Run Code Online (Sandbox Code Playgroud)

在我的 Lambda 函数的每个 package.json 中,我能够包含我的本地 api 模块,如下所示:

"dependencies": {
    "@local/api": "*"
}
Run Code Online (Sandbox Code Playgroud)

有了这个,我已经能够将公共代码移动到它自己的模块中。但是,我现在不确定如何捆绑我的函数以部署到 AWS Lambda。lerna 有没有办法创建一个可以部署的包?

Tom*_*ies 0

运行lerna bootstrap将在每个“包”中创建一个node_modules文件夹。这将包括所有 lerna 管理的依赖项以及该特定包的外部依赖项。

从那时起,您对每个 lambda 的部署将与您使用 lerna 的事实无关。部署包需要包含该特定 lambda 的代码以及该 lambda 的 node_modules 文件夹 - 您可以压缩它们并手动上传它们,或者使用 SAM 或 CloudFormation 等工具。

编辑:正如您正确指出的那样,您最终会在 node_modules 文件夹中得到符号链接,这使得打包变得很困难。为了解决这个问题,您可以在打包部署之前运行类似的命令:

cp -rL lambdas/funcA/node_modules lambdas/funcA/packaged/node_modules
Run Code Online (Sandbox Code Playgroud)

-L将强制将符号链接目录复制到文件夹中,然后您可以对其进行压缩。