模块初始化错误:在AWS拉姆达无法加载本机模块“Crypto.Cipher._raw_ecb”

时间:2019-01-31 18:30:43

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

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

  

模块初始化错误:无法加载本机模块“ Crypto.Cipher._raw_ecb”:尝试“ _raw_ecb.cpython-36m-x86_64-linux-gnu.so”:/var/task/Cryptodome/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,但这并没有帮助我为

应用了指定的所有细节后,我得到了上述相同的错误。

3 个答案:

答案 0 :(得分:2)

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

一种修复它的方法是使用Lambci 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本地目录中使用它。

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

答案 1 :(得分: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

答案 2 :(得分:0)

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

我将包放在github中。必须将其放入您的微服务中。

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