VK Cloud logo
Обновлена17 июля 2023 г. в 08:28

Операции с объектами

Проведя предварительные настройки сессии, можно приступить к работе с объектами S3.

Загрузка объекта

Загрузка объектов в бакет инициализируется данной командой:

1package main
2
3import (
4	"github.com/aws/aws-sdk-go/aws"
5	"github.com/aws/aws-sdk-go/aws/session"
6	"github.com/aws/aws-sdk-go/service/s3"
7	"log"
8	"os"
9	"strings"
10)
11
12const (
13	vkCloudHotboxEndpoint = "https://hb.vkcs.cloud"
14	defaultRegion         = "us-east-1"
15)
16
17func main() {
18	// Создание сессии
19	sess, _ := session.NewSession()
20
21	// Подключение к сервису S3
22	svc := s3.New(sess, aws.NewConfig().WithEndpoint(vkCloudHotboxEndpoint).WithRegion(defaultRegion))
23
24	bucket := "gobucket"
25
26	// Загрузка объекта из строки в бакет
27	key := "test_string.txt"
28	body := "Hello World!"
29
30	if _, err := svc.PutObject(&s3.PutObjectInput{
31		Bucket: aws.String(bucket),
32		Key:    aws.String(key),
33		Body:   strings.NewReader(body),
34	}); err != nil {
35		log.Fatalf("Unable to upload %q to %q, %v\n", body, bucket, err)
36	} else {
37		log.Printf("File %q uploaded to bucket %q\n", body, bucket)
38	}
39
40	// Загрузка объекта из файла в бакет
41	fileName := "test.txt"
42	file, err := os.Open(fileName)
43	if err != nil {
44		log.Fatalf("Unable to open file %q, %v\n", fileName, err)
45	}
46
47	defer file.Close()
48
49	if _, err := svc.PutObject(&s3.PutObjectInput{
50		Bucket: aws.String(bucket),
51		Key:    aws.String(key),
52		Body:   file,
53	}); err != nil {
54		log.Fatalf("Unable to upload %q to %q, %v\n", fileName, bucket, err)
55	} else {
56		log.Printf("File %q uploaded to bucket %q\n", fileName, bucket)
57	}
58}

Подробное описание PutObject дано в официальной документации библиотеки aws-sdk-go.

Копирование объектов между бакетами

Копирование объектов между бакетами можно выполнить следующим образом:

1package main
2
3import (
4	"fmt"
5	"github.com/aws/aws-sdk-go/aws"
6	"github.com/aws/aws-sdk-go/aws/session"
7	"github.com/aws/aws-sdk-go/service/s3"
8	"log"
9	"strings"
10)
11
12const (
13	vkCloudHotboxEndpoint = "https://hb.vkcs.cloud"
14	defaultRegion         = "us-east-1"
15)
16
17func main() {
18	// Создание сессии
19	sess, _ := session.NewSession()
20
21	// Подключение к сервису S3
22	svc := s3.New(sess, aws.NewConfig().WithEndpoint(vkCloudHotboxEndpoint).WithRegion(defaultRegion))
23
24	// Копирование объекта из одного бакета в другой
25	
26	sourceBucket := "gobucket"
27	sourceKey := "test_string.txt"
28	destBucket := "gobucket2"
29	destKey := "test_string.txt"
30
31	if _, err := svc.CopyObject(&s3.CopyObjectInput{
32		Bucket:     aws.String(destBucket),
33		Key:        aws.String(destKey),
34		CopySource: aws.String(fmt.Sprintf("%s/%s", sourceBucket, sourceKey)),
35	}); err != nil {
36		log.Fatalf("Unable to copy object from %q to %q, %v\n", sourceBucket, destBucket, err)
37	} else {
38		fmt.Printf("Object copied from %q to %q\n", sourceBucket, destBucket)
39	}
40}

Подробное описание команды CopyObject дано в официальной документации библиотеки aws-sdk-go

Получение объекта

Для получения объекта из бакета следует воспользоваться следующим способом:

1package main
2
3import (
4	"github.com/aws/aws-sdk-go/aws"
5	"github.com/aws/aws-sdk-go/aws/session"
6	"github.com/aws/aws-sdk-go/service/s3"
7	"log"
8	"strings"
9)
10
11const (
12	vkCloudHotboxEndpoint = "https://hb.vkcs.cloud"
13	defaultRegion         = "us-east-1"
14)
15
16func main() {
17	// Создание сессии
18	sess, _ := session.NewSession()
19
20	// Подключение к сервису S3
21	svc := s3.New(sess, aws.NewConfig().WithEndpoint(vkCloudHotboxEndpoint).WithRegion(defaultRegion))
22
23	bucket := "gobucket"
24	key := "test_string.txt"
25
26	// извлечение объекта из бакета
27	if result, err := svc.GetObject(&s3.GetObjectInput{
28		Bucket: aws.String(bucket),
29		Key:    aws.String(key),
30	}); err != nil {
31		log.Fatalf("Unable to get object %q from bucket %q, %v\n", key, bucket, err)
32	} else {
33		data := make([]byte, *result.ContentLength)
34		result.Body.Read(data)
35		log.Printf("File with data %q downloaded from bucket %q", data, bucket)
36	}
37}

Подробное описание команды GetObject дано в официальной документации библиотеки aws-sdk-go.

Получение списка объектов

Для получения списка объектов в бакете выполнить код:

1package main
2
3import (
4	"github.com/aws/aws-sdk-go/aws"
5	"github.com/aws/aws-sdk-go/aws/session"
6	"github.com/aws/aws-sdk-go/service/s3"
7	"log"
8)
9
10const vkCloudHotboxEndpoint = "https://hb.vkcs.cloud"
11
12const defaultRegion = "us-east-1"
13
14func main() {
15	// Создание сессии
16	sess, _ := session.NewSession()
17
18	// Подключение к сервису S3
19	svc := s3.New(sess, aws.NewConfig().WithEndpoint(vkCloudHotboxEndpoint).WithRegion(defaultRegion))
20
21	bucket := "gobucket"
22	// получение списка объектов в бакете
23	result, err := svc.ListObjectsV2(&s3.ListObjectsV2Input{
24		Bucket: aws.String(bucket),
25	})
26	if err != nil {
27		log.Fatalf("Unable to list items in bucket %q, %v", bucket, err)
28	} else {
29        // итерирование по объектам
30		for _, item := range result.Contents {
31			log.Printf("Object: %s, size: %d\n", aws.StringValue(item.Key), aws.Int64Value(item.Size))
32		}
33	}
34}

В официальной документации к библиотеке aws-sdk-go дано подробное описание команды ListObjectsV2.

Удаление объекта

Чтобы удалить объекты в бакете:

1package main
2
3import (
4	"github.com/aws/aws-sdk-go/aws"
5	"github.com/aws/aws-sdk-go/aws/session"
6	"github.com/aws/aws-sdk-go/service/s3"
7	"log"
8	"strings"
9)
10
11const (
12	vkCloudHotboxEndpoint = "https://hb.vkcs.cloud"
13	defaultRegion = "us-east-1"
14)
15
16func main() {
17	// Создание сессии
18	sess, err := session.NewSession()
19	if err != nil {
20		log.Fatalf("Unable to create session, %v", err)
21	}
22	// Подключение к сервису S3
23	svc := s3.New(sess, aws.NewConfig().WithEndpoint(vkCloudHotboxEndpoint).WithRegion(defaultRegion))
24
25	// Удаление объекта из бакета
26    bucket := "gobucket"
27	key := "test_string.txt"
28
29	if _, err := svc.DeleteObject(&s3.DeleteObjectInput{
30		Bucket: aws.String(bucket),
31		Key:    aws.String(key),
32	}); err != nil {
33		log.Fatalf("Unable to delete object %q from bucket %q, %v\n", key, bucket, err)
34	} else {
35		log.Printf("Object %q deleted from bucket %q\n", key, bucket)
36	}
37
38    // Удаление множества объектов
39	if _, err := svc.DeleteObjects(&s3.DeleteObjectsInput{
40		Bucket: aws.String(bucket),
41		Delete: &s3.Delete{
42			Objects: []*s3.ObjectIdentifier{
43				{
44					Key: aws.String("test_string1.txt"),
45				},
46				{
47					Key: aws.String("test_string2.txt"),
48				},
49			},
50		},
51	}); err != nil {
52		log.Fatalf("Unable to delete objects from bucket %q, %v\n", bucket, err)
53	} else {
54		log.Printf("Objects deleted from bucket %q\n", bucket)
55	}
56}

Подробное описание команд дано в официальной документации библиотеки aws-sdk-go по методам DeleteObject и DeleteObjects.