我想在我的 Lambda 函数中使用 smbprotocol python 库。
我尝试将其添加为部署包:
mypackage.zip
|
|--> packages
| |
| |-->pip
| |-->smbprotocol
| |-->..
|--> myscript.py
给我以下错误:
[错误] Runtime.ImportModuleError:无法导入模块 “generate_sequenceFile_submit_request”:无法导入名称“x509” 'cryptography.hazmat.bindings._rust'
我尝试创建一个图层并通过图层使用它。同样的错误。
我用来创建我的包文件夹或我的图层的requirements.txt包含:
我的图层是使用具有路径的 zip 文件创建的 \python\lib\python3.9\site-packages\
(我通过运行以下命令创建了图层: 点安装。 -t \python\lib\python3.9\site-packages)
奇怪的是,当我在本地运行它时,它在我的虚拟环境中运行良好。
我正在 Windows 中开发。
我可能错过了尝试这一点,但很多人可能不知道这可能是一个问题。所以我自己来回答这个问题。
通常,如果我们要部署外部库(AWS 在 Lambda 实例中默认不提供的库),我们会使用 Lambda 部署包。
Lambda 部署包是一个 zip 文件,其中包含位于其根目录的 Lambda 代码以及位于名为 packages 的文件夹中的代码所需的 Python 库。
mypackage.zip
|
|--> packages
| |
| |-->pip
| |-->smbprotocol
| |-->..
|--> myscript.py
或者有些人还想使用他们使用依赖项创建的 Lambda 层,然后将该层添加到 lambda 函数中。 (大多数情况下如果多个 lambda 函数使用相同的库)
以下是该层所需 zip 所需的结构。
mylayer.zip
|
|--> python
|
|-->lib
|
|-->python3.9 <your version of python>
|
|-->site-packages
|
|--> <pip should download all required libraries here>
通常,Python 库是平台无关的。但在某些情况下,事实并非如此。在这种情况下,需要在 AmazonLinux 容器中完成 pip 安装,然后再添加到 zip 中。
如果库不是平台无关的,那么在这两个选项中,您必须在 AmazonLinux 容器中运行 pip install 并使用这些库创建包。为什么选择 AmazonLinux?因为 Lambda 实例在这些容器中运行。
希望有一天这会对某人有所帮助。 :)