|
| 1 | +--- |
| 2 | +title: "RustFS Golang SDK 使用指南" |
| 3 | +description: "通过 Golang SDK 来对 RustFS 实例进行操作,包括存储桶、对象的创建和删除." |
| 4 | +--- |
| 5 | + |
| 6 | +# Golang SDK |
| 7 | + |
| 8 | +由于 RustFS 是完全兼容 S3 的对象存储系统,因此可以通过对 S3 的 TypeScript SDK 做一些封装来构建适用于 RustFS 的 Golang SDK,通过 SDK 对 RustFS 进行操作,包括存储桶/对象的创建和删除、文件的上传和下载等。 |
| 9 | + |
| 10 | +## 前提条件 |
| 11 | + |
| 12 | +- 一个可用的 RustFS 实例(可参考[安装指南](../../installation/index.md)进行安装)。 |
| 13 | +- 访问密钥(可参考[访问密钥管理](../../administration/iam/access-token.md)进行创建)。 |
| 14 | + |
| 15 | +## RustFS Golang SDK 构造 |
| 16 | + |
| 17 | +利用 `RUSTFS_ACCESS_KEY_ID`、`RUSTFS_SECRET_ACCESS_KEY`、`RUSTFS_ENDPOINT_URL`、`RUSTFS_REGION` 构造一个 `aws.Config`,然后使用 Golang S3 SDK 中的 `s3.NewFromConfig` 构建一个 RustFS Client: |
| 18 | + |
| 19 | +``` |
| 20 | +region := os.Getenv("RUSTFS_REGION") |
| 21 | +access_key_id := os.Getenv("RUSTFS_ACCESS_KEY_ID") |
| 22 | +secret_access_key := os.Getenv("RUSTFS_SECRET_ACCESS_KEY") |
| 23 | +endpoint := os.Getenv("RUSTFS_ENDPOINT_URL") |
| 24 | +// usePathStyle := strings.ToLower(os.Getenv("AWS_S3_USE_PATH_STYLE")) == "true" |
| 25 | +
|
| 26 | +if access_key_id == "" || secret_access_key == "" || region == "" || endpoint == "" { |
| 27 | + log.Fatal("missing the env: RUSTFS_ACCESS_KEY_ID / RUSTFS_SECRET_ACCESS_KEY / RUSTFS_REGION / RUSTFS_ENDPOINT_URL") |
| 28 | +} |
| 29 | +
|
| 30 | +// build aws.Config |
| 31 | +cfg := aws.Config{ |
| 32 | + Region: region, |
| 33 | + EndpointResolver: aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) { |
| 34 | + return aws.Endpoint{ |
| 35 | + URL: endpoint, |
| 36 | + }, nil |
| 37 | + }), |
| 38 | + Credentials: aws.NewCredentialsCache(credentials.NewStaticCredentialsProvider(access_key_id, secret_access_key, "")), |
| 39 | +} |
| 40 | +
|
| 41 | +// build S3 client |
| 42 | +client := s3.NewFromConfig(cfg, func(o *s3.Options) { |
| 43 | + o.UsePathStyle = true |
| 44 | +}) |
| 45 | +``` |
| 46 | + |
| 47 | +接着就可以使用构造好的 RustFS Client 进行存储桶、对象的操作了。 |
| 48 | + |
| 49 | + |
| 50 | +## 创建存储桶 |
| 51 | + |
| 52 | +``` |
| 53 | +_, err = client.CreateBucket(ctx, &s3.CreateBucketInput{ |
| 54 | + Bucket: aws.String("go-sdk-rustfs"), |
| 55 | +}) |
| 56 | +if err != nil { |
| 57 | + log.Fatalf("create bucket failed: %v", err) |
| 58 | +} |
| 59 | +``` |
| 60 | + |
| 61 | +## 列出存储桶 |
| 62 | + |
| 63 | +``` |
| 64 | +resp, err := client.ListBuckets(ctx, &s3.ListBucketsInput{}) |
| 65 | +if err != nil { |
| 66 | + log.Fatalf("list buckets failed: %v", err) |
| 67 | +} |
| 68 | +
|
| 69 | +fmt.Println("Buckets:") |
| 70 | +for _, b := range resp.Buckets { |
| 71 | + fmt.Println(" -", *b.Name) |
| 72 | +} |
| 73 | +``` |
| 74 | + |
| 75 | +## 删除存储桶 |
| 76 | + |
| 77 | +``` |
| 78 | +_, err = client.DeleteBucket(ctx, &s3.DeleteBucketInput{ |
| 79 | + Bucket: aws.String("go-sdk-rustfs"), |
| 80 | +}) |
| 81 | +if err != nil { |
| 82 | + log.Fatalf("delete bucket failed: %v", err) |
| 83 | +} |
| 84 | +``` |
| 85 | + |
| 86 | +## 列出存储对象 |
| 87 | + |
| 88 | +``` |
| 89 | +resp, err := client.ListObjectsV2(ctx, &s3.ListObjectsV2Input{ |
| 90 | + Bucket: aws.String("bucket-target"), |
| 91 | +}) |
| 92 | +if err != nil { |
| 93 | + log.Fatalf("list object failed: %v", err) |
| 94 | +} |
| 95 | +for _, obj := range resp.Contents { |
| 96 | + fmt.Println(" -", *obj.Key) |
| 97 | +} |
| 98 | +``` |
| 99 | + |
| 100 | +## 上传对象 |
| 101 | + |
| 102 | +``` |
| 103 | +_, err = client.PutObject(ctx, &s3.PutObjectInput{ |
| 104 | + Bucket: aws.String("bucket-target"), |
| 105 | + Key: aws.String("test.txt"), |
| 106 | + Body: strings.NewReader("hello rustfs"), |
| 107 | +}) |
| 108 | +if err != nil { |
| 109 | + log.Fatalf("upload object failed: %v", err) |
| 110 | +} |
| 111 | +``` |
| 112 | + |
| 113 | +## 下载对象 |
| 114 | + |
| 115 | +``` |
| 116 | +resp, err := client.GetObject(ctx, &s3.GetObjectInput{ |
| 117 | + Bucket: aws.String("bucket-target"), |
| 118 | + Key: aws.String("1.txt"), |
| 119 | +}) |
| 120 | +if err != nil { |
| 121 | + log.Fatalf("download object fail: %v", err) |
| 122 | +} |
| 123 | +defer resp.Body.Close() |
| 124 | +
|
| 125 | +// read object content |
| 126 | +data, err := io.ReadAll(resp.Body) |
| 127 | +if err != nil { |
| 128 | + log.Fatalf("read object content fail: %v", err) |
| 129 | +} |
| 130 | +fmt.Println("content is :", string(data)) |
| 131 | +``` |
| 132 | + |
| 133 | +其他的使用,大家可以自行探索,如果借助 Vibe Coding,就更简单了! |
0 commit comments