使用 Go CDK 通过 S3 协议对接对象存储 Kodo
Go 云开发工具包(Go CDK)是一个支持跨云服务商的基础 SDK,提供多种通用的应用程序接口对接云存储,云事件以及云数据库。这里展示用 CDK 的 blob 包通过 S3 协议对接七牛的案例。
配置 AWS 鉴权参数
方法 1. 使用 aws configure
# 确保 Python 3 和 pip3 已经正确安装
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws configure
填写 Qiniu Access Key ID 和 Qiniu Secret Key 即可
方法 2. 直接编写配置文件
编写 ~/.aws/credentials
[default]
aws_access_key_id = <AccessKey>
aws_secret_access_key = <SecretKey>
初始化 S3 bucket
在 Golang 程序中导入 Go CDK 包和 s3blob 驱动
import (
"gocloud.dev/blob"
_ "gocloud.dev/blob/s3blob"
)
初始化 S3 bucket 的代码为(这里的 S3 Region Id
和 S3 Endpoint URL
可以参考服务域名)
values := url.Values{"awssdk": []string{"v2"}, "region": []string{"<S3 Region Id>"}, "endpoint": []string{"<S3 Endpoint URL>"}}
bucket, err := blob.OpenBucket(ctx, "s3://<Bucket>?" + values.Encode())
从 S3 bucket 中列出对象
iter := bucket.List(nil) // 这里可以额外填写 Delimiter 和 Prefix
for {
object, err := iter.Next(ctx)
if err != nil {
if err == io.EOF {
break
}
return err
}
fmt.Printf("%s\n", object.Key)
}
获取对象属性
info, err := bucket.Attributes(context.Background(), objectName)
if err != nil {
return err
}
fmt.Printf("Size: %d\n", info.Size)
fmt.Printf("Content-Type: %s\n", info.ContentType)
fmt.Printf("MD5: %#v\n", info.MD5)
fmt.Printf("ETag: %#v\n", info.ETag)
fmt.Printf("Metadata: %#v\n", info.Metadata)
fmt.Printf("ModTime: %s\n", info.ModTime)
从对象中读取数据
reader, err := bucket.NewReader(ctx, objectName, nil)
if err != nil {
return err
}
defer reader.Close()
这里的 reader
实现了 io.Reader
,io.WriterTo
,io.Seeker
和 io.Closer
接口
将数据写入到对象中
writer, err := bucket.NewWriter(ctx, objectName, &blob.WriterOptions{
ContentType: contentType,
Metadata: metadata,
})
if err != nil {
return err
}
defer writer.Close()
这里的 writer
实现了 io.Writer
,io.ReaderFrom
和 io.Closer
接口
复制对象
err = bucket.Copy(ctx, destObjectName, srcObjectName, nil)
if err != nil {
return err
}
删除对象
err := bucket.Delete(ctx, objectNameToDelete)
if err != nil {
return err
}
生成对象下载 URL
signedUrl, err := bucket.SignedURL(ctx, objectName, &blob.SignedURLOptions{Expiry: time.Minute, Method: http.MethodGet})
if err != nil {
return err
}
fmt.Printf("GET URL: %s\n", signedUrl)
生成对象上传 URL
signedUrl, err := bucket.SignedURL(ctx, objectName, &blob.SignedURLOptions{Expiry: time.Minute, Method: http.MethodPut})
if err != nil {
return err
}
fmt.Printf("PUT URL: %s\n", signedUrl)
文档反馈
(如有产品使用问题,请 提交工单)