如何在使用 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