Python 3.x 模块初始化错误:无法加载本机模块';加密。密码。原始的欧洲中央银行';在AWS lambda

Python 3.x 模块初始化错误:无法加载本机模块';加密。密码。原始的欧洲中央银行';在AWS lambda,python-3.x,amazon-web-services,aws-lambda,Python 3.x,Amazon Web Services,Aws Lambda,我正在使用AWS lambda进行服务。我使用PyCryptodome进行加密和解密。我可以在本地测试我的应用程序,但当我上传到AWS lambda进行解密时。我得到的错误是 模块初始化错误:无法加载本机模块“Crypto.Cipher.\u raw\u ecb”:尝试“\u raw\u ecb.cpython-36m-x86\u 64-linux-gnu.so”:/var/task/Cryptodome/Util/。/Cipher/\u raw\u ecb.cpython-36m-x86\u

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

模块初始化错误:无法加载本机模块“Crypto.Cipher.\u raw\u ecb”:尝试“\u raw\u ecb.cpython-36m-x86\u 64-linux-gnu.so”:/var/task/Cryptodome/Util/。/Cipher/\u raw\u ecb.cpython-36m-x86\u 64-linux-gnu.so”:无法打开共享对象文件:没有这样的文件或目录,尝试“\u raw\u ecb.abi3.so”:/var/task/Cryptodome/Util/。/Cipher/\u raw\u ecb.abi3.so:无法打开共享对象文件:没有这样的文件或目录,尝试“\u raw\u ecb.so”:/var/task/Cryptodome/Util/。/Cipher/\u raw\u 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
我在跟踪资源:,但这对我也没有帮助


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

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

修复此问题的一种方法是使用docker image构建库,然后将其添加到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本地目录中获得它


要获得更自动化/可重复的方式,请查看和,它为您提供了一些非常有用的命令来构建、打包和部署Lambda应用程序。

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

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


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

  • 使用docker拉取amazonlinux映像,并使用pip安装pycryptodome。然后将pycryptodome模块导出到lambda层
  • 启动一个ec2实例,必须是amazonlinux并在其中安装pycryptodome。然后,使用winscp或cli将模块下载到本地。使用下载的模块创建lambda层包,并将其上载到lambda层
  • 确保按照以下指南创建lambda层包。

    您是如何构建库的,以及如何部署Lambda的?我将Lambda函数和必需的库包装到一个zip中,然后将其上传到AWS Lambda上。使用
    pip install pycryptodome-t.
    ,在lambda函数所在的同一文件夹中收集库。虽然我无法从python 3.6运行其他一些模块,但我不得不迁移到2.7,并在中使用lambci完成了我的工作。感谢米兰。此解决方案有效!