对象存储

  • 对象存储 > 最佳实践 > 对象存储开源生态建设 > 使用 Go CDK 对接对象存储 Kodo >使用 Go CDK 通过 S3 协议对接对象存储 Kodo

    使用 Go CDK 通过 S3 协议对接对象存储 Kodo

    最近更新时间: 2024-01-29 17:01:29

    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 IdS3 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.Readerio.WriterToio.Seekerio.Closer 接口

    将数据写入到对象中

    writer, err := bucket.NewWriter(ctx, objectName, &blob.WriterOptions{
    	ContentType: contentType,
    	Metadata: metadata,
    })
    if err != nil {
    	return err
    }
    defer writer.Close()
    

    这里的 writer 实现了 io.Writerio.ReaderFromio.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)
    
    以上内容是否对您有帮助?
  • Qvm free helper
    Close