如何在 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 文件夹。
我正在使用 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 文件夹。