Копирование, переименование и перемещение объектов
Любой объект в Object Storage можно копировать из одного бакета в другой. Операция копирования создает новую копию объекта, при этом исходный объект остается неизменным. Также вы можете копировать объекты внутри бакета — в этом случае вы создаете дополнительную копию объекта, но с другим ключом.
Для копирования у вас должны быть права на чтение объектов в исходном бакете и на запись – в целевом. Если вы копируете объект в другой бакет, и в нем уже есть объект с таким же ключом, старый объект будет заменен новым.
С помощью операции копирования вы можете:
- создавать дополнительные копии объектов;
- переименовывать объекты;
- перемещать объекты из одного бакета в другой;
- перемещать объекты из одной папки в другую;
- изменять метаданные объектов.
Чтобы не удалить старый объект и при этом хранить в бакете копию, включите версионирование — новый объект при совпадении имен будет сохранен как одна из версий старого.
Скопировать один объект из одного бакета в другой
Заголовок раздела «Скопировать один объект из одного бакета в другой»- AWS CLI
- Python
- Go
1aws s3 cp s3://<имя бакета 1>/<ключ объекта> s3://<имя бакета 2>/<ключ объекта>Приведенный код на Python:
- Импортирует библиотеку
boto3– официальный AWS SDK для Python. - Создает подключение к Object Storage.
- Определяет исходный бакет и исходный объект.
- Создает словарь c информацией об объекте, который нужно скопировать.
- Определяет целевой бакет.
- Копирует объект в целевой бакет.
- В случае отсутствия ошибок выводит сообщение об успешном копировании объекта.
1import boto32from botocore.exceptions import ClientError3
4try:5 s3 = boto3.resource('s3')6
7 source_bucket = 'bucket1'8 source_object = 'file1.txt'9
10 copy_source = {11 'Bucket': source_bucket,12 'Key': source_object13 }14
15 dest_bucket = s3.Bucket('bucket2')16 dest_bucket.copy(copy_source, 'file1.txt')17
18 print(f'Object {source_object} copied to {dest_bucket.name}')19
20except ClientError as e:21 print(f'Error copying object: {e}')22except Exception as e:23 print(f'Unexpected error: {e}')Приведенный код на Go:
- Импортирует необходимые пакеты, в том числе AWS SDK для Go.
- Подгружает конфигурацию из файлов
~/.aws/*. - Создает клиент для подключения к Object Storage.
- Определяет исходный и целевой бакеты.
- Копирует объект.
- В случае отсутствия ошибок выводит сообщение об успешном копировании объекта.
1package main2
3import (4 "context"5 "fmt"6 "log"7
8 "github.com/aws/aws-sdk-go-v2/config"9 "github.com/aws/aws-sdk-go-v2/service/s3"10)11
12func main() {13 // Загружаем конфигурацию и14 cfg, err := config.LoadDefaultConfig(context.TODO())15 if err != nil {16 log.Fatal(err)17 }18
19 // Создаем клиент для подключения к Object Storage20 client := s3.NewFromConfig(cfg)21
22 // Определяем исходный и целевой бакет23 sourceBucket := "bucket1"24 sourceKey := "file1.txt"25 destBucket := "bucket2"26 destKey := "file.txt"27
28 // Формируем строку источника в формате "bucket-name/object-key"29 copySource := fmt.Sprintf("%s/%s", sourceBucket, sourceKey)30
31 // Копируем объект32 _, err = client.CopyObject(context.TODO(), &s3.CopyObjectInput{33 Bucket: &destBucket,34 CopySource: ©Source,35 Key: &destKey,36 })37 if err != nil {38 log.Fatalf("Unable to copy object from %s/%s to %s/%s, %v",39 sourceBucket, sourceKey, destBucket, destKey, err)40 }41
42 fmt.Printf("Successfully copied object from %s/%s to %s/%s\n",43 sourceBucket, sourceKey, destBucket, destKey)44}Скопировать все объекты из одного бакета в другой
Заголовок раздела «Скопировать все объекты из одного бакета в другой»- AWS CLI
- Python
- Go
1aws s3 cp --recursive s3://<имя бакета 1> s3://<имя бакета 2>Приведенный код на Python:
- Импортирует библиотеку
boto3— официальный AWS SDK для Python. - Cоздает клиент для подключения к Object Storage.
- Определяет исходный (откуда копируются файлы) и целевой (куда копируются файлы) бакеты.
- Получает список объектов в исходном бакете.
- Проходит циклом по списку и копирует каждый объект в целевой бакет.
- Выводит сообщения о копировании каждого объекта.
- Выводит сообщение об успешном копировании всех объектов, если копирование прошло без ошибок.
1import boto32from botocore.exceptions import ClientError3
4try:5 # Создаем клиент S36 s3 = boto3.resource('s3')7
8 # Указываем исходный и целевой бакеты9 source_bucket = 'bucket1'10 destination_bucket = 'bucket2'11
12 # Получаем список всех объектов в исходном бакете13 source = s3.Bucket(source_bucket)14 destination = s3.Bucket(destination_bucket)15
16 # Копируем каждый объект17 for obj in source.objects.all():18 copy_source = {19 'Bucket': source_bucket,20 'Key': obj.key21 }22
23 print(f'Copying {obj.key}')24
25 # Копируем объект26 destination.copy(copy_source, obj.key)27
28 print(f'All objects from {source_bucket} copied to {destination_bucket}')29
30except ClientError as e:31 print(f'Error copying objects: {e}')32except Exception as e:33 print(f'Unexpected error: {e}')Приведенный код на Go:
- Импортирует необходимые пакеты, в том числе AWS SDK для Go.
- Подгружает конфигурацию из файлов
~/.aws/*]`. - Создает клиент для доступа к Object Storage.
- Определяет исходный (откуда копировать все файлы) и целевой (куда копировать все файлы) бакеты.
- Выполняет параллельное копирование все объектов из исходного бакета в целевой.
- Выводит сообщение о завершении копирования. Если какие-то объекты не были скопированы, информация о них ключается в вывод.
1package main2
3import (4 "context"5 "fmt"6 "log"7 "sync"8
9 "github.com/aws/aws-sdk-go-v2/config"10 "github.com/aws/aws-sdk-go-v2/service/s3"11)12
13func copyObject(ctx context.Context, client *s3.Client, sourceBucket, destBucket, key string) error {14 copySource := fmt.Sprintf("%s/%s", sourceBucket, key)15
16 _, err := client.CopyObject(ctx, &s3.CopyObjectInput{17 Bucket: &destBucket,18 CopySource: ©Source,19 Key: &key,20 })21
22 if err != nil {23 return fmt.Errorf("failed to copy %s: %v", key, err)24 }25
26 fmt.Printf("Successfully copied: %s\n", key)27 return nil28}29
30func main() {31 ctx := context.TODO()32
33 // Подгружаем конфигурацию из .aws34 cfg, err := config.LoadDefaultConfig(ctx)35 if err != nil {36 log.Fatal(err)37 }38
39 // Создаем клиент для подключения к Object Storage40 client := s3.NewFromConfig(cfg)41
42 // Определяем исходный бакет и бакет назначения43 sourceBucket := "bucket1"44 destBucket := "bucket2"45
46 // Получаем список объектов в исходном бакете47 paginator := s3.NewListObjectsV2Paginator(client, &s3.ListObjectsV2Input{48 Bucket: &sourceBucket,49 })50
51 // Используем WaitGroup для отслеживания завершения всех горутин52 var wg sync.WaitGroup53 // Канал для ограничения количества одновременных операций54 semaphore := make(chan struct{}, 10) // максимум 10 одновременных копирований55
56 // Счетчики для статистики57 var (58 successCount int59 errorCount int60 mu sync.Mutex // для безопасного доступа к счетчикам61 )62
63 // Перебираем все объекты64 for paginator.HasMorePages() {65 page, err := paginator.NextPage(ctx)66 if err != nil {67 log.Printf("Error getting page: %v", err)68 continue69 }70
71 for _, obj := range page.Contents {72 wg.Add(1)73 go func(key string) {74 defer wg.Done()75
76 // Получаем слот в семафоре77 semaphore <- struct{}{}78 defer func() { <-semaphore }()79
80 err := copyObject(ctx, client, sourceBucket, destBucket, key)81
82 mu.Lock()83 if err != nil {84 errorCount++85 log.Printf("Error copying %s: %v", key, err)86 } else {87 successCount++88 }89 mu.Unlock()90 }(*obj.Key)91 }92 }93
94 // Ждем завершения всех копирований95 wg.Wait()96
97 // Выводим итоговую статистику98 fmt.Printf("\nCopy completed:\n")99 fmt.Printf("Successfully copied: %d objects\n", successCount)100 fmt.Printf("Failed to copy: %d objects\n", errorCount)101}Переименовать объект
Заголовок раздела «Переименовать объект»Метаданные и версии объекта при переименовании сохраняются. Если в бакете включено версионирование, то все версии после переименования будут сохранены.
- AWS CLI
- Python
- Go
1aws s3 mv s3://<старoе имя объекта> s3://<новое имя объекта>Приведенный код на Python:
- Импортирует библиотеку
boto3— официальный AWS SDK для Python. - Создает клиент для подключения к Object Storage.
- Определяет переменные с именами бакета, старого и нового объекта.
- Копирует объект с новым именем.
- Удаляет старый объект.
- Выводит сообщение об успешном переименовании объекта.
1mport boto32from botocore.exceptions import ClientError3
4try:5 # Создаем клиент S36 s3 = boto3.client('s3')7
8 # Параметры9 bucket_name = 'bucket'10 old_key = 'file1.txt'11 new_key = 'file2.txt'12
13 # Копируем объект с новым именем14 copy_source = {15 'Bucket': bucket_name,16 'Key': old_key17 }18
19 s3.copy_object(20 Bucket=bucket_name,21 CopySource=copy_source,22 Key=new_key23 )24
25 # Удаляем старый объект26 s3.delete_object(27 Bucket=bucket_name,28 Key=old_key29 )30
31 print(f'Successfully renamed {old_key} to {new_key}')32
33except ClientError as e:34 print(f'Error: {e}')35except Exception as e:36 print(f'Unexpected error: {e}')Приведенный код на Go:
- Импортирует нужные модули, в том числе официальный AWS SDK для Go.
- Подгружает конфигурацию из
~/.aws/*. - Создает клиент для доступа к Object Storage.
- Делает копию объекта с новым именем.
- Выводит сообщение об успешном переименовании объекта.
1package main2
3import (4 "context"5 "fmt"6 "log"7
8 "github.com/aws/aws-sdk-go-v2/config"9 "github.com/aws/aws-sdk-go-v2/service/s3"10)11
12func main() {13 // Подгружаем конфигурацию из ~/.aws/*14 cfg, err := config.LoadDefaultConfig(context.TODO())15 if err != nil {16 log.Fatal(err)17 }18
19 // Создаем клиент для доступа к Object Storage20 client := s3.NewFromConfig(cfg)21
22 // Указываем имя бакета и ключи объектов23 bucketName := "newbucket"24 oldKey := "file.txt"25 newKey := "file1.txt"26
27 // Формируем строку источника28 copySource := fmt.Sprintf("%s/%s", bucketName, oldKey)29
30 // Копируем объект с новым именем31 _, err = client.CopyObject(context.TODO(), &s3.CopyObjectInput{32 Bucket: &bucketName,33 CopySource: ©Source,34 Key: &newKey,35 })36 if err != nil {37 log.Fatalf("Unable to copy object: %v", err)38 }39
40 // Удаляем старый объект41 _, err = client.DeleteObject(context.TODO(), &s3.DeleteObjectInput{42 Bucket: &bucketName,43 Key: &oldKey,44 })45 if err != nil {46 log.Fatalf("Unable to delete old object: %v", err)47 }48
49 fmt.Printf("Successfully renamed object from %s to %s in bucket %s\n",50 oldKey, newKey, bucketName)51}Переместить объект из одного бакета в другой
Заголовок раздела «Переместить объект из одного бакета в другой»- AWS CLI
- Python
- Go
1aws s3 mv s3://<имя исходного бакета>/<имя объекта> s3://<имя целевого бакета>/<имя объекта>Приведенный код на Python:
- Импортирует библиотеку
boto3– официальный AWS SDK для Python. - Создает клиент для подключения к Object Storage.
- Определяет имена исходного и целевого бакетов, а также ключ объекта, который нужно переместить.
- Копирует объект в целевой бакет.
- Удаляет объект из исходного бакета.
- Выводит сообщение об успешном перемещении объекта
1import boto32from botocore.exceptions import ClientError3
4try:5 # Создаем клиент S36 s3 = boto3.client('s3')7
8 # Определям имя исходного бакета, имя целевого бакета, ключ объекта9 old_bucket = 'bucket1'10 object_key = 'file.txt'11 new_bucket = 'bucket2'12
13 # Копируем объект в целевой бакет14 copy_source = {15 'Bucket': old_bucket,16 'Key': object_key17 }18
19 s3.copy_object(20 Bucket=new_bucket,21 CopySource=copy_source,22 Key=object_key23 )24
25 # Удаляем исходный объект26 s3.delete_object(27 Bucket=old_bucket,28 Key=object_key29 )30
31 print(f'Successfully moved object {object_key} from {old_bucket} to {new_bucket}')32
33except ClientError as e:34 print(f'Error: {e}')35except Exception as e:36 print(f'Unexpected error: {e}')Приведенный код на Go:
- Импортирует необходимые пакеты, в том числе AWS SDK для Go.
- Подгружает конфигурацию из
~/.aws/*. - Создает клиент для доступа к Object Storage.
- Определяет имена исходного и целевого бакета, а также объекта, который нужно переместить.
- Копирует объект в целевой бакет.
- Удаляет объект из исходного бакета.
- Выводит сообщение об успешном перемещении объекта.
1package main2
3import (4 "context"5 "fmt"6 "log"7
8 "github.com/aws/aws-sdk-go-v2/config"9 "github.com/aws/aws-sdk-go-v2/service/s3"10)11
12func main() {13 // Подгружаем конфигурацию из ~/.aws/*14 cfg, err := config.LoadDefaultConfig(context.TODO())15 if err != nil {16 log.Fatal(err)17 }18
19 // Создаем клиент S320 client := s3.NewFromConfig(cfg)21
22 // Параметры источника и назначения23 sourceBucket := "bucket1"24 sourceKey := "file.txt"25 destBucket := "bucket2"26 destKey := sourceKey //27
28 // Формируем строку источника в формате "bucket-name/object-key"29 copySource := fmt.Sprintf("%s/%s", sourceBucket, sourceKey)30
31 // Копируем объект32 _, err = client.CopyObject(context.TODO(), &s3.CopyObjectInput{33 Bucket: &destBucket,34 CopySource: ©Source,35 Key: &destKey,36 })37 if err != nil {38 log.Fatalf("Unable to copy object: %v", err)39 }40
41 // Удаляем исходный объект только после успешного копирования42 _, err = client.DeleteObject(context.TODO(), &s3.DeleteObjectInput{43 Bucket: &sourceBucket,44 Key: &sourceKey,45 })46 if err != nil {47 log.Fatalf("Unable to delete source object: %v", err)48 }49
50 fmt.Printf("Successfully moved object from %s/%s to %s/%s\n",51 sourceBucket, sourceKey, destBucket, destKey)52}