模块初始化错误:无法在 AWS lambda 上加载本机模块'Crypto.Cipher._raw_ecb'



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

模块初始化错误:无法加载本机模块"Crypto.Cipher._raw_ecb":正在尝试"_raw_ecb.cpython-36m-x86_64-linux-gnu.so":/var/task/Cryptodome/Util//密码/raw_ecb.cpython-36m-x86_64-linux-gnu.so:无法打开共享对象文件:没有这样的文件或目录,正在尝试"_raw_ecb.ab3.so":/var/task/Cryptodome/Util//密码/raw_ecb.abi3.so:无法打开共享对象文件:没有这样的文件或目录,正在尝试"_raw_ecb.so":/var/task/Cryptodome/Util//密码/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执行环境不兼容。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 SAM和AWS SAM cli,它们为您提供了一些非常有用的命令来构建、打包和部署Lambda应用程序。

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

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

请确保遵循以下创建lambda层包的指导方针。导入lambda层中的库

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

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

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

如果使用conda,请在cmd:中输入以下行

conda activate your_env_name
conda install pycrypto

如果您正在使用pip,请通过pip上传模块。安装后,请再次尝试查看是否出现相同的错误。

相关内容

最新更新