AWS Lambda使用psycopg2连接PostgreSQL报SSL未编译错误
问题根因
报错核心原因是你部署到AWS Lambda环境的psycopg2库没有编译SSL支持:
- 本地运行时你安装的psycopg2会自动适配本地系统的OpenSSL依赖,默认带SSL连接能力,所以配置
sslmode=require能正常连接Heroku Postgres。 - Lambda的运行环境是定制版Amazon Linux,和你本地开发环境的系统依赖差异很大。如果你直接把本地安装的psycopg2、或者默认pip源拉取的通用二进制psycopg2打进部署包,大多没有静态编译SSL相关依赖,运行时就会抛出SSL未编译的错误。另外注意Heroku Postgres强制要求SSL连接,不能直接删除
sslmode=require参数绕过问题,否则会被数据库直接拒绝连接。
解决步骤
- 清理冲突依赖
先把本地项目依赖里已有的psycopg2、psycopg2-binary完全卸载,避免多版本冲突:pip uninstall -y psycopg2 psycopg2-binary - 安装适配Lambda的带SSL支持的psycopg2版本
安装针对Amazon Linux Lambda运行环境、Python3.8版本预编译的psycopg2包,这类包会静态编译好PostgreSQL客户端、OpenSSL相关依赖,不依赖Lambda系统自带的底层库,自带完整SSL连接能力。注意不要用本地macOS/Windows系统编译的psycopg2包打部署包,系统架构和依赖差异会导致运行异常。如果你是用Lambda层加载psycopg2,也要确认所用的层是带完整SSL编译支持的版本,不要用精简的无SSL版本。 - 校验连接配置
保留连接参数里的sslmode=require配置,不要修改,Heroku Postgres会拦截所有非SSL的连接请求。 - 重新部署测试
将正确安装依赖的项目代码重新打包为zip上传到Lambda,重新触发测试即可解决该报错。
内容的提问来源于stack exchange,提问作者Yongjoon Kim
相关产品推荐
相关产品推荐

