【问题标题】:module initialization error: Cannot load native module 'Crypto.Cipher._raw_ecb' at AWS lambda模块初始化错误:无法在 AWS lambda 加载本机模块“Crypto.Cipher._raw_ecb”
【发布时间】:2019-01-31 18:30:42
【问题描述】:

我正在使用 AWS lambda 提供服务。我正在使用 PyCryptodome 进行加密和解密。我可以在本地测试我的应用程序,但是当我上传到 AWS lambda 进行解密时。我得到的错误是

模块初始化错误:无法加载本机模块“Crypto.Cipher._raw_ecb”:尝试“_raw_ecb.cpython-36m-x86_64-linux-gnu.so”:/var/task/Cryptodom/Util/../Cipher/ _raw_ecb.cpython-36m-x86_64-linux-gnu.so:无法打开共享对象文件:没有这样的文件或目录,正在尝试“_raw_ecb.abi3.so”:/var/task/Cryptodome/Util/../Cipher/_raw_ecb .abi3.so:无法打开共享对象文件:没有这样的文件或目录,正在尝试“_raw_ecb.so”:/var/task/Cryptodome/Util/../Cipher/_raw_ecb.so:无效的 ELF 标头

我的解密代码是

    def blowfish_decrypt(enc):
        secret_key = b"somestring"
        iv = b"somerandomiv"
        logger.info("in the decrypter")
        crypt_obj = bf_cbc.new(secret_key, bf_cbc.MODE_CBC, IV=iv)
        original = crypt_obj.decrypt(base64.b64decode(enc))
        original = original.decode("utf-8")
        logger.info("decrypted")
        return original

我在关注资源:https://github.com/pyinstaller/pyinstaller/issues/2125,但这对我也没有帮助。

在应用指定的所有详细信息后,我得到了与上述相同的错误。

【问题讨论】:

  • 您是如何构建库以及如何部署 Lambda 的?
  • 我将 lambda 函数和所需的库打包成一个 zip,然后将其上传到 AWS lambda。使用 pip install pycryptodome -t . ,将库收集在 lambda 函数所在的同一文件夹中。

标签: python-3.x amazon-web-services aws-lambda


【解决方案1】:

您的本地开发环境似乎与 Lambda 执行环境不兼容。 PyCryptodome 使用的本机库不能在这两种环境中移植; pip 安装在哪个环境中很重要。

修复它的一种方法是使用Lambci docker 映像来构建库,然后将其添加到 zip 文件中。假设您已安装 Docker,请执行

docker pull lambci/lambda:build-python3.6
docker run --rm -v `pwd`:/var/task lambci/lambda:build-python3.6 pip install pycryptodome -t pycryptodome

这将在 docker 环境中 pip 安装 lib。命令完成后,您将在 pycryptodome 本地目录中使用它。

如需更自动化/可重复的方式,请查看AWS SAMaws-sam-cli,它们为您提供了一些非常有用的命令来构建、打包和部署您的 Lambda 应用程序。

【讨论】:

  • 虽然我也无法从 python 3.6 运行其他一些模块,所以我不得不迁移到 2.7 并使用 lambci 完成了我的工作,感谢 Milan。
【解决方案2】:

发生这种情况是因为安装在本地计算机上的 pycryptodome 模块在 lambda 中不兼容。所以我们有两种方法可以解决这个问题。

  1. 使用 docker 拉取 amazonlinux 镜像并使用 pip install 安装 pycryptodome。然后将 pycryptodome 模块导出到 lambda 层。
  2. 启动一个ec2实例,必须是amazonlinux并在里面安装pycryptodome。然后使用 winscp 或 cli 将模块下载到本地。使用下载的模块创建一个 lambda 层包并将其上传到 lambda 层。

确保遵循以下指南来创建 lambda 层包。 Import libraries in lambda layers

【讨论】:

    【解决方案3】:

    我在 AWS Lambda 上成功安装并运行了 cryptodome 3.9.4(仅限 Python 3.6)。

    我把包放在github上。需要将其放入您的微服务中。

    https://github.com/grmagalhaes/python-utilities/tree/master/Crypto

    【讨论】:

      猜你喜欢
      • 2021-02-10
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多