我目前在 AWS Lambda 上使用 Python 包时遇到问题。
我定义了一个这样的 Lambda 层:
my_layer = _lambda.LayerVersion(
self, "MyLayer",
code=_lambda.Code.from_asset("layer_code_directory"),
compatible_runtimes=[_lambda.Runtime.PYTHON_3_12],
description="Lambda Layer for common dependancies"
)
该层用于我的大多数 Lambda 共享的常见依赖项。其中之一是加密包。 pip 将requirements.txt 中的所有包安装到“layer_code_directory”中。 CDK(据我所知)将它们打包成 zip,然后上传到 lambda 层。
但是,当我尝试运行 Lambda 时,出现错误,缺少一些加密文件:
Runtime.ImportModuleError:无法导入模块“MyAuthorizer”:/opt/python/cryptography/hazmat/bindings/_rust.abi3.so:无法打开共享对象文件:没有这样的文件或目录
我通过检查该包是否可用于 Lambda 以及这些文件缺少哪些路径来对此进行调试。我用错误消息交叉检查了它们,所有文件都在正确的位置。
根据谷歌的一些研究,我现在假设,我通过 pip 在本地安装的加密版本与 lambda 运行时不兼容,据我所知,pip 根据您所在的操作系统安装不同的文件。
在我的第一次尝试中,我使用的是 Alpine(官方 Python docker 容器),现在我已经迁移到基于 AWS Python、Lambda 和 Image 的容器。我假设,当我捆绑在此环境中安装的软件包时,这些软件包将与 AWS Lambda 兼容。但我仍然收到同样的错误消息。
如何解决这个问题或者还有什么可能?
我认为,通过 AWS CDK 部署 Lambda 代码和包是一种非常常见的做法,但使用的是 Google、AWS、Docs 和 LLM。
我无法找到解决方案或工作示例。
在我看来,两件事可能是问题所在:
准备好一切后,在拉拉链之前,这样做 -
mkdir python
cp -r layer_code_directory/lib python/
zip -r layer_content.zip python
并使用 py 3.11(基于 lambda 文档)。
这些有点明显,所以如果情况并非如此,请分享您的文件结构,我将尝试使用合适的解决方案更新答案。