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

joh*_*mac 3 node.js node-modules aws-lambda aws-cdk

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

"Runtime.ImportModuleError: Error: Cannot find module './uuid-random'",
Run Code Online (Sandbox Code Playgroud)

为了清楚起见,我并不是在问这个错误的问题是什么,因为这是有详细记录的。我正在寻求帮助,因为到目前为止我尝试压缩依赖项失败了。

我已经做了研究,而且我并不是唯一遇到这种情况的人。然而,我有点困惑该走哪条路。我需要捆绑我的依赖项,但到目前为止,所有示例对于我正在做的事情来说都相当复杂,并且没有一个示例适合。我还看到了使用的建议fromAsset,但这也不起作用(cdk部署刚刚挂起)。因此,我非常感谢任何帮助解决这个看似简单的问题的帮助。TIA。

项目结构:

bin/
  cdkProject.js
handlers/
  api.js
lib/
  cdkProject-stack.js
node_modules/
test/
.gitignore
cdk.json
package.json
tsconfig.json
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*ala 9

理想情况下,每个 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/")),
});
Run Code Online (Sandbox Code Playgroud)


mol*_*tar 8

使用aws-cdk-lib/aws-lambda-nodejs(以前的@aws-cdk/aws-lambda-nodejsCDK v1 - 现在已弃用)构造,它将使用 esbuild 捆绑您的 lambda 代码和所有依赖项。

\n

默认情况下,构建将使用 esbuild 的 Docker 版本。但是,如果您明确地将 esbuild 添加到项目 deps 中,那么它将使用本地版本,并且您将\xe2\x80\x99 不需要 Docker。

\n