我正在尝试为 AWS Lambda 创建一个 Python 函数,该函数使用passlib
使用 库进行密码哈希处理argon2
。为此,我使用pip
在本地目录中安装以下软件包,将它们与我的 Python 文件一起压缩,然后上传到 Lambda:
passlib==1.7.1
argon2-cffi==18.1.0
cffi==1.11.5
pycparser==2.18
six==1.11.0
这些包足以让我在本地 Ubuntu 环境中使用argon2
。passlib
但是,我在 Lambda 中测试时一直收到以下错误:
File "/var/task/my-function.py", line 41, in handler
if argon2.verify(password, hash):
File "/var/task/passlib/handlers/argon2.py", line 525, in verify
cls._stub_requires_backend()
File "/var/task/passlib/utils/handlers.py", line 2221, in _stub_requires_backend
cls.set_backend()
File "/var/task/passlib/utils/handlers.py", line 2143, in set_backend
raise default_error
passlib.exc.MissingBackendError: argon2: no backends available -- recommend you install one (e.g. 'pip install argon2_cffi')
在 Lambda 控制台中,似乎一切都按预期上传。
我非常想知道如何正确地为 Lambda 打包我的 Python 应用程序,但也接受在 Lambda 中进行密码哈希和哈希验证的其他方法argon2
。bcrypt
在此先感谢大家的帮助!
答案1
事实证明,我在创建 .zip 存档时并未包含所有必需的文件,如下所述:https://stackoverflow.com/questions/38963857/import-error-from-cyptography-hazmat-bindings-constant-time-import-lib
在调试过程中,我创建了一个 Amazon Linux 环境来安装/编译库,以实现最大程度的 Lambda 兼容性。因此,我打包 Lambda 函数的过程现在如下所示:
- 启动 Amazon Linux 环境(例如 Docker)。
- 使用
yum
安装zip
、、libffi-devel
所需的 Python 版本(我使用了python36
)和virtualenv
。 - 创建并激活虚拟环境。使用 安装所有 Python 包
pip
。 创建一个包含 Lambda 函数和虚拟环境中所有站点包的 .zip 档案。例如:
zip -9 lambda.zip myfunction.py cd venv/lib/python3.6/site-packages/ zip -r9 ../../../../lambda.zip . cd ../../../lib64/python3.6/site-packages/ zip -r9 ../../../../lambda.zip
上传
lambda.zip
到 AWS Lambda。