AWS Lambda使用Layer时出现cannot import name 'DEFAULT_CIPHERS'错误求助
解决方案:Lambda导入urllib3 DEFAULT_CIPHERS报错
1. 在Lambda兼容环境构建Layer
Lambda运行在Amazon Linux 2系统上,本地(Windows/macOS)打包的依赖可能存在系统架构或库兼容性问题,导致版本冲突。正确的构建步骤:
- 用Docker拉取Amazon Linux 2镜像:
docker pull amazonlinux:2 - 挂载本地目录并进入容器:
docker run -v $(pwd):/app -it amazonlinux:2 - 在容器内安装Python 3.9及依赖工具:
yum update -y yum install -y python3.9 python3.9-pip - 创建Layer目录结构并安装指定版本依赖:
mkdir -p python/lib/python3.9/site-packages/ python3.9 -m pip install requests pandas urllib3==1.26.15 -t python/lib/python3.9/site-packages/ - 打包成zip文件:
cd python && zip -r ../lambda-deps-layer.zip .,上传该zip作为Lambda Layer
2. 排查Lambda环境依赖版本冲突
Lambda Python 3.9运行时自带urllib3,可能和Layer中的版本冲突。可以在代码开头添加版本检测:
import urllib3 print(f"urllib3版本: {urllib3.__version__}")
如果输出版本不是1.26.15,说明Layer未被正确加载:
- 检查Layer是否关联到Lambda函数
- 若有多个Layer,调整顺序让包含urllib3的Layer优先加载
- 尝试将依赖直接打包到Lambda部署包(替代Layer)
3. 临时修复:手动定义DEFAULT_CIPHERS
如果不想重新构建Layer,可在代码中绕过导入错误:
# 先尝试导入,失败则手动定义 try: from urllib3.util.ssl_ import DEFAULT_CIPHERS except ImportError: DEFAULT_CIPHERS = 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384'
确保后续代码中使用该变量替代原导入的DEFAULT_CIPHERS
4. 本地模拟Lambda环境测试
用AWS Lambda Runtime Interface Emulator(RIE)本地模拟Lambda运行环境,提前排查依赖问题:
- 下载RIE:
curl -Lo aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie - 赋予执行权限:
chmod +x aws-lambda-rie - 运行测试:
./aws-lambda-rie python3.9 lambda_function.lambda_handler,查看是否仍出现导入错误
内容的提问来源于stack exchange,提问作者dixhom
相关产品推荐
相关产品推荐

