【发布时间】:2021-07-28 08:11:05
【问题描述】:
在使用 CDK 部署 Lambda 函数时,我遇到了一些明显相互矛盾的问题:
- 我希望整个项目的所有依赖项都安装在我的本地代码副本中的单个 virtualenv 中,以便 IDE 可以一次性索引所有内容。这是通过项目级别的 pyproject.toml 和poetry.lock 完成的。
- 我只想为每个 Lambda 函数安装 最小 依赖项。这是通过对每个 Lambda 函数使用 Poetry“附加”来完成的,并且在捆绑每个 Lambda 函数时只安装相关的附加。
- 我想在 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)
- 使用
poetry export将Poetry相关条目转换为pip requirements.txt格式并使用pip install --target=/asset-output安装(因为Poetry不支持安装到特定目录),然后 - 将文件从
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