You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:55:19