AWS Lambda调用py-algorand-sdk时Cryptodome依赖加载失败求助
AWS Lambda层中py-algorand-sdk依赖的Cryptodome原生模块加载失败
本地Docker容器运行正常,但部署为Lambda层后,调用时出现OSError: Cannot load native module 'Cryptodome.Hash._SHA512'错误,找不到对应的.so文件。尝试更换pycrypto、pycryptodome、pycryptodomex及调整安装方式均无效。
解决方案
1. 修正Dockerfile的依赖安装逻辑
当前Dockerfile使用虚拟环境安装依赖后复制到目标目录,虚拟环境中的编译产物可能存在路径或兼容性问题。移除虚拟环境步骤,直接用系统安装的Python 3.9安装依赖:
修改后的Dockerfile安装段:
# 移除虚拟环境相关步骤,直接安装依赖到目标目录 RUN python3.9 -m pip install --upgrade pip && \ python3.9 -m pip install -r /tmp/requirements.txt -t ./python
2. 强制编译适配Lambda的Cryptodome文件
在安装pycryptodomex时添加--no-binary :all:参数,强制从源码编译生成适配Amazon Linux 2环境的.so文件,避免预编译包的兼容性问题:
修改Dockerfile中的pip命令:
RUN python3.9 -m pip install --upgrade pip && \ python3.9 -m pip install -r /tmp/requirements.txt -t ./python --no-binary :all:
3. 验证Lambda层目录结构
确保打包后的Lambda层zip文件根目录为python/,所有依赖文件(包括Cryptodome的.so文件)都位于python/Cryptodome/路径下,没有嵌套错误。
4. 替换为Amazon Linux 2预编译包
如果自行编译仍有问题,可使用针对Amazon Linux 2预编译的pycryptodomex包,消除编译环境差异导致的兼容性问题。
原始文件信息
requirements.txt
requests==2.28.1 py-algorand-sdk==1.20.1 multihash==0.1.1 py-cid==0.3.0 pycryptodomex==3.16.0
Dockerfile
FROM amazonlinux:2.0.20221210.0 COPY ./requirements.txt /tmp/requirements.txt COPY ./mycode /mycode # Prepare amazonlinux image RUN yum -y groupinstall "Development Tools" && \ yum -y install gcc openssl-devel bzip2-devel libffi-devel wget build-essential python3-dev # Get and unpack Python 3.9 RUN wget https://www.python.org/ftp/python/3.9.7/Python-3.9.7.tgz && \ tar zxvf Python-3.9.7.tgz && \ cd Python-3.9.7/ && \ ./configure && \ make && \ make altinstall && \ cd .. && \ rm Python-3.9.7.tgz # Pull the requirements and install RUN python3.9 -m venv /requirements && \ /requirements/bin/pip3.9 install --upgrade pip && \ /requirements/bin/pip3.9 install -r /tmp/requirements.txt -t ./python # Copy in our code as module and zip RUN cp -rf /mycode ./python/ && \ zip -r python_layer.zip ./python/
完整错误日志
Response { "errorMessage": "Cannot load native module 'Cryptodome.Hash._SHA512': Not found '_SHA512.cpython-39-x86_64-linux-gnu.so', Cannot load '_SHA512.abi3.so': /opt/python/Cryptodome/Util/../Hash/_SHA512.abi3.so: cannot open shared object file: No such file or directory, Not found '_SHA512.so'", "errorType": "OSError", "requestId": "", "stackTrace": [ " File \"/var/lang/lib/python3.9/importlib/__init__.py\", line 127, in import_module\n return _bootstrap._gcd_import(name[level:], package, level)\n", " File \"<frozen importlib._bootstrap>\", line 1030, in _gcd_import\n", " File \"<frozen importlib._bootstrap>\", line 1007, in _find_and_load\n", " File \"<frozen importlib._bootstrap>\", line 986, in _find_and_load_unlocked\n", " File \"<frozen importlib._bootstrap>\", line 680, in _load_unlocked\n", " File \"<frozen importlib._bootstrap_external>\", line 850, in exec_module\n", " File \"<frozen importlib._bootstrap>\", line 228, in _call_with_frames_removed\n", " File \"/var/task/lambda_function.py\", line 3, in <module>\n from mycode import *\n", " File \"/opt/python/mycode/__init__.py\", line 1, in <module>\n from . import transactions\n", " File \"/opt/python/mycode/transactions.py\", line 5, in <module>\n from algosdk.v2client import algod\n", " File \"/opt/python/algosdk/__init__.py\", line 1, in <module>\n from . import abi\n", " File \"/opt/python/algosdk/abi/__init__.py\", line 6, in <module>\n from algosdk.abi.address_type import AddressType\n", " File \"/opt/python/algosdk/abi/address_type.py\", line 8, in <module>\n from algosdk import encoding\n", " File \"/opt/python/algosdk/encoding.py\", line 7, in <module>\n from Cryptodome.Hash import SHA512\n", " File \"/opt/python/Cryptodome/Hash/SHA512.py\", line 29, in <module>\n _raw_sha512_lib = load_pycryptodome_raw_lib(\"Cryptodome.Hash._SHA512\",\n", " File \"/opt/python/Cryptodome/Util/_raw_api.py\", line 309, in load_pycryptodome_raw_lib\n raise OSError(\"Cannot load native module '%s': %s\" % (name, \", \".join(attempts)))\n" ] }
内容的提问来源于stack exchange,提问作者red
相关产品推荐
相关产品推荐

