【问题标题】:How to bundle Python Lambdas with shared files and different dependencies?如何将 Python Lambda 与共享文件和不同的依赖项捆绑在一起?
【发布时间】:2021-07-28 08:11:05
【问题描述】:

在使用 CDK 部署 Lambda 函数时,我遇到了一些明显相互矛盾的问题:

  1. 我希望整个项目的所有依赖项都安装在我的本地代码副本中的单个 virtualenv 中,以便 IDE 可以一次性索引所有内容。这是通过项目级别的 pyproject.toml 和poetry.lock 完成的。
  2. 我只想为每个 Lambda 函数安装 最小 依赖项。这是通过对每个 Lambda 函数使用 Poetry“附加”来完成的,并且在捆绑每个 Lambda 函数时只安装相关的附加。
  3. 我想在 Lambda 之间共享代码,方法是将共享文件放入它们的公共父目录中。

我这样做currently 的方式很笨拙:

bundling_options = BundlingOptions(
    image=aws_lambda.Runtime.PYTHON_3_8.bundling_docker_image,
    command=["backend/bundle.bash", directory],
)
return aws_lambda.Code.from_asset(path=".", bundling=bundling_options)

bundle.bash

  1. 使用poetry export将Poetry相关条目转换为pip requirements.txt格式并使用pip install --target=/asset-output安装(因为Poetry不支持安装到特定目录),然后
  2. 将文件从directory 及其父目录(共享文件)复制到/asset-output。

我必须使用上面的path=".",因为Docker容器需要从项目的根目录读取pyproject.toml和poetry.lock。这似乎导致了另一个问题,对整个存储库中的任何文件的任何更改都会导致重新部署每个 Lambda 函数。这是我寻找替代品的主要原因。

是否有更好的方法在 CDK 中的 Lambda 函数之间共享文件,其中 Lambda 函数具有不同的依赖关系?

一些不好的选择:

  • 我认为我不能使用 PythonFunction,因为它假定 requirements.txt 文件位于根目录中(在 Lambda 函数之间共享)。
  • 我不想复制包列表,因此将所有包放在根配置中,并将相关包复制到每个 Lambda 函数的 requirements.txt 文件中。
  • 我不想在捆绑时进行任何可怕的代码重写,例如将所有共享代码移动到子目录并更改从它们的导入。
  • 针对每次重新部署的特定问题的解决方法是在 from_asset 中指定 asset_hash。不幸的是,这增加了相当大的脆弱性和复杂性(散列每个可能相关的文件)而不是简化。
  • 在 Docker 外部手动进行捆绑。这也将是半复杂的(从外观上看与现在大致相同)并且比在 Docker 中捆绑更脆弱。我还必须对源文件进行哈希处理,而不是对生成的文件进行哈希处理,因为 Pip 安装通常是 not reproducible(我发现同一软件包的两次安装到不同目录之间存在很多差异)。

【问题讨论】:

    标签: python amazon-web-services aws-lambda aws-cdk


    【解决方案1】:

    我建议您使用 Lambda 层,您应该将所有依赖项安装在一个名为 python 的文件夹中,您也可以在层中添加常用功能。
    要创建 AWS Lambda 层包,请执行以下步骤 -

    $ mkdir python
    $ cd python
    $ pip install -r requirements.txt -t .
    

    一旦您安装了这些依赖项,就会将其变成一个名为 python.zipzip 文件。现在,您可以创建 Lambda 层,并且可以将这个 python.zip 上传到那里。现在,您可以像往常一样在 Lambda 函数中导入包。
    AWS Lambda Layers

    【讨论】:

    • 我已经有一个 botocore 层,但决定反对这种方法,因为它违反了只安装您需要的东西而不是任何服务所需的一切的标准建议。
    猜你喜欢
    • 2013-11-02
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    相关资源
    最近更新 更多