使用AWS SAM时,我曾经运行过build
命令,该命令将遍历我所有的Lambda函数包并安装它们的依赖项(在它们上运行npm install
)。
如何使用AWS CDK实现相同的行为?它似乎不是自动执行的,还是我缺少了什么?
答案 0 :(得分:2)
您可以使用这样的本地构建脚本轻松完成此操作:
const websiteRedirectFunction = new lambda.Function(
this,
"RedirectFunction",
{
code: lambda.Code.fromAsset(path.resolve(__dirname, "../../redirect"), {
bundling: {
command: [
"bash",
"-c",
"npm install && npm run build && cp -rT /asset-input/dist/ /asset-output/",
],
image: lambda.Runtime.NODEJS_12_X.bundlingDockerImage,
user: "root",
},
}),
handler: "index.redirect",
tracing: lambda.Tracing.ACTIVE,
runtime: lambda.Runtime.NODEJS_12_X,
}
);
假设您有一个要为 Lambda 构建和上传处理程序和 node_modules 的文件夹。
来自the docs:
<块引用>使用 lambda.Code.fromAsset(path) 时,可以通过在 Docker 容器中运行命令来捆绑代码。资产路径将安装在 /asset-input。 Docker 容器负责将内容放在 /asset-output 中。 /asset-output 中的内容将被压缩并用作 Lambda 代码。
答案 1 :(得分:1)
它不会自动执行 您需要将它们打包。然后,您将可以使用fromAsset或fromBucket来将代码连接到该函数
答案 2 :(得分:1)
此功能确实缺失。您需要编写自己的包装。请记住,如果任何依赖项(例如Numpy)使用带有本机C代码的共享库,则lambda依赖项必须在与AWS(Linux)中的目标系统具有相同体系结构的系统上构建。
有一个可用的Docker映像,旨在提供一个尽可能接近AWS的环境:lambci/lambda:build-python3.7
因此,如果您要在任何非Linux体系结构上构建,则可能需要一些更复杂的lambda函数。
编辑:我将用于lambda打包的Python代码开源:https://gitlab.com/josef.stach/aws-cdk-lambda-asset
答案 3 :(得分:1)
aws-cdk
中有(目前是实验性的)模块可以解决 Python 的问题。
查看更多here。
答案 4 :(得分:0)
我使用SAM创建了一个单独的项目 将所有需求放入您的app.py旁边的requirements.txt中
然后运行sam build --build-dir packaged
packaged
目录将包含具有相关性的打包工件。
那么您在CDK中要做的就是 ` 从aws_cdk导入( 核心, aws_lambda as lambda _)
.....
lambdaFn = lambda_.Function(
self, "DocManAuth",
handler="app.lambda_handler",
code=lambda_.Code.asset("../auth/packaged/DocManAuthFunction"),
timeout=core.Duration.seconds(30),
runtime=lambda_.Runtime.PYTHON_3_7,
)
core.CfnOutput(self, 'Authorizer Function',
value=lambdaFn.function_name)
`
有关完整的项目,请访问 docman