如何在 AWS CDK 堆栈中压缩 Node Lambda 依赖项?

How can I zip Node Lambda dependencies in AWS CDK stack?

我正在使用 CDK 使用 API Gateway、Lambda 和 DynamoDB 创建一个简单的无服务器项目。到目前为止看起来很酷,但是当我向 Lambda 添加外部依赖项时出现以下错误:

"Runtime.ImportModuleError: Error: Cannot find module './uuid-random'",

为清楚起见,我不是在询问此错误的问题所在,因为这已得到充分记录。我正在寻求帮助,因为到目前为止我尝试压缩依赖项都失败了。

我已经做了研究,在这种情况下我并不孤单。但是,我对要走的路有点困惑。我需要捆绑我的依赖项,但到目前为止的所有示例对于我正在做的事情来说都相当复杂,并且 none 个示例适合。我也看到了使用 fromAsset 的建议,但这也没有用(cdk deploy 只是挂起)。所以,我真的很感激任何帮助解决这个看似简单的问题。 TIA.

项目结构:

bin/
  cdkProject.js
handlers/
  api.js
lib/
  cdkProject-stack.js
node_modules/
test/
.gitignore
cdk.json
package.json
tsconfig.json

Lambda (api.js)

const AWS = require("aws-sdk");
const db = new AWS.DynamoDB;
const TABLE_NAME = process.env.TABLE_NAME || "";
const PRIMARY_KEY = process.env.PRIMARY_KEY || "";
const uuid = require('./uuid-random');

async function postProduct(event) {

  const params = {
    TableName: TABLE_NAME,
    Item: {
      "id": {
        S: uuid()
      },
      "name": {
        S: "Test Product 1"
      },
      "price": {
        N: "1.55"
      },
      "tags": {
        SS: [ "tag1","tag2" ] 
      } 
    }
  };

  try {
    const response = await db 
      .putItem(params)
      .promise()
      .then(res => res)
      .catch(err => err);
    console.log(JSON.stringify(response, undefined, 2));
    return JSON.stringify(response, undefined, 2)
  } catch (err) {
    console.log(JSON.stringify(err, undefined, 2));
  }
}

module.exports = {
  postProduct
}

理想情况下,每个 lambda 都需要自己的 package.json,其中包含自己的依赖项。

cdk 代码会将其引用到 lambda 文件夹,如

const fn = new lambda.Function(this, "MyFunction", {
  runtime: lambda.Runtime.NODEJS_12_X,
  handler: "index.handler",
  code: lambda.Code.fromAsset(path.join("./handlers/test-uuid/")),
});

使用 @aws-cdk/aws-lambda-nodejs 构造,它将使用 esbuild 捆绑您的 lambda 代码和所有依赖项。

默认情况下,构造将使用 Docker 版本的 esbuild。但是,如果您明确将 esbuild 添加到您的项目 deps,那么它将使用本地版本,您将不需要 Docker.

每当创建 lambda 函数时,如果您在 lambda 处理函数中导入了外部依赖项,则应确保包含处理函数的文件夹具有 package.json 文件。

然后,在该文件夹中,您可以 运行 npm install 生成一个 node_modules 文件夹,其中包含基于 package.json

安装的所有依赖项
bin/
  cdkProject.js
handlers/
  package.json
  api.js
  node_modules/
    ... installed dependencies
lib/
  cdkProject-stack.js
node_modules/
test/
.gitignore
cdk.json
package.json
tsconfig.json

最后,将 lambda.Code.fromAsset 指向 handlers 文件夹。