如何通过AWS CDK在CDK构建上安装lambda函数的依赖项

时间:2019-07-25 08:13:27

标签: amazon-web-services aws-cdk

使用AWS SAM时,我曾经运行过build命令,该命令将遍历我所有的Lambda函数包并安装它们的依赖项(在它们上运行npm install)。

如何使用AWS CDK实现相同的行为?它似乎不是自动执行的,还是我缺少了什么?

5 个答案:

答案 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