golang操作Amazon S3兼容存储的Minio客户端插件mc的使用

Golang操作Amazon S3兼容存储的Minio客户端插件mc的使用

MinIO Client (mc) 是一个现代化的替代UNIX命令如ls、cat、cp、mirror、diff、find等的工具。它支持文件系统和Amazon S3兼容的云存储服务(AWS签名v2和v4)。

安装MinIO Client

使用Golang安装

go install github.com/minio/mc@latest

Docker容器安装

docker pull minio/mc
docker run minio/mc ls play

macOS安装

brew install minio/stable/mc
mc --help

Linux安装

wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
./mc --help

Windows安装

mc.exe --help

添加云存储服务

要添加一个或多个Amazon S3兼容主机,请按照以下说明操作:

mc alias set <ALIAS> <YOUR-S3-ENDPOINT> <YOUR-ACCESS-KEY> <YOUR-SECRET-KEY> --api <API-SIGNATURE> --path <BUCKET-LOOKUP-TYPE>

示例 - MinIO云存储

mc alias set minio http://192.168.1.51 BKIKJAA5BMMU2RHO6IBB V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12

示例 - Amazon S3云存储

mc alias set s3 https://s3.amazonaws.com BKIKJAA5BMMU2RHO6IBB V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12

示例 - Google云存储

mc alias set gcs https://storage.googleapis.com BKIKJAA5BMMU2RHO6IBB V8f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12

测试设置

mc ls play

日常使用

创建存储桶

mc mb play/mybucket

复制对象

mc cp myobject.txt play/mybucket

Shell别名

alias ls='mc ls'
alias cp='mc cp'
alias cat='mc cat'
alias mkdir='mc mb'
alias pipe='mc pipe'
alias find='mc find'

Golang代码示例

以下是使用Golang操作MinIO的示例代码:

package main

import (
	"context"
	"fmt"
	"log"

	"github.com/minio/minio-go/v7"
	"github.com/minio/minio-go/v7/pkg/credentials"
)

func main() {
	// 初始化MinIO客户端
	endpoint := "play.min.io"
	accessKeyID := "Q3AM3UQ867SPQQA43P2F"
	secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG"
	useSSL := true

	// 初始化minio客户端对象
	minioClient, err := minio.New(endpoint, &minio.Options{
		Creds:  credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
		Secure: useSSL,
	})
	if err != nil {
		log.Fatalln(err)
	}

	// 列出所有存储桶
	buckets, err := minioClient.ListBuckets(context.Background())
	if err != nil {
		fmt.Println(err)
		return
	}
	for _, bucket := range buckets {
		fmt.Println(bucket)
	}

	// 创建一个新的存储桶
	bucketName := "mynewbucket"
	location := "us-east-1"

	err = minioClient.MakeBucket(context.Background(), bucketName, minio.MakeBucketOptions{Region: location})
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Printf("Successfully created %s\n", bucketName)

	// 上传文件
	objectName := "golden-oldies.zip"
	filePath := "/tmp/golden-oldies.zip"
	contentType := "application/zip"

	// 上传zip文件
	info, err := minioClient.FPutObject(context.Background(), bucketName, objectName, filePath, minio.PutObjectOptions{ContentType: contentType})
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Printf("Successfully uploaded %s of size %d\n", objectName, info.Size)
}

命令列表

MinIO Client提供了丰富的命令来管理存储:

  alias      管理配置文件中的服务器凭据
  admin      管理MinIO服务器
  anonymous  管理对存储桶和对象的匿名访问
  batch      管理批处理作业
  cp         复制对象
  cat        显示对象内容
  diff       列出两个存储桶之间对象名称、大小和日期的差异
  du         递归汇总磁盘使用情况
  encrypt    管理存储桶加密配置
  event      管理对象通知
  find       搜索对象
  get        将s3对象获取到本地
  head       显示对象的前'n'行
  ilm        管理存储桶生命周期
  idp        管理MinIO身份提供者服务器配置
  license    许可证相关命令
  legalhold  管理对象的法定保留
  ls         列出存储桶和对象
  mb         创建存储桶
  mv         移动对象
  mirror     将对象同步到远程站点
  od         测量单流上传和下载
  ping       执行活跃性检查
  pipe       将STDIN流式传输到对象
  put        将对象上传到存储桶
  quota      管理存储桶配额
  rm         删除对象
  retention  设置对象的保留
  rb         删除存储桶
  replicate  配置服务器端存储桶复制
  ready      检查集群是否就绪
  sql        在对象上运行SQL查询
  stat       显示对象元数据
  support    支持相关命令
  share      生成临时访问对象的URL
  tree       以树形格式列出存储桶和对象
  tag        管理存储桶和对象的标签
  undo       撤销PUT/DELETE操作
  update     将mc更新到最新版本
  version    管理存储桶版本控制
  watch      监听对象通知事件

许可证

mc的使用受GNU AGPLv3许可证的约束,该许可证可以在LICENSE文件中找到。


更多关于golang操作Amazon S3兼容存储的Minio客户端插件mc的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang操作Amazon S3兼容存储的Minio客户端插件mc的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang操作Minio客户端(mc)的使用指南

Minio客户端(mc)是一个命令行工具,用于与Minio和Amazon S3兼容的云存储服务进行交互。在Golang中,我们可以直接使用Minio官方提供的Go SDK,也可以集成mc的功能。

使用Minio Go SDK

Minio官方提供了功能完善的Go SDK,以下是基本使用方法:

1. 安装SDK

go get github.com/minio/minio-go/v7

2. 基本示例代码

package main

import (
	"context"
	"fmt"
	"log"

	"github.com/minio/minio-go/v7"
	"github.com/minio/minio-go/v7/pkg/credentials"
)

func main() {
	// 初始化客户端
	endpoint := "play.min.io" // 或你的Minio服务器地址
	accessKeyID := "Q3AM3UQ867SPQQA43P2F"
	secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG"
	useSSL := true

	// 初始化Minio客户端对象
	minioClient, err := minio.New(endpoint, &minio.Options{
		Creds:  credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
		Secure: useSSL,
	})
	if err != nil {
		log.Fatalln(err)
	}

	// 列出所有存储桶
	buckets, err := minioClient.ListBuckets(context.Background())
	if err != nil {
		log.Fatalln(err)
	}

	for _, bucket := range buckets {
		fmt.Println(bucket)
	}

	// 创建一个新存储桶
	bucketName := "my-new-bucket"
	location := "us-east-1"

	err = minioClient.MakeBucket(context.Background(), bucketName, minio.MakeBucketOptions{Region: location})
	if err != nil {
		// 检查存储桶是否已存在
		exists, errBucketExists := minioClient.BucketExists(context.Background(), bucketName)
		if errBucketExists == nil && exists {
			log.Printf("Bucket %s already exists\n", bucketName)
		} else {
			log.Fatalln(err)
		}
	} else {
		log.Printf("Successfully created bucket %s\n", bucketName)
	}

	// 上传文件
	objectName := "testfile.txt"
	filePath := "/tmp/testfile.txt"
	contentType := "application/octet-stream"

	// 上传文件
	info, err := minioClient.FPutObject(context.Background(), bucketName, objectName, filePath, minio.PutObjectOptions{ContentType: contentType})
	if err != nil {
		log.Fatalln(err)
	}
	log.Printf("Successfully uploaded %s of size %d\n", objectName, info.Size)
}

集成mc命令行工具

如果你需要在Golang中直接调用mc命令行工具,可以使用os/exec包:

package main

import (
	"fmt"
	"log"
	"os/exec"
)

func main() {
	// 设置mc别名
	setAliasCmd := exec.Command("mc", "alias", "set", "myminio", "http://localhost:9000", "minioadmin", "minioadmin")
	if err := setAliasCmd.Run(); err != nil {
		log.Fatalf("Failed to set alias: %v", err)
	}

	// 列出存储桶
	listCmd := exec.Command("mc", "ls", "myminio")
	output, err := listCmd.CombinedOutput()
	if err != nil {
		log.Fatalf("Failed to list buckets: %v", err)
	}
	fmt.Printf("Buckets:\n%s", string(output))

	// 上传文件
	uploadCmd := exec.Command("mc", "cp", "/path/to/local/file.txt", "myminio/mybucket/")
	if err := uploadCmd.Run(); err != nil {
		log.Fatalf("Failed to upload file: %v", err)
	}
	fmt.Println("File uploaded successfully")
}

高级功能

1. 生成预签名URL

// 生成预签名URL,有效期7天
presignedURL, err := minioClient.PresignedGetObject(context.Background(), bucketName, objectName, time.Second*24*60*60*7, nil)
if err != nil {
	log.Fatalln(err)
}
fmt.Println("Presigned URL:", presignedURL)

2. 设置存储桶策略

policy := `{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Principal": {"AWS": ["*"]},
			"Action": ["s3:GetObject"],
			"Resource": ["arn:aws:s3:::mybucket/*"]
		}
	]
}`

err = minioClient.SetBucketPolicy(context.Background(), bucketName, policy)
if err != nil {
	log.Fatalln(err)
}

3. 监听存储桶事件

// 监听存储桶事件
for notificationInfo := range minioClient.ListenBucketNotification(context.Background(), bucketName, "", "", []string{
	"s3:ObjectCreated:*",
	"s3:ObjectRemoved:*",
}) {
	if notificationInfo.Err != nil {
		log.Println(notificationInfo.Err)
		continue
	}
	
	for _, record := range notificationInfo.Records {
		fmt.Printf("Event: %s, Bucket: %s, Object: %s\n", 
			record.EventName, 
			record.S3.Bucket.Name, 
			record.S3.Object.Key)
	}
}

最佳实践

  1. 连接池管理:Minio客户端会自动管理连接池,无需手动处理
  2. 上下文使用:始终传递context以便于超时和取消控制
  3. 错误处理:检查所有操作返回的错误
  4. 并行上传:对于大文件,使用分片上传提高性能

通过以上方法,你可以在Golang中高效地操作Minio或S3兼容的存储服务。

回到顶部