AWS Elastic Beanstalk部署Flask应用时安装mysqlclient报错求助
mysqlclient是带C编译扩展的Python依赖,安装过程需要调用本地系统提供的mysql_config命令完成编译参数获取、动态链接配置。AWS Elastic Beanstalk默认的基础运行环境仅预装Python运行时,没有提前安装MySQL客户端开发库与编译工具链,pip拉取mysqlclient2.0.3源码包后,会在编译阶段找不到对应的可执行命令抛出OSError: mysql_config not found异常。编译失败后pip会自动尝试匹配当前环境下的预编译wheel包,由于mysqlclient2.0.3没有针对EB环境的公开预编译包,最终会抛出“无法匹配可用发行包”的错误提示,中断部署流程。
第一步:创建EB自定义系统配置
在项目根目录(与requirements.txt同级路径)下,新建.ebextensions文件夹,所有针对EB运行环境的系统级配置都需存放于该目录下。
第二步:编写系统依赖安装规则
在.ebextensions文件夹内新建配置文件,例如命名为01_mysqlclient_deps.config,文件名以数字01开头是为了让EB优先执行该系统依赖安装规则,确保后续pip安装环节能找到对应命令。在文件内写入对应系统包的自动安装规则:
注意:当前AWS Elastic Beanstalk主流运行时为Amazon Linux 2,对应配置如下,部署时会在pip安装Python依赖之前,自动完成系统包安装
packages: yum: gcc: [] mysql-devel: [] python3-devel: []
上述配置对应的作用:
- 安装
gcc编译工具,满足mysqlclient C扩展的编译需求 - 安装
mysql-devel开发库,提供mysql_config可执行文件与客户端头文件 - 安装
python3-devel开发头文件,避免编译Python扩展时出现头文件缺失报错
第三步:重新触发部署
将添加完配置文件的项目完整包重新上传至AWS Elastic Beanstalk,启动部署流程。此时EB会按照「先安装系统级依赖 -> 再执行pip安装Python依赖」的顺序运行,mysqlclient2.0.3在编译阶段可以正常定位到mysql_config命令,顺利完成安装。
- 无需修改
requirements.txt中声明的mysqlclient==2.0.3版本,该配置对指定版本完全兼容 - 不要替换为pymysql作为临时解决方案,生产环境下mysqlclient的性能、稳定性远优于纯Python实现的pymysql
- 如果使用Amazon Linux 2023版本的EB运行时,仅需将配置中的
mysql-devel替换为mysql15-devel即可,其余规则逻辑不变 - 无需安装完整的MySQL Server服务端包,仅安装客户端开发库即可满足依赖要求,避免不必要的资源占用
内容的提问来源于stack exchange,提问作者Karishma Londhe

