华为云 OBS 对象存储实战:从桶策略到静态网站托管,一篇搞懂核心用法
做开发这几年,文件存储一直是个绕不开的话题。早期我把用户上传的图片直接存在服务器本地磁盘上,结果服务器一换、磁盘一满,迁移起来痛不欲生。后来用了 NFS 共享存储,运维成本又上来了,权限管理也麻烦。
直到我开始用华为云 OBS(对象存储服务),这些问题才真正理顺。OBS 本质上是一个海量、高可靠、低成本的文件存储服务,按量付费,不用管底层硬件。今天这篇文章,我把日常开发中最常用的几个 OBS 场景整理出来,希望能帮刚上手的同学少走弯路。
一、先搞懂几个核心概念
很多人一上来就折腾 API,概念没理清,越做越乱。先把三个基础概念说透:
桶(Bucket):OBS 的顶层容器,类似一个无限大的磁盘分区。桶名全局唯一——整个华为云所有用户加起来,同一个名字只能被一个桶占用。所以命名要有规律,比如 mycompany-app-prod,别取 test 这种大概率被占的名字。
对象(Object):桶里的每一个文件就是一个对象。对象由数据(文件内容)、元数据(Key-Value,比如 Content-Type)和 Key(对象名/路径)三部分组成。注意 OBS 没有真正的"文件夹"概念,所谓文件夹只是 Key 里的斜杠前缀模拟出来的,这一点和本地文件系统思维不同。
桶策略(Bucket Policy):以 JSON 格式描述的访问控制规则,可以精确到某个对象、某些操作、某些 IP 段。比简单的 ACL 权限灵活得多,生产环境推荐用桶策略。
二、创建桶:第一步该怎么做
创建桶看似简单,但有几个选项选错了后面改起来很麻烦。
区域选择:桶创建后区域不可更改,所以一开始就要想好。如果你的 ECS 在 cn-north-4,桶也放 cn-north-4,走内网访问延迟低、不产生公网流量费。跨区域访问不仅慢,还要付跨区域复制费用。
存储类别:OBS 提供四种存储类别,选对了能省不少钱:
- 标准存储:热数据,频繁访问,比如用户头像、App 首页图片。
- 低频访问存储:温数据,偶尔访问,比如月度报表、日志归档。价格比标准存储低,但读取有取回费。
- 归档存储:冷数据,极少访问,比如合规留存的数据。价格最低,但取回需要先解冻,耗时几分钟到几小时。
- 深度归档存储:极冷数据,几乎永不访问,成本最低。
我的经验是:上线初期全用标准存储,等数据量大了之后,写一个定时任务把超过 90 天没访问过的对象转为低频访问存储,一年能省 40% 左右的存储费。
桶 ACL:创建时建议选"私有"(Private),也就是默认所有对象都不公开。需要公开的内容再单独通过桶策略或对象 ACL 放开,这是最小权限原则。千万别图省事选"公开读",等于把整个桶裸奔在互联网上。
三、上传文件:SDK 实战
以 Python SDK 为例,先安装:
pip install esdk-obs-python
然后写一个简单的上传工具类:
from obs import ObsClient
class OBSUploader:
def __init__(self, ak, sk, endpoint):
self.client = ObsClient(
access_key_id=ak,
secret_access_key=sk,
server=endpoint
)
def upload_file(self, bucket_name, object_key, file_path):
resp = self.client.putFile(
bucket_name, object_key, file_path
)
if resp.status < 300:
print("上传成功: " + object_key)
return True
else:
print("上传失败: " + resp.errorMessage)
return False
def upload_bytes(self, bucket_name, object_key, data, content_type):
resp = self.client.putContent(
bucket_name, object_key,
content=data,
contentType=content_type
)
if resp.status < 300:
return True
return False
这里有几个实战经验:
分段上传大文件:OBS 单次上传限制 5GB,但用分段上传(Multipart Upload)最大可以传 48.8TB。SDK 里调用 initiateMultipartUpload 就行。对于几百 MB 以上的文件,即使用单次上传能成功,也建议走分段上传——网络抖动时只需重传失败的那一段,不用整个文件重来。
设置 Content-Type:很多同学上传图片后发现浏览器访问时直接下载了,而不是在线预览。原因就是 Content-Type 没设对。上传时显式指定 contentType 为 image/jpeg,浏览器才知道怎么处理。
并发上传:批量上传小文件时,开多线程能大幅提速。但注意并发数别太高,我一般设 10 到 20 个线程,太高反而因为连接建立开销变慢。
四、静态网站托管:OBS 的隐藏技能
很多人不知道 OBS 可以直接托管静态网站,不用买 ECS,不用配 Nginx,成本几乎为零。适合个人博客、项目文档站点、活动落地页这类纯静态页面。
配置步骤:
第一步,把桶的访问策略改为"公开读"。注意这里说的是让桶内对象可公开访问,不是把桶管理权限放开。
第二步,在桶属性里开启静态网站托管配置,设置默认首页和错误页:
resp = client.setBucketWebsite(
bucket_name,
indexDocument='index.html',
errorDocument='404.html'
)
第三步,把你的 HTML、CSS、JS 文件上传到桶里。访问桶的网站端点就能看到页面了,端点地址的格式是"桶名加点号加 obs-website 加区域名加 myhuaweicloud 加 com",在控制台桶属性里可以直接看到。
我用自己的个人博客试过,全站 50 多个 HTML 页面加图片,存储费一个月不到 1 块钱,访问速度也不差。唯一的不便是没有服务端逻辑,需要动态交互的功能得搭配 API 网关加 FunctionGraph 来实现。
五、生命周期管理:让 OBS 自己帮你省钱
数据量一大,手动管理存储类别不现实。OBS 的生命周期规则可以自动完成这件事:
{
"Rules": [
{
"ID": "archive-old-logs",
"Filter": { "Prefix": "logs/" },
"Status": "Enabled",
"Transitions": [
{
"Days": 30,
"StorageClass": "WARM"
},
{
"Days": 90,
"StorageClass": "COLD"
}
],
"Expiration": {
"Days": 365
}
}
]
}
这条规则的意思是:logs 前缀下的对象,30 天后自动转为低频访问存储,90 天后转为归档存储,365 天后自动删除。完全自动化,设一次就不用管了。
我的建议是:上线时就配好生命周期规则,不要等数据量大了再补。很多团队是出了存储账单才发现日志桶里堆了几百 GB 的标准存储数据,早配规则能省一大笔。
六、安全实践:别让你的桶上新闻
OBS 桶权限配置不当导致数据泄露的事件屡见不鲜,这里列几条必须注意的安全实践:
不要用公开读桶存敏感数据。听起来像废话,但实际中我见过把用户身份证照片放在公开读桶里的案例。敏感数据必须私有存储,通过临时签名 URL 授权访问。
用临时签名 URL 给前端下载权限。后端生成一个有效期 15 分钟的预签名 URL 给前端,前端在这个时间窗口内可以下载,过期后 URL 失效。这样 AK 和 SK 不会暴露给前端,权限也是临时可控的:
resp = client.createSignedUrl(
'GET', bucket_name, object_key,
expires=900
)
print(resp.signedUrl)
开启桶版本控制。开启后每次覆盖上传都会保留历史版本,误删误覆盖时可以恢复。代价是存储量会增加,但对于重要数据值得。
开启服务端加密。OBS 支持 SSE-KMS,用华为云 KMS 服务管理的密钥对对象加密存储。即使磁盘被人物理拿走,没有密钥也读不到明文。
七、性能优化:几个实用技巧
用内网 Endpoint:同一区域的 ECS 访问 OBS,走内网 Endpoint 不经过公网,延迟低且不收流量费。公网 Endpoint 只在本地开发调试时用。
合理利用 Range 请求:大文件下载时可以用 Range 请求只取文件的一部分,适合断点续传或视频拖拽播放场景。
开启 CDN 加速:如果用户分布在全国各地,直接访问 OBS 延迟不理想。在前面挂一层华为云 CDN,边缘节点缓存静态资源,回源到 OBS,既提速又降低 OBS 的请求费用。CDN 配好后,用户访问的是 CDN 域名,OBS 桶可以保持私有,安全性也更好。
八、踩坑记录
坑一:桶名不能用下划线。 OBS 桶名只允许小写字母、数字和连字符,不支持下划线和大小写混写。第一次创建桶时踩过,报错信息还不太直观。
坑二:删除非空桶要先清空对象。 OBS 桶里有对象时不能直接删除桶。如果对象很多,手动删不现实,可以用生命周期规则设置 1 天后过期,等自动清理完再删桶。或者用 SDK 批量列举删除。
坑三:跨账号授权要用桶策略。 如果需要让另一个华为云账号访问你的桶,ACL 做不到,必须写桶策略,Principal 里填对方账号的 ID。这个场景在跨公司协作时很常见。
九、总结
OBS 看起来就是一个"存文件"的服务,但用好它需要在存储类别选择、权限控制、生命周期管理和性能优化上做功课。我的建议是:
- 创建桶时就配好生命周期规则和访问策略,不要事后补。
- 敏感数据一律私有存储,用预签名 URL 授权访问。
- 大数据量场景务必挂 CDN,用户体验和成本都会好很多。
- 开发阶段就用 SDK 封装好上传下载工具类,别在业务代码里直接调 API。
希望这篇实战总结能帮你在华为云上把 OBS 用得更顺手。如果你有其他 OBS 使用技巧,欢迎在评论区一起交流。
- 点赞
- 收藏
- 关注作者
评论(0)