华为云对象存储(OBS)在兼容 Amazon S3 协议方面做了深度适配,旨在让使用 AWS S3 SDK、工具或第三方开源软件的用户能够无缝迁移和接入。其兼容性并非“完全一致”,而是覆盖了绝大多数常用功能,但在部分高级特性或特定参数行为上存在差异。
以下是华为云 OBS 兼容 S3 接口的主要功能和规格概览:
1. 核心 API 操作支持
OBS 支持了 S3 协议中约 95% 以上 的核心 RESTful API 操作,涵盖了对象存储的基本生命周期管理:
- 对象操作:
PUT Object:上传对象(支持分片上传、断点续传)。GET Object:下载对象(支持范围下载 Range GET)。HEAD Object:获取元数据。DELETE Object/POST Object (Delete):删除单个对象或多版本对象。COPY Object:复制对象(同 Bucket 内及跨 Bucket)。Multipart Upload:初始化、上传分片、完成/中止分片上传。
- Bucket 操作:
List Buckets:列出所有 Bucket。Create Bucket/Delete Bucket:创建和删除存储桶。Put/Bucket ACL:设置 Bucket 权限(注意:S3 的 ACL 模型与 OBS 的权限策略模型有映射关系,但底层实现逻辑不同)。Get/Bucket Location:获取 Bucket 位置信息。
- 列表与查询:
List Objects/List Objects V2:列出对象(支持前缀过滤、分页、Marker/ContinuationToken)。List Multipart Uploads:列出未完成的分片上传任务。List Parts:列出某个分片上传任务中的已上传分片。
2. 高级功能与特性
除了基础 CRUD,OBS 还通过 S3 接口支持以下高级特性:
- 多版本控制 (Versioning):
- 支持开启/暂停/禁用 Bucket 的版本控制。
- 支持通过
?versionId参数读取历史版本、恢复误删对象。
- 生命周期管理 (Lifecycle):
- 支持通过 S3 标准的 Lifecycle Rules 配置规则,实现自动转换存储类型(如转低频访问)、过期删除对象等。
- 预签名 URL (Presigned URLs):
- 完全兼容 S3 的签名算法(V4),可生成有时效性的下载/上传链接。
- 跨区域复制 (CRR):
- 虽然 CRR 通常通过控制台或专用 API 配置,但 OBS 支持通过 S3 标准的事件通知机制触发相关逻辑。
- 加密支持:
- 支持 SSE-S3(服务端加密)、SSE-KMS(KMS 密钥)以及客户提供的密钥(SSE-C),在 S3 请求头中有对应的标准字段支持。
- 标签 (Tags):
- 支持对对象进行 Tagging 操作(
PUT Object Tagging,GET Object Tagging),用于资源分类和计费统计。
- 支持对对象进行 Tagging 操作(
- 事件通知 (Event Notifications):
- 支持将对象操作事件(如
s3:ObjectCreated:*)投递到 OBS 自身或其他云服务(如函数工作流 FunctionGraph),符合 S3 Event Notification 规范。
- 支持将对象操作事件(如
3. 认证与签名规格
- 签名算法:默认且主要支持 AWS Signature Version 4。
- 兼容模式:为了适配旧版工具,OBS 也提供了一定的 Signature V2 兼容能力,但强烈建议使用 V4 以获得更好的安全性。
- Access Key/Secret Key:用户可以使用 AK/SK 直接构建 S3 风格的请求签名。
4. 关键差异与限制(注意事项)
尽管高度兼容,但在实际对接时需注意以下差异,这些是迁移中最容易遇到的“坑”:
| 特性 | AWS S3 原生行为 | 华为云 OBS 行为/差异 |
|---|---|---|
| 错误码返回 | 严格遵循 AWS 错误码格式 | 大部分兼容,但部分自定义错误可能包含华为云特有的 Code 或 Message 描述。 |
| ACL vs Policy | 强依赖 Bucket/Object ACL | OBS 推荐使用 IAM 策略 (Policy) 和 桶策略,ACL 仅作为兼容层,某些细粒度权限在 ACL 中可能受限。 |
| 重定向 (Redirect) | 支持多种重定向配置 | OBS 支持重定向,但配置方式需遵循 OBS 特定的 XML 结构,而非纯 S3 标准。 |
| 元数据键值 | 大小写敏感 | OBS 对象元数据(Metadata)Key 通常不区分大小写,而 S3 是区分大小写的。 |
| 最大对象大小 | 5TB | OBS 单对象最大支持 5TB,与 S3 一致。 |
| 分片大小 | 最小 5MB (最后一块除外) | OBS 同样要求非最后一片至少 5MB,否则报错。 |
| 区域标识 | Region ID (如 us-east-1) | OBS 使用 Endpoint 域名(如 obs.cn-north-4.myhuaweicloud.com)来隐式确定区域,无需显式指定 Region 参数(SDK 会自动处理)。 |
5. 开发建议
如果您计划使用 S3 接口对接华为云 OBS:
- SDK 选择:建议使用华为云官方提供的 OBS SDK(基于 S3 协议封装),它会自动处理签名、Endpoint 路由和错误重试,比直接使用通用的 AWS S3 SDK 更稳定。
- 通用工具:对于
aws-cli、rclone、minio-client等第三方工具,只需修改配置中的endpoint为华为云 OBS 地址,并切换provider为HuaweiCloud或S3Compatible即可使用。 - 测试验证:在正式迁移前,务必进行小批量数据的读写、分片上传、版本回滚和权限验证测试,特别是涉及复杂权限策略的场景。
总结来说,华为云 OBS 的 S3 兼容接口足以支撑 90% 以上的标准 S3 应用场景,包括主流备份工具、大数据计算引擎(Spark/Hadoop)以及云原生应用的数据持久化需求。
云小栈