Go 通过七牛云免费测试存储空间实现S3

325 阅读3分钟

一、S3 基础概念:对象存储的核心设计​

​S3(Simple Storage Service)​​ 是 AWS 提出的对象存储协议标准,其核心设计理念包括:

  • ​扁平化存储结构​​:数据以 ​​对象​​(Object)形式存储于 ​​桶​​(Bucket)中,无目录层级,仅通过唯一键(Key)寻址。
  • ​HTTP RESTful API​​:通过标准 HTTP 方法(PUT/GET/DELETE)操作资源,天然跨平台、跨语言。
  • ​强扩展性​​:支持海量非结构化数据(图片、视频、日志等)的高并发存取。
  • ​元数据管理​​:每个对象可携带自定义元数据(如 Content-TypeETag

二、通过七牛云免费测试存储空间实现S3

  1. 进入七牛云管理页面,选择对象存储Kodo image.png

  2. 点击空间管理 -> 新建空间 -> 输入存储空间名称 -> 存储区域 image.png

  3. 此时七牛云会询问是否绑定自己的是CDN加速域名,(学习使用当然没有对应的CDN加速域名),贴心的七牛云会给我们分配一个30天的临时测试域名。如果忘了,可以进入域名管理查看image.png

  4. 创建AccessKey/SecretKey。点击右侧密钥管理,进入根据提示创建属于自己的AccessKey/SecretKey image.png

三、根据创建空间的存储区域查询服务域名

服务域名_使用指南_对象存储 - 七牛开发者中心进入,查询对应的RegionID 及Endpoint即可,后面要用image.png

四、编写测试代码实现

因为S3最初由AWS推行,后续各云厂商为了“抢人”。几乎都适配了Aws的API,所以我们就用AWS的API就行,也可以去对应的云厂商查看对应的API及用法

package article

import (
	"bytes"
	"context"
	"io"
	"os"
	"testing"
	"time"
	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/s3"
	"github.com/stretchr/testify/assert"
)

func TestS3(t *testing.T) {
	// 使用七牛云的S3服务
	cosId, ok := os.LookupEnv("QiNiuYunS3Key") //对应密钥管理里面的AccessKey
	if !ok {
		panic("没有找到环境变量 QiNiuYunS3Key ")
	}
	cosKey, ok := os.LookupEnv("QiNiuYunS3Secret")//对应密钥管理里面的SecretKey
	if !ok {
		panic("没有找到环境变量 QiNiuYunS3Key")
	}
	sess, err := session.NewSession(&aws.Config{
		Credentials: credentials.NewStaticCredentials(cosId, cosKey, ""),
          //创建空间时选择的区域,我选择的是华南-广东所以是这个值
		Region:      aws.String("cn-south-1"),
          //对应Region的Endpoint
		Endpoint:    aws.String("https://s3-cn-south-1.qiniucs.com"),
		// 强制使用 /bucket/key 的形态
		S3ForcePathStyle: aws.Bool(true),
	})
	assert.NoError(t, err)
	client := s3.New(sess)
	ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
	defer cancel()
  //上传到S3存储空间
	_, err = client.PutObjectWithContext(ctx, &s3.PutObjectInput{
           //创建的空间名,即桶名
		Bucket:      aws.String("xxxx"),
          //桶key
		Key:         aws.String("12"),
          //内容
		Body:        bytes.NewReader([]byte("这是一个测试文件用于测试s312")),
		ContentType: aws.String("text/plain;charset=utf-8"),
	})
	assert.NoError(t, err)
  //从S3存储空间获取数据
	res, err := client.GetObjectWithContext(ctx, &s3.GetObjectInput{
		Bucket: aws.String("xxxxx"),
		Key:    aws.String("12"),
	})
	assert.NoError(t, err)
	data, err := io.ReadAll(res.Body)
	assert.NoError(t, err)
	t.Log(string(data))
}

五、总结

实现这个过程其实很简单,而且七牛云非常良心有30天的免费测试域名,以下是上面代码对应的需要的信息:

keyvalue
Bucket创建的存储空间名
Key存储空间内存储的名称
cosId密钥管理生成的AccessKey
cosKey密钥管理生成的SecretKey
Region服务域名种对应的创建存储空间时的区域
EndpointRegion对应的Endpoint