进一步概述是在 NodeJS 和 Monorepo(基于 Lerna)的上下文中。
我有 AWS 堆栈,其中通过 AWS CloudFormation 部署了多个 AWS Lambda。一些 lambda 很简单(单个小模块)并且可以内联:
const someLambda = new Function(this, 'some-lambda', {
code: Code.fromInline(fs.readFileSync(require.resolve(<relative path to lambda module>), 'utf-8')),
handler: 'index.handler',
runtime: Runtime.NODEJS_12_X
});
部分没有依赖,打包如下:
const someLambda = new Function(this, 'some-lambda', {
code: Code.fromAsset(<relative path to folder with lambda>),
handler: 'index.handler',
runtime: Runtime.NODEJS_12_X
});
但据我所知,如果有相对较大的 lambda 依赖关系,我们唯一的打包方式(由 API 提出)是 @aws-cdk/aws-lambda-nodejs
:
import * as lambdaNJS from "@aws-cdk/aws-lambda-nodejs";
export function createNodeJSFunction(
scope: cdk.Construct, id: string, nodejsFunctionProps: Partial<NodejsFunctionProps>
) {
const params: NodejsFunctionProps = Object.assign({
parcelEnvironment: { NODE_ENV: 'production' },
}, nodejsFunctionProps);
return new lambdaNJS.NodejsFunction(scope, id, params);
}
对于独立包,它运行良好,但在 monorepo 的情况下,它只是卡在堆栈的 synth
上。
我只是在寻找替代方案,因为我认为捆绑 (parcel
) BE 资源不是一个好主意。
最佳答案
我已经创建了以下原始库以zip
只需要node_modules
尽管包提升
。
https://github.com/redneckz/slice-node-modules
用法(来自 monorepo 根目录):
$ npx @redneckz/slice-node-modules \
-e packages/some-lambda/lib/index.js \
--exclude 'aws-*' \
--zip some-lambda.zip
--exclude 'aws-*'
- 默认包含 AWS 运行时,因此无需打包。
关于node.js - 带有依赖项的 AWS Lambda 打包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63462705/