12

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

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

4

5 回答 5

6

您可以使用这样的本地构建脚本轻松完成此操作:

    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 的文件夹。

文档

使用 lambda.Code.fromAsset(path) 时,可以通过在 Docker 容器中运行命令来捆绑代码。资产路径将安装在 /asset-input。Docker 容器负责将内容放在 /asset-output 中。/asset-output 中的内容将被压缩并用作 Lambda 代码。

于 2020-12-19T04:45:49.577 回答
4

确实缺少此功能。您需要编写自己的包装。请记住,如果任何依赖项(例如 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

于 2019-08-23T21:03:53.307 回答
1

它不会自动执行您需要将它们打包。然后您将能够使用fromAsset或 fromBucket 将代码连接到函数

于 2019-08-21T13:37:46.627 回答
1

里面有(目前是实验性的)模块aws-cdk可以解决 Python 的问题。

在这里查看更多。

于 2021-04-01T11:07:59.717 回答
0

我使用 SAM 创建了一个单独的项目,将所有需求放在你的 app.py 旁边的 requirements.txt 中

然后 run目录将有打包的带有依赖项的工件sam build --build-dir packagedpackaged

那么你在你的 cdk 中要做的就是 ` from aws_cdk import ( core, 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

于 2020-03-18T13:32:59.103 回答