Azure Functions偶发certifi TLS CA证书路径错误的永久解决方案咨询
针对你遇到的偶尔出现OSError: Could not find a suitable TLS CA certificate bundle, invalid path: /home/site/wwwroot/.python_packages/lib/site-packages/certifi/cacert.pem的问题,以下是几个可行的永久解决方案:
固定certifi版本
在requirements.txt中明确指定certifi的具体版本(比如certifi==2024.2.2),避免依赖自动更新导致的文件结构或路径变动。部署时Azure Functions会严格安装指定版本,减少版本迭代带来的兼容性问题。切换使用系统级CA证书
Azure Functions Linux环境自带系统CA证书,路径为/etc/ssl/certs/ca-certificates.crt。在函数代码初始化阶段添加环境变量配置,强制使用系统证书替代certifi包内的证书:import os # 为requests库指定证书路径 os.environ['REQUESTS_CA_BUNDLE'] = '/etc/ssl/certs/ca-certificates.crt' # 全局指定SSL证书路径 os.environ['SSL_CERT_FILE'] = '/etc/ssl/certs/ca-certificates.crt'这样可以彻底绕开certifi包内文件可能出现的缺失问题。
切换至更稳定的托管计划
消耗计划下的Azure Functions实例会被动态回收,临时文件系统可能出现文件丢失或路径异常。如果业务允许,切换到Premium计划或Dedicated(App Service)计划,这类计划提供持久化的文件系统,能大幅降低依赖文件缺失的概率。预打包依赖后部署
避免依赖Azure Functions在线安装依赖,本地提前打包所有依赖:- 在本地执行
pip install -t ./python_packages -r requirements.txt,将所有依赖下载到指定目录 - 将函数代码和
python_packages目录一起打包为zip文件 - 通过Azure门户或CLI上传zip包部署
这种方式能确保certifi的cacert.pem文件被完整部署到Functions实例,减少在线安装时的文件遗漏风险。
- 在本地执行
添加错误重试逻辑
针对请求类代码添加重试机制,当遇到该OSError时自动重试,降低业务中断影响。可以使用tenacity库实现:from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type import requests @retry( stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10), retry=retry_if_exception_type(OSError) ) def send_request(): resp = requests.get("https://your-target-api.com") resp.raise_for_status() return resp.json()
内容的提问来源于stack exchange,提问作者Sander

