部署Django应用到AWS Elastic Beanstalk出现setuptools_rust模块缺失错误
问题原因
- cryptography 3.4及以上版本引入了Rust编写的核心模块,源码编译安装时必须依赖
setuptools_rust组件。 - AWS Elastic Beanstalk默认Python运行环境的内置pip、setuptools版本偏低,未预装
setuptools_rust,且部署时会按requirements.txt的顺序安装依赖,编译cryptography时还未安装对应的依赖组件就会触发错误。 - 本地开发环境如果是Windows/macOS,pip通常会直接下载预编译的cryptography wheel包,不需要本地编译,因此不会触发该错误,只有在需要源码编译的Linux部署环境才会暴露问题。
解决方案
- 方案1:调整requirements.txt依赖顺序
把依赖构建工具放在requirements.txt的最开头,确保安装cryptography前先装好编译需要的组件:pip>=21.0 setuptools>=50.0.0 setuptools_rust>=1.1.2 # 后续再写其他依赖,例如Django、cryptography、requests等 - 方案2:锁定无Rust依赖的旧版本cryptography
如果业务不需要使用cryptography 3.4+的新特性,可以指定安装最后一个无需Rust编译的稳定版本,直接跳过编译依赖要求:
注意:该版本已停止安全补丁更新,仅适合临时测试使用,生产环境优先选择其他方案。cryptography==3.3.2 - 方案3:添加EB前置部署配置
在项目根目录创建.ebextensions文件夹,新增01_install_build_deps.config配置文件,在部署依赖安装前先升级构建工具和系统依赖:
该方案会在每次部署时优先升级虚拟环境内的构建工具,同时安装编译cryptography需要的系统依赖,兼容性最好,适合生产环境使用。packages: yum: gcc: [] openssl-devel: [] libffi-devel: [] commands: 01_upgrade_build_tools: command: /opt/python/run/venv/bin/pip install --upgrade pip setuptools setuptools_rust ignoreErrors: false
内容的提问来源于stack exchange,提问作者cuneyttyler
相关产品推荐
相关产品推荐

