如何在使用 AWS CDK 构建 cdk 时安装 lambda 函数的依赖项
How to install dependencies of lambda functions upon cdk build with AWS CDK
使用 AWS SAM 时,我曾经使用 运行 build
命令遍历我所有的 Lambda 函数包并安装它们的依赖项(运行 npm install
).
如何使用 AWS CDK 实现相同的行为?它似乎不会自动执行,还是我遗漏了什么?
它不会自动执行
您需要将它们打包。然后您就可以使用 fromAsset 或 fromBucket 将代码连接到函数
确实缺少此功能。您需要编写自己的包装。请记住,如果任何依赖项(例如 Numpy)使用带有本机 C 代码的共享库,则 lambda 依赖项必须构建在与 AWS 中的目标系统具有相同架构的系统上(Linux)。
有一个 Docker 图像可用,旨在提供尽可能接近 AWS 的环境:lambci/lambda:build-python3.7
因此,如果您在任何非 Linux 架构上构建,您可能需要它来实现一些更复杂的 lambda 函数。
编辑:我开源了我的 Python lambda 打包代码:https://gitlab.com/josef.stach/aws-cdk-lambda-asset
我使用 SAM 创建了一个单独的项目
将所有要求放在 requirements.txt 和 app.py
旁边
然后 运行 sam build --build-dir packaged
packaged
目录将包含带有依赖项的打包工件。
那么你在你的cdk中所要做的就是
`
从 aws_cdk 导入 (
核,
aws_lambda 作为 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)
`
完整项目请访问
医生
您可以使用像这样的本地构建脚本轻松完成此操作:
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,
}
);
假设您有一个要构建和上传处理程序的文件夹,node_modules 用于 Lambda。
来自the docs:
When using lambda.Code.fromAsset(path) it is possible to bundle the code by running a command in a Docker container. The asset path will be mounted at /asset-input. The Docker container is responsible for putting content at /asset-output. The content at /asset-output will be zipped and used as Lambda code.
aws-cdk
中有(目前处于试验阶段)模块解决了 Python 的问题。
查看更多here.
对于使用 Python 的任何人。 (直到 aws-lambda-python 库是 ready)
将函数依赖项直接安装到 CDK 项目的 lambda 函数文件夹中。
pip install --target ./ -r ./requirements.txt
需求文本只是依赖项列表:
requests==2.27.1
然后运行:
cdk deploy
将部署 lambda 函数文件夹中的所有内容:
- 依赖项,
- 函数代码,
- Requirements.txt等
这里有更多详细信息:
https://docs.aws.amazon.com/lambda/latest/dg/python-package.html
使用 AWS SAM 时,我曾经使用 运行 build
命令遍历我所有的 Lambda 函数包并安装它们的依赖项(运行 npm install
).
如何使用 AWS CDK 实现相同的行为?它似乎不会自动执行,还是我遗漏了什么?
它不会自动执行 您需要将它们打包。然后您就可以使用 fromAsset 或 fromBucket 将代码连接到函数
确实缺少此功能。您需要编写自己的包装。请记住,如果任何依赖项(例如 Numpy)使用带有本机 C 代码的共享库,则 lambda 依赖项必须构建在与 AWS 中的目标系统具有相同架构的系统上(Linux)。
有一个 Docker 图像可用,旨在提供尽可能接近 AWS 的环境:lambci/lambda:build-python3.7
因此,如果您在任何非 Linux 架构上构建,您可能需要它来实现一些更复杂的 lambda 函数。
编辑:我开源了我的 Python lambda 打包代码:https://gitlab.com/josef.stach/aws-cdk-lambda-asset
我使用 SAM 创建了一个单独的项目 将所有要求放在 requirements.txt 和 app.py
旁边然后 运行 sam build --build-dir packaged
packaged
目录将包含带有依赖项的打包工件。
那么你在你的cdk中所要做的就是 ` 从 aws_cdk 导入 ( 核, aws_lambda 作为 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)
`
完整项目请访问 医生
您可以使用像这样的本地构建脚本轻松完成此操作:
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,
}
);
假设您有一个要构建和上传处理程序的文件夹,node_modules 用于 Lambda。
来自the docs:
When using lambda.Code.fromAsset(path) it is possible to bundle the code by running a command in a Docker container. The asset path will be mounted at /asset-input. The Docker container is responsible for putting content at /asset-output. The content at /asset-output will be zipped and used as Lambda code.
aws-cdk
中有(目前处于试验阶段)模块解决了 Python 的问题。
查看更多here.
对于使用 Python 的任何人。 (直到 aws-lambda-python 库是 ready)
将函数依赖项直接安装到 CDK 项目的 lambda 函数文件夹中。
pip install --target ./ -r ./requirements.txt
需求文本只是依赖项列表:
requests==2.27.1
然后运行:
cdk deploy
将部署 lambda 函数文件夹中的所有内容:
- 依赖项,
- 函数代码,
- Requirements.txt等
这里有更多详细信息:
https://docs.aws.amazon.com/lambda/latest/dg/python-package.html