python使用boto3读写ArcGIS Datastore11.5内置Ozone

概述

本文将详细介绍如何使用Python的boto3库连接和操作ArcGIS Datastore 11.5内置的Ozone对象存储。Ozone是Hadoop生态系统中的对象存储系统,与S3协议兼容。通过boto3的S3接口,我们可以方便地在Python中读写Ozone存储桶中的对象。
用程序读写ArcGIS Datastore 11.5内置的Ozone对象存储有助于开发三维相关功能。

第一章:Miniconda在Windows上安装

1.1 为什么选择Miniconda

Miniconda是Anaconda的轻量级版本,只包含conda、Python和少量必要包。相比完整的Anaconda,Miniconda占用空间更小,更适合在服务器或开发环境中部署。

1.2 下载Miniconda

  1. Miniconda下载地址:[https://repo.anaconda.com/miniconda/Miniconda3-latest-Windows-x86_64.exe)

  2. 下载64位安装程序(Miniconda3-latest-Windows-x86_64.exe)

  3. 运行安装程序:双击下载的exe文件

  4. 选择安装类型

    • 推荐选择"Just Me"(仅当前用户)

    • 或"All Users"(所有用户,需要管理员权限)

  5. 选择安装路径

  6. 高级选项

    • ☑ Add Miniconda3 to my PATH environment variable

    • ☑ Register Miniconda3 as my default Python 3.x
      如果担心这个miniconda环境与本机已有其他conda环境冲突则不勾选这两个选项,去安装目录下使用

  7. 完成安装:等待安装完成,可能需要几分钟

1.4 验证安装

打开命令提示符(CMD)或PowerShell,执行以下命令:
如果未设置环境变量,就去安装目录 E:\ProgramData\miniconda3\condabin 下打开CMD

# 检查conda版本
conda --version

# 检查Python版本
python --version

# 更新conda到最新版本
conda update conda

1.5 配置conda镜像源(可选,国内推荐)

为了加快包下载速度,可以配置国内镜像源:


# 添加清华镜像源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/

# 显示所有通道
conda config --show channels

# 设置搜索时显示通道地址
conda config --set show_channel_urls yes</pre>

第二章:下载boto3 1.13版本的包以及urllib3、requests

2.1 创建专用环境

为避免包版本冲突,建议为Ozone项目创建独立的conda环境:

# 创建名为ozone的Python环境
conda create -n dans-ozone python=3.9

# 激活环境
conda activate dans-ozone

# 查看当前环境
conda env list</pre>

2.2 安装特定版本的boto3

ArcGIS Datastore 11.5内置的Ozone对boto3版本有一定要求,1.13版本经过测试兼容性较好:

# 通过conda安装boto3的特定版本
conda install boto3=1.13</pre>

注意:如果安装默认版本,则为1.14,读ozone成功,写ozone会失败。
失败截图:


使用了boto3的1.14版本报错

2.3 安装urllib3和requests

# 安装urllib3
pip install urllib3

# 安装requests
pip install requests

第三章:Ozone的客户端证书配置

3.1 Ozone HTTPS连接的安全要求

ArcGIS Datastore 11.5内置的Ozone默认使用HTTPS协议,并且通常使用自签名证书或内部CA签发的证书。客户端需要配置证书验证才能建立安全连接。

3.2 获取Ozone服务器证书

方法一:从浏览器导出证书

  1. 使用Chrome/Edge访问Ozone端点URL

  2. 点击地址栏的锁图标 → 证书 → 详细信息

  3. 选择"复制到文件",导出为Base64编码的CER格式

手动改名后缀pem

3.3 配置客户端证书验证

方案一:全局环境变量配置(推荐)


import os

# 设置证书路径
cert_path = "D:\\python\\ozone\\zsChain.pem"

# 配置全局SSL证书
os.environ['AWS_CA_BUNDLE'] = cert_path
os.environ['REQUESTS_CA_BUNDLE'] = cert_path

# 如果证书是自签名的,可以选择性关闭警告
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)</pre>

方案二:在boto3客户端中配置


import boto3
from botocore.config import Config

config = Config(
    s3={
        'use_ssl': True,
        'verify': 'D:\\python\\ozone\\zsChain.pem',
    }
)

s3 = boto3.client(
    's3',
    endpoint_url="https://ags115kl.geoscene.cn:29879",
    aws_access_key_id="your_access_key",
    aws_secret_access_key="your_secret_key",
    config=config
)

3.5 常见证书问题及解决方案

问题 症状 解决方案
SSL证书验证失败 SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] 1. 确保证书路径正确.2. 确保证书格式为PEM.3. 检查证书是否过期
自签名证书不被信任 InsecureRequestWarning 1. 添加证书到受信任存储2. 使用verify=False(不推荐)3. 导入证书到系统证书库
证书链不完整 SSL3_GET_SERVER_CERTIFICATE 1. 获取完整证书链2. 合并所有中间证书和根证书
主机名不匹配 Hostname mismatch 1. 确保证书CN/SAN包含正确主机名2. 使用IP地址访问3. 在连接时禁用主机名验证

第四章:完整代码及运行结果

4.1 完整代码

"""
Python连接ArcGIS Datastore 11.5内置Ozone对象存储
作者: [Dans]
日期: 2025年12月
说明: 该脚本演示如何使用boto3连接和操作Ozone存储桶
"""
import boto3
import logging
from botocore.config import Config
from botocore.exceptions import ClientError
import urllib3
import requests
import os
#urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# 关闭底层日志,只看结果
boto3.set_stream_logger('botocore', level=logging.ERROR)

# 通过环境变量全局配置SSL
#os.environ['AWS_USE_SSL'] = 'true'  # 强制使用SSL
os.environ['AWS_CA_BUNDLE'] = 'D:\\python\\ozone\\zsChain.pem'  # 自定义CA证书
os.environ['REQUESTS_CA_BUNDLE'] = 'D:\\python\\ozone\\zsChain.pem'  # 自定义CA证书


# ================= 配置区 =================
ENDPOINT_URL = "https://ags115kl.geoscene.cn:29879"
ACCESS_KEY = "f8j5dlg81qpx9914"
SECRET_KEY = "6pemeg0l9hnfcxga"
BUCKET_NAME = "0123456789abcdef"
KEY = "fix_test.txt"
# ==========================================

def run_legacy_probe():
    print(f"正在尝试以 [兼容模式] 上传到 {ENDPOINT_URL} ...")

    # 关键修改点 1: 强制指定签名版本为 s3v4 (虽然之前也是,但配合下面很重要)
    config = Config(
        signature_version='s3v4',
        retries={'max_attempts': 0},
        s3={
            'use_ssl': True,
            'verify': 'D:\python\ozone\zsChain.pem',
            'addressing_style': 'path',
            #'payload_signing_enabled': False  # <--- 关键!禁止对 Payload 进行流式签名
        }
    )
    
    s3 = boto3.client(
        's3',
        endpoint_url=ENDPOINT_URL,
        aws_access_key_id=ACCESS_KEY,
        aws_secret_access_key=SECRET_KEY,
        config=config,
        #verify=False
    )
    try:
        s3.head_bucket(Bucket='0123456789abcdef')
        print("桶存在")
    except ClientError as e:
        print(f"桶检查失败: {e}")

    try:
        # 关键修改点 2: 不要传流(Body=file),直接传字节(Body=bytes)
        # 这会迫使 boto3 计算 Content-Length,从而不使用 chunked 编码
        s3.upload_file('D:\\python\\ozone\\test.txt', BUCKET_NAME, 'file.txt')
        print("Uploaded 'test.txt' to 'bucket/file.txt'")
        content = b'a'
        s3.put_object(
            Bucket=BUCKET_NAME,
            Key='/a.txt',
            Body=content,
            # 显式告诉服务器长度,防止它瞎猜
            #ContentLength=len(content_bytes),
            #ContentType='text/plain; charset=utf-8'
        )
        print("\n" + "="*40)
        print(" [SUCCESS] 成功了!")
        print(" 问题确认:服务端不支持 'aws-chunked' 流式上传。")
        print(" 解决方案:在上传代码中禁用 payload 签名或预计算文件大小。")
        print("="*40)

    except ClientError as e:
        print("\n[失败] 依然报错:")
        print(e)
        # 如果还是 500 且没内容,那就是服务端彻底坏了
    except Exception as e:
        print(f"\n[未知错误] {e}")

if __name__ == "__main__":
    run_legacy_probe()

4.2 执行结果

执行结果

4.3 代码说明

4.3.1 关键配置项

1.证书配置:

通过环境变量AWS_CA_BUNDLE和REQUESTS_CA_BUNDLE设置证书路径

2.确保使用PEM格式的证书文件

boto3客户端配置:

signature_version='s3v4':Ozone要求使用S3v4签名

addressing_style='path':使用路径样式寻址

payload_signing_enabled=False:关键配置,禁用payload签名,避免chunked编码问题

连接参数:

3.endpoint_url:Ozone服务器地址

aws_access_key_id和aws_secret_access_key:从ArcGIS Datastore管理员处获取

4.3.2 解决的关键问题

SSL证书验证:通过配置自定义CA证书解决自签名证书信任问题

签名版本:明确指定使用S3v4签名算法

chunked编码问题:通过禁用payload签名避免Ozone不支持的流式上传

总结

本文详细介绍了如何使用Python的boto3库连接和操作ArcGIS Datastore 11.5内置的Ozone对象存储。通过正确的证书配置、boto3客户端配置和错误处理,可以稳定可靠地在Python应用中集成Ozone存储功能。

关键点总结:

环境准备:使用Miniconda创建独立Python环境

依赖管理:安装特定版本的boto3和相关库

客户端证书配置:正确配置客户端SSL证书以建立安全连接

错误处理:完善的异常处理确保应用健壮性

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容