使用PyArrow FS/S3FS连接S3时禁用SSL验证遇问题求助
问题概述
本地使用PyArrow fs.S3FileSystem 将CSV写入S3存储桶正常,但部署到Linux虚拟机时抛出SSL证书错误:
OSError: When listing objects under key xx in bucket xx: AWS Error NETWORK_CONNECTION during ListObjectsV2 operation: curlCode: 60, SSL peer certificate or SSH remote key was not OK
尝试禁用SSL但找不到PyArrow对应API,改用s3fs.S3FileSystem并设置verify=False后,又出现XML格式错误:
OSERROR: [Errno 22] The XML you provided was not well-formed or did not validate against our published schema
设置os.environ['CURL_CA_BUNDLE']=""也未解决问题。
解决方案
1. 修复PyArrow的SSL验证问题
PyArrow 10.0及以上版本的fs.S3FileSystem支持通过client_kwargs传递SSL验证配置,修改代码如下:
from pyarrow import fs s3 = fs.S3FileSystem( access_key='你的密钥', secret_key='你的密钥', endpoint_override='你的端点', client_kwargs={'verify': False} )
若使用低版本PyArrow,可通过环境变量全局禁用SSL验证:
import os os.environ['PYARROW_S3_VERIFY_SSL'] = 'false' from pyarrow import fs s3 = fs.S3FileSystem(access_key='你的密钥', secret_key='你的密钥', endpoint_override='你的端点')
2. 修复s3fs的XML格式错误
报错原因是pandas.DataFrame.to_csv()返回字符串,却用二进制模式(wb)写入导致数据格式异常,修改代码二选一即可:
import s3fs s3_fs = s3fs.S3FileSystem( key='你的密钥', secret='你的密钥', client_kwargs={'endpoint_url': '你的端点', 'verify': False} ) # 方式1:将字符串编码为bytes后写入 data = pandasTable.to_csv(index=False) with s3_fs.open('s3://{bucket_name}/{csv_file_path.csv}', 'wb') as out_file: out_file.write(data.encode('utf-8')) # 方式2:直接用文本模式写入 with s3_fs.open('s3://{bucket_name}/{csv_file_path.csv}', 'w', encoding='utf-8') as out_file: pandasTable.to_csv(out_file, index=False)
3. 补充:环境变量兜底方案
若上述方法仍无效,可在代码启动前添加环境变量设置:
import os os.environ['CURL_CA_BUNDLE'] = '' os.environ['AWS_CA_BUNDLE'] = ''
内容的提问来源于stack exchange,提问作者prashant

