从 AWS Lambda 层导入 cffi python 模块时出错
Error importing a cffi python module from AWS Lambda Layer
我在将 argon2-cffi
python module (version 20.1.0) 从 AWS Lambda 层导入 AWS Lambda 函数时遇到问题。
这似乎适用于所有以 C 为基础的包,因为我用 pandas
测试了它并得到了相同的结果。
我的图层 cloudformation 配置如下:
MyLib:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: my-lib
Description: In-house and 3rd party dependencies for my app.
ContentUri: lambdas/lib/.
CompatibleRuntimes:
- python3.8
/lib
里面的文件夹结构是这样的:
lib
├── python
│ ├── app
│ │ └── ...
│ └── lib/python3.8/site-packages
│ ├── argon2
│ │ └── ...
│ ├── argon2_cffi-20.1.0.dist-info
│ │ └── ...
│ ├── ...
│ └── stdnum
│ └── ...
└── requirements.txt
根据 recommendations from AWS,其中文件夹 python/app
包含我的自定义库,文件夹 python/lib/python3.8/site-packages
包含第 3 方包。
我知道,由于 argon2 依赖于 C 代码,it must be installed on the runtime environment that the Lambda function using it will be hosted in,所以我使用 AWS 提供的 docker 映像,使用命令 [=] 将软件包安装到 lib/python3.8/site-packages
34=]
docker run -v "$PWD":/var/task "lambci/lambda:build-python3.8" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.8/site-packages/; exit"
我尝试 运行 的 lambda 函数在 cloudformation 模板中配置为
AuthorizerFunction:
Type: 'AWS::Serverless::Function'
Properties:
CodeUri: lambdas/handlers
Handler: authorizer.handler
Runtime: python3.8
...
Layers:
- !Ref MyLib
并从这些导入开始:
# authorizer.py
import app.utils as utils
import stdnum
from argon2 import PasswordHasher
但是当我尝试 运行 它时,出现以下错误
[ERROR] Runtime.ImportModuleError: Unable to import module 'authorizer': No module named 'argon2._ffi'
意味着 app
和 stdnum
都成功导入,但 argon2
没有。
有什么想法可能是错误的吗?
我也欢迎任何关于另一个具有久经考验的哈希算法的哈希库的建议。
更新:按照建议 here 更新我的 cffi
、pip
和 setuptools
没有成功。
更新 2:我可以看到使用 docker 命令安装的氩是 linux 兼容的,因为输出包括这些行:
Collecting argon2-cffi==20.1.0
Downloading argon2_cffi-20.1.0-cp35-abi3-manylinux1_x86_64.whl (97 kB)
好吧,我的问题的答案有点尴尬。我会 post 无论如何,它可能会加深对某人的理解。
我正在使用 git 进行源代码控制,并使用来自 VS Code 的模板作为 .gitignore
文件。此外,我已经设置了一个自动构建和部署过程,它根据 git 存储库中的内容构建 Lambda 应用程序。
经过几天尝试调试此问题后,我发现 Lambda 层的 argon2_cffi
文件夹中缺少 .so
文件。罪魁祸首是前面提到的 .gitignore
文件,其中包含以下几行:
# C extensions
*.so
难怪 none 个基于 C 的 python 软件包可以正常工作!
我从 .gitignore
中删除了上述行,并将所有 .so
文件提交到以前从未进入过 Lambda 层的 repo,现在一切正常。
我在将 argon2-cffi
python module (version 20.1.0) 从 AWS Lambda 层导入 AWS Lambda 函数时遇到问题。
这似乎适用于所有以 C 为基础的包,因为我用 pandas
测试了它并得到了相同的结果。
我的图层 cloudformation 配置如下:
MyLib:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: my-lib
Description: In-house and 3rd party dependencies for my app.
ContentUri: lambdas/lib/.
CompatibleRuntimes:
- python3.8
/lib
里面的文件夹结构是这样的:
lib
├── python
│ ├── app
│ │ └── ...
│ └── lib/python3.8/site-packages
│ ├── argon2
│ │ └── ...
│ ├── argon2_cffi-20.1.0.dist-info
│ │ └── ...
│ ├── ...
│ └── stdnum
│ └── ...
└── requirements.txt
根据 recommendations from AWS,其中文件夹 python/app
包含我的自定义库,文件夹 python/lib/python3.8/site-packages
包含第 3 方包。
我知道,由于 argon2 依赖于 C 代码,it must be installed on the runtime environment that the Lambda function using it will be hosted in,所以我使用 AWS 提供的 docker 映像,使用命令 [=] 将软件包安装到 lib/python3.8/site-packages
34=]
docker run -v "$PWD":/var/task "lambci/lambda:build-python3.8" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.8/site-packages/; exit"
我尝试 运行 的 lambda 函数在 cloudformation 模板中配置为
AuthorizerFunction:
Type: 'AWS::Serverless::Function'
Properties:
CodeUri: lambdas/handlers
Handler: authorizer.handler
Runtime: python3.8
...
Layers:
- !Ref MyLib
并从这些导入开始:
# authorizer.py
import app.utils as utils
import stdnum
from argon2 import PasswordHasher
但是当我尝试 运行 它时,出现以下错误
[ERROR] Runtime.ImportModuleError: Unable to import module 'authorizer': No module named 'argon2._ffi'
意味着 app
和 stdnum
都成功导入,但 argon2
没有。
有什么想法可能是错误的吗?
我也欢迎任何关于另一个具有久经考验的哈希算法的哈希库的建议。
更新:按照建议 here 更新我的 cffi
、pip
和 setuptools
没有成功。
更新 2:我可以看到使用 docker 命令安装的氩是 linux 兼容的,因为输出包括这些行:
Collecting argon2-cffi==20.1.0
Downloading argon2_cffi-20.1.0-cp35-abi3-manylinux1_x86_64.whl (97 kB)
好吧,我的问题的答案有点尴尬。我会 post 无论如何,它可能会加深对某人的理解。
我正在使用 git 进行源代码控制,并使用来自 VS Code 的模板作为 .gitignore
文件。此外,我已经设置了一个自动构建和部署过程,它根据 git 存储库中的内容构建 Lambda 应用程序。
经过几天尝试调试此问题后,我发现 Lambda 层的 argon2_cffi
文件夹中缺少 .so
文件。罪魁祸首是前面提到的 .gitignore
文件,其中包含以下几行:
# C extensions
*.so
难怪 none 个基于 C 的 python 软件包可以正常工作!
我从 .gitignore
中删除了上述行,并将所有 .so
文件提交到以前从未进入过 Lambda 层的 repo,现在一切正常。