适用于 AWS Lambda 的 Python 打包(passlib、argon2)

适用于 AWS Lambda 的 Python 打包(passlib、argon2)

我正在尝试为 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 环境中使用argon2passlib但是,我在 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 中进行密码哈希和哈希验证的其他方法argon2bcrypt在此先感谢大家的帮助!

答案1

事实证明,我在创建 .zip 存档时并未包含所有必需的文件,如下所述:https://stackoverflow.com/questions/38963857/import-error-from-cyptography-hazmat-bindings-constant-time-import-lib

在调试过程中,我创建了一个 Amazon Linux 环境来安装/编译库,以实现最大程度的 Lambda 兼容性。因此,我打包 Lambda 函数的过程现在如下所示:

  1. 启动 Amazon Linux 环境(例如 Docker)。
  2. 使用yum安装zip、、libffi-devel所需的 Python 版本(我使用了python36)和virtualenv
  3. 创建并激活虚拟环境。使用 安装所有 Python 包pip
  4. 创建一个包含 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
    
  5. 上传lambda.zip到 AWS Lambda。

相关内容