
在 aws lambda 上部署依赖 `pycsvschema` 的 python 函数时,出现 `no module named 'rpds.rpds'` 错误,通常并非缺失包,而是因 `rpds_py` 轮子(wheel)与 lambda 运行时环境(x86_64 + manylinux2014)不兼容所致。
该错误极具迷惑性:你已将 rpds_py 和 jsonschema 显式包含在 Lambda 层 ZIP 包中,本地 import rpds.rpds 也正常,但 Lambda 启动时仍报 ImportModuleError。根本原因在于 —— rpds_py 是一个带 C 扩展的加速库,其预编译 wheel 文件高度依赖目标平台的 ABI(应用二进制接口)、Python 版本及 Linux 发行版兼容性策略。
AWS Lambda(标准 x86_64 运行时)使用的是基于 manylinux2014_x86_64 标准构建的 Python 环境(如 python3.9、python3.11)。若你在本地 macOS、Windows 或非标准 Linux(如 Alpine/musl)上直接 pip install rpds_py 并打包,Pip 很可能下载了不兼容的 wheel,例如:
- ❌ rpds_py-0.18.1-cp311-cp311-musllinux_1_1_x86_64.whl(Alpine/musl,Lambda 不支持)
- ❌ rpds_py-0.18.1-cp311-cp311-macosx_10_9_x86_64.whl(macOS,无法加载)
- ✅ 正确版本应为:rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
✅ 正确打包步骤(推荐)
-
在兼容环境中安装(关键!):
使用 Amazon Linux 2 容器(或官方 public.ecr.aws/sam/build-python3.11 镜像)执行构建:# 启动 AL2 构建容器(以 Python 3.11 为例) docker run -v $(pwd):/var/task -w /var/task public.ecr.aws/sam/build-python3.11:latest \ /bin/sh -c "pip install --platform manylinux2014_x86_64 --target ./package --no-deps --no-cache-dir rpds_py==0.18.1 && \ pip install --platform manylinux2014_x86_64 --target ./package --no-cache-dir pycsvschema jsonschema" -
验证 wheel 兼容性:
解压生成的 package/ 目录,检查 rpds/ 子目录是否存在,且 rpds.cpython-*.so 文件可被识别为 Linux x86_64 动态库:file ./package/rpds/*.so # 应输出类似:ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), ...
-
构建 Layer ZIP:
cd package && zip -r ../lambda-layer.zip .
⚠️ 注意事项
- 不要使用 --no-binary :all: 强制源码编译(Lambda 无编译工具链,会失败);
- 避免在 CI/CD 中混用不同基础镜像(如 Ubuntu runner → Lambda),始终对齐 manylinux2014_x86_64;
- 若使用 pip install -t 本地打包,请先运行 pip debug --verbose 确认 manylinux2014_x86_64 在 compatible_tags 列表中;
- rpds_py 是 jsonschema>=4.18.0 的强制依赖,因此升级 jsonschema 也可能触发此问题,需同步验证 wheel 兼容性。
总结
No module named 'rpds.rpds' 不是“找不到模块”,而是“找到模块却无法加载其原生扩展”。解决核心在于:严格匹配 Lambda 运行时 ABI,通过 --platform manylinux2014_x86_64 显式指定 wheel 下载目标。一次正确的构建,胜过十次盲目重试。










