使用delta-rs的deltalake Python包访问S3 DeltaTable遇证书信任问题
使用delta-rs访问带SSL证书的S3 Delta表问题
我尝试用delta-rs的deltalake库读取S3上的Delta表,访问该S3需要传入AWS密钥和SSL证书。当前未传入证书的代码如下:
from deltalake import DeltaTable from pyarrow import fs storage_options = {"AWS_ACCESS_KEY_ID": "aws_my_key", "AWS_SECRET_ACCESS_KEY": "my_secret", "AWS_ENDPOINT_URL": "https://domain.company.com"} url = 's3://bucket/sales_data/' raw_fs, normalized_path = fs.FileSystem.from_uri(url) filesystem = fs.SubTreeFileSystem(normalized_path, raw_fs) dt = DeltaTable(url, storage_options=storage_options) ds = dt.to_pyarrow_dataset(filesystem=filesystem)
运行后触发证书信任错误:
deltalake.PyDeltaTableError: Failed to load checkpoint: Failed to read checkpoint content: Generic S3 error: Error performing get request sales_data/_delta_log/_last_checkpoint: response error "request error", after 0 retries: error sending request for url (https://domain.company.com/sales_data/_delta_log/_last_checkpoint): error trying to connect: The certificate was not trusted.
查阅delta-rs文档未找到传递证书的明确方法,推测程序会检查默认路径的证书,但不清楚具体路径,想确认是否能在初始化时传入自定义证书。
解决方案
方法1:通过delta-rs的storage_options传入证书路径
直接在storage_options中添加AWS_SSL_CA_BUNDLE参数,指定SSL证书的绝对路径:
from deltalake import DeltaTable storage_options = { "AWS_ACCESS_KEY_ID": "aws_my_key", "AWS_SECRET_ACCESS_KEY": "my_secret", "AWS_ENDPOINT_URL": "https://domain.company.com", "AWS_SSL_CA_BUNDLE": "/absolute/path/to/your/ca-cert.pem" } url = 's3://bucket/sales_data/' dt = DeltaTable(url, storage_options=storage_options) ds = dt.to_pyarrow_dataset()
说明:delta-rs底层依赖AWS SDK for Rust,该SDK支持通过AWS_SSL_CA_BUNDLE配置项指定自定义CA证书,参数会直接传递到底层客户端生效。
方法2:通过pyarrow FileSystem配置证书
如果方法1不生效,可手动创建配置好证书的pyarrow S3FileSystem,再传递给DeltaTable:
from deltalake import DeltaTable from pyarrow import fs # 创建带证书配置的S3文件系统 s3_fs = fs.S3FileSystem( access_key="aws_my_key", secret_key="my_secret", endpoint_override="domain.company.com", ssl_ca_file="/absolute/path/to/your/ca-cert.pem" ) url = 's3://bucket/sales_data/' _, normalized_path = fs.FileSystem.from_uri(url) filesystem = fs.SubTreeFileSystem(normalized_path, s3_fs) dt = DeltaTable(url, filesystem=filesystem) ds = dt.to_pyarrow_dataset(filesystem=filesystem)
说明:此方法绕开delta-rs内置的S3客户端,直接使用pyarrow配置好的文件系统,确保SSL证书被正确加载。
方法3:通过环境变量全局配置
无需修改代码,直接设置系统环境变量指定证书路径:
# 方式一 export SSL_CERT_FILE="/path/to/your/ca-cert.pem" # 方式二 export AWS_SSL_CA_BUNDLE="/path/to/your/ca-cert.pem"
设置完成后运行Python代码即可生效。
内容的提问来源于stack exchange,提问作者Scarface
相关产品推荐
相关产品推荐

