我正在使用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中不兼容。所以有两种方法可以解决这个问题。
- 使用docker提取amazonlinux镜像并使用pip-install安装pycryptodome。然后将pycryptodome模块导出到lambda层
- 启动一个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上传模块。安装后,请再次尝试查看是否出现相同的错误。