前言
你是否和我一样,曾经好奇过,抖音那么多的视频和图片,应该如何存储和访问?在学习了对象存储 TOS 后有了些许头绪,下面就从课后作业的角度简单介绍一下 TOS 的申请和使用。
TOS简介
火山引擎对象存储 TOS(Torch Object Storage)是火山引擎提供的海量、安全、低成本、易用、高可靠、高可用的分布式云存储服务。您可以通过 RESTful API 接口、SDK 和工具等多种形式使用火山引擎 TOS。通过网络,您可以在任何应用、任何时间、任何地点管理和访问火山引擎 TOS 上的数据。
申请火山引擎TOS
首先要在火山引擎创建账号并申请实名使用TOS
实名认证
完成实名认证后方可申请对象存储服务
申请使用对象存储
对象存储实战
创建桶
在对象存储控制台中创建桶,选择“桶列表”-->“创建桶”,依次填写桶名称,选择区域,是否开通版本控制等,如果需要更高级设置,可以打开下拉列表选择更多存储高可用性方案。
鉴权机制
未保障资源访问的安全性,目前各大云厂商均采用的是API访问Token鉴权机制
主账户的密钥具有账户的完全权限,密钥泄露可能会造成最大化的资产损失,强烈建议建立子用户,按需分配权限,并使用子用户的密钥访问云资源。
API访问密钥(Access Key)是请求火山引擎API的安全凭证,包含 Access Key ID和Secret Access Key,请您妥善保管并定期轮换密钥,不要将密钥信息共享至公开环境(如上传GitHub),以保障云资源的安全性。建议使用最小化授权的IAM用户的密钥进行API访问,不建议直接使用主账号密钥或使用权限过大的IAM用户密钥。
API概览
在对象存储API官方文档可以看到有关于对象操作的全部API概览,使用时方便查找。
需要注意的是,在构建请求体时,需要额外注意公共参数是并没有给在每一个API说明文档中的,如果需要指定公共参数,请查看公共参数-对象存储
编码 API 使用
使用 Go 语言的SDK即可快速进行开发
安装 SDK
- 安装命令
go get -u github.com/volcengine/ve-tos-golang-sdk/v2
- 查看SDK版本
package main
import (
"fmt"
"github.com/volcengine/ve-tos-golang-sdk/v2/tos"
)
func main() {
fmt.Println("TOS GO SDK Version: ", tos.Version)
}
使用示例
以普通上传为例,普通上传是指通过 PutObjectV2 方法上传单个对象(Object),支持上传字符串(字符流)、上传 Bytes(Bytes 流)、上传网络流和上传本地文件四种形式。
使用时需要注意:
- 上传对象前,您必须具有
tos:PutObject权限,具体操作,请参见权限配置指南。 - 上传对象时,对象名必须满足一定规范,详细信息,请参见对象命名规范。
- TOS 是面向海量存储设计的分布式对象存储产品,内部分区存储了对象索引数据。为横向扩展您上传对象和下载对象时的最大吞吐量和减小热点分区的概率,请您避免使用字典序递增的对象命名方式,详细信息,请参见性能优化。
- 如果桶中已经存在同名对象,则新对象会覆盖已有的对象。如果您的桶开启了版本控制,则会保留原有对象,并生成一个新版本号用于标识新上传的对象。
上传字符串代码(示例)更多的代码请参见 SDK :
package main
import (
"context"
"fmt"
"os"
"strings"
"github.com/volcengine/ve-tos-golang-sdk/v2/tos"
)
// checkErr 用于检查错误并打印详细的错误信息。
func checkErr(err error) {
if err != nil {
switch e := err.(type) {
case *tos.TosServerError:
// 处理服务端错误
fmt.Println("TOS Server Error:")
fmt.Printf(" Error: %s\n", e.Error())
fmt.Printf(" Request ID: %s\n", e.RequestID)
fmt.Printf(" Status Code: %d\n", e.StatusCode)
fmt.Printf(" Response Header: %v\n", e.Header)
fmt.Printf(" Error Code: %s\n", e.Code)
fmt.Printf(" Error Message: %s\n", e.Message)
case *tos.TosClientError:
// 处理客户端错误
fmt.Println("TOS Client Error:")
fmt.Printf(" Error: %s\n", e.Error())
fmt.Printf(" Cause: %s\n", e.Cause.Error())
default:
// 处理其他类型的错误
fmt.Printf("Unknown Error: %s\n", err)
}
panic(err) // 错误发生时,抛出异常终止程序
}
}
func main() {
// 从环境变量获取 TOS API 的访问密钥和密钥
accessKey := os.Getenv("TOS_ACCESS_KEY")
secretKey := os.Getenv("TOS_SECRET_KEY")
// 设置 TOS 的 Endpoint 和 Region(示例:华北2区域)
endpoint := "https://tos-cn-beijing.volces.com"
region := "cn-beijing"
// 设置 Bucket 名称
bucketName := "*** Provide your bucket name ***"
// 设置要上传的文件路径和文件名
objectKey := "example_dir/example.txt"
// 创建上下文
ctx := context.Background()
// 初始化 TOS 客户端
client, err := tos.NewClientV2(endpoint, tos.WithRegion(region), tos.WithCredentials(tos.NewStaticCredentials(accessKey, secretKey)))
checkErr(err)
// 创建要上传的文件内容
body := strings.NewReader("Hello TOS")
// 上传文件到指定的 Bucket 和 Object Key
output, err := client.PutObjectV2(ctx, &tos.PutObjectV2Input{
PutObjectBasicInput: tos.PutObjectBasicInput{
Bucket: bucketName,
Key: objectKey,
},
Content: body,
})
checkErr(err)
// 打印上传成功后的请求 ID
fmt.Printf("Upload successful. Request ID: %s\n", output.RequestID)
}
结合框架等技术,即可搭建一个简易的对象存储服务啦~
扩展应用(一些个人思考)
- 可以使用对象存储来实现个人网盘的功能
- 最近在考虑个人 NAS 系统的搭建,结合内网穿透服务,或许可以自己搭建 NAS
- 合理利用好对象存储,可以为家庭搭建照片共享服务