Как стать автором
Обновить

Репликация файлов между кластерами S3

Уровень сложностиСредний

Введение

В карьере разработчика часто приходится сталкиваться с разными видами миграций инфраструктуры. Так, мне однажды пришлось мигрировать данные с одного кластера в S3, который объявили устаревшим, в новый. Как оказалось, это нетривиальная задача, т.к. прямого API для такой операции в стеке S3 не предусмотрено. Пришлось придумывать свое решение, с которым я хочу с вами поделиться.

Rclone

Для клонирования нам понадобится программа Rclone. Это утилита для командной строки, которая помогает синхронизировать файлы между разными провайдерами облачных хранилищ. Ее возможности не ограничиваются только Amazon S3, она также поддерживает Google Drive, Dropbox, Microsoft OneDrive, Yandex Disk и многие другие сервисы. Принцип ее работы заключается в том, что файлы будут сначала скачиваться локально на компьютер, а уже после закачиваться на новое хранилище.

Установка

Скачиваем Rclone с оффициального сайта https://rclone.org/downloads/.
Для установки утилиты на Mac OS можно воспользоваться командной строкой:

$ sudo -v ; curl https://rclone.org/install.sh | sudo bash

Проверяем, что утилита была успешно установлена:

$ rclone version

В моем случае получился следующий вывод:

rclone v1.60.1
- os/version: darwin 13.5.2 (64 bit)
- os/kernel: 22.6.0 (arm64)
- os/type: darwin
- os/arch: arm64
- go/version: go1.19.3
- go/linking: dynamic
- go/tags: cmount

Если все успешно, можно переходить к последующей настройке утилиты.

Настройка

Далее нам надо сконфигурировать наши аккаунты.
Это делается с помощью следующей команды (она довольно длинная, поэтому я расставлю комментарии по ходу настройки с помощью знака #):

$ rclone config
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n

# Задаем имя, оно будет нужно чтобы различать разные хранилища при работе с rclone.
Enter name for new remote.
name> first-account    

Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
 1 / 1Fichier
   \ (fichier)
 2 / Akamai NetStorage
   \ (netstorage)
 3 / Alias for an existing remote
   \ (alias)
 4 / Amazon Drive
   \ (amazon cloud drive)
 5 / Amazon S3 Compliant Storage Providers including AWS, Alibaba, Ceph, China Mobile, Cloudflare, ArvanCloud, Digital Ocean, Dreamhost, Huawei OBS, IBM COS, IDrive e2, IONOS Cloud, Lyve Cloud, Minio, Netease, RackCorp, Scaleway, SeaweedFS, StackPath, Storj, Tencent COS, Qiniu and Wasabi
   \ (s3)
 6 / Backblaze B2
   \ (b2)
 7 / Better checksums for other remotes
   \ (hasher)
 8 / Box
   \ (box)
 9 / Cache a remote
   \ (cache)
10 / Citrix Sharefile
   \ (sharefile)
11 / Combine several remotes into one
   \ (combine)
12 / Compress a remote
   \ (compress)
13 / Dropbox
   \ (dropbox)
14 / Encrypt/Decrypt a remote
   \ (crypt)
15 / Enterprise File Fabric
   \ (filefabric)
16 / FTP
   \ (ftp)
17 / Google Cloud Storage (this is not Google Drive)
   \ (google cloud storage)
18 / Google Drive
   \ (drive)
19 / Google Photos
   \ (google photos)
20 / HTTP
   \ (http)
21 / Hadoop distributed file system
   \ (hdfs)
22 / HiDrive
   \ (hidrive)
23 / In memory object storage system.
   \ (memory)
24 / Internet Archive
   \ (internetarchive)
25 / Jottacloud
   \ (jottacloud)
26 / Koofr, Digi Storage and other Koofr-compatible storage providers
   \ (koofr)
27 / Local Disk
   \ (local)
28 / Mail.ru Cloud
   \ (mailru)
29 / Mega
   \ (mega)
30 / Microsoft Azure Blob Storage
   \ (azureblob)
31 / Microsoft OneDrive
   \ (onedrive)
32 / OpenDrive
   \ (opendrive)
33 / OpenStack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
   \ (swift)
34 / Oracle Cloud Infrastructure Object Storage
   \ (oracleobjectstorage)
35 / Pcloud
   \ (pcloud)
36 / Put.io
   \ (putio)
37 / QingCloud Object Storage
   \ (qingstor)
38 / SMB / CIFS
   \ (smb)
39 / SSH/SFTP
   \ (sftp)
40 / Sia Decentralized Cloud
   \ (sia)
41 / Storj Decentralized Cloud Storage
   \ (storj)
42 / Sugarsync
   \ (sugarsync)
43 / Transparently chunk/split large files
   \ (chunker)
44 / Union merges the contents of several upstream fs
   \ (union)
45 / Uptobox
   \ (uptobox)
46 / WebDAV
   \ (webdav)
47 / Yandex Disk
   \ (yandex)
48 / Zoho
   \ (zoho)
49 / premiumize.me
   \ (premiumizeme)
50 / seafile
   \ (seafile)

# Выбираем Amazon S3
Storage> 5

Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
 1 / Amazon Web Services (AWS) S3
   \ (AWS)
 2 / Alibaba Cloud Object Storage System (OSS) formerly Aliyun
   \ (Alibaba)
 3 / Ceph Object Storage
   \ (Ceph)
 4 / China Mobile Ecloud Elastic Object Storage (EOS)
   \ (ChinaMobile)
 5 / Cloudflare R2 Storage
   \ (Cloudflare)
 6 / Arvan Cloud Object Storage (AOS)
   \ (ArvanCloud)
 7 / Digital Ocean Spaces
   \ (DigitalOcean)
 8 / Dreamhost DreamObjects
   \ (Dreamhost)
 9 / Huawei Object Storage Service
   \ (HuaweiOBS)
10 / IBM COS S3
   \ (IBMCOS)
11 / IDrive e2
   \ (IDrive)
12 / IONOS Cloud
   \ (IONOS)
13 / Seagate Lyve Cloud
   \ (LyveCloud)
14 / Minio Object Storage
   \ (Minio)
15 / Netease Object Storage (NOS)
   \ (Netease)
16 / RackCorp Object Storage
   \ (RackCorp)
17 / Scaleway Object Storage
   \ (Scaleway)
18 / SeaweedFS S3
   \ (SeaweedFS)
19 / StackPath Object Storage
   \ (StackPath)
20 / Storj (S3 Compatible Gateway)
   \ (Storj)
21 / Tencent Cloud Object Storage (COS)
   \ (TencentCOS)
22 / Wasabi Object Storage
   \ (Wasabi)
23 / Qiniu Object Storage (Kodo)
   \ (Qiniu)
24 / Any other S3 compatible provider
   \ (Other)
# В моем случае используется стороннее решение на базе Amazon S3
provider> 24

Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).
 1 / Enter AWS credentials in the next step.
   \ (false)
 2 / Get AWS credentials from the environment (env vars or IAM).
   \ (true)
# Вводим креды через консоль
env_auth> 1

Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
# На этом этапе введите ваш access key
access_key_id> your_access_key

Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
# Введите ваш secret key, будьте осторожны, никто сторонний не должен его знать
secret_access_key> your_secret_key

Option region.
Region to connect to.
Leave blank if you are using an S3 clone and you don't have a region.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
   / Use this if unsure.
 1 | Will use v4 signatures and an empty region.
   \ ()
   / Use this only if v4 signatures don't work.
 2 | E.g. pre Jewel/v10 CEPH.
   \ (other-v2-signature)
# Выбираем регион вашего кластера
region> msk

Option endpoint.
Endpoint for S3 API.
Required when using an S3 clone.
Enter a value. Press Enter to leave empty.
# Эндпоинт вашего S3 кластера
endpoint> your-s3-host.ru            

Option location_constraint.
Location constraint - must be set to match the Region.
Leave blank if not sure. Used when creating buckets only.
Enter a value. Press Enter to leave empty.
location_constraint> 

Option acl.
Canned ACL used when creating buckets and storing or copying objects.
This ACL is used for creating objects and if bucket_acl isn't set, for creating buckets too.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Note that this ACL is applied when server-side copying objects as S3
doesn't copy the ACL from the source but rather writes a fresh one.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
   / Owner gets FULL_CONTROL.
 1 | No one else has access rights (default).
   \ (private)
   / Owner gets FULL_CONTROL.
 2 | The AllUsers group gets READ access.
   \ (public-read)
   / Owner gets FULL_CONTROL.
 3 | The AllUsers group gets READ and WRITE access.
   | Granting this on a bucket is generally not recommended.
   \ (public-read-write)
   / Owner gets FULL_CONTROL.
 4 | The AuthenticatedUsers group gets READ access.
   \ (authenticated-read)
   / Object owner gets FULL_CONTROL.
 5 | Bucket owner gets READ access.
   | If you specify this canned ACL when creating a bucket, Amazon S3 ignores it.
   \ (bucket-owner-read)
   / Both the object owner and the bucket owner get FULL_CONTROL over the object.
 6 | If you specify this canned ACL when creating a bucket, Amazon S3 ignores it.
   \ (bucket-owner-full-control)
# Настраиваем политику доступа для копируемых файлов.
# На этом этапе будьте особенно осторожны.
# Будет обидно, если никто в итоге не сможет получить доступ к вашим файлам)
acl> 6

Edit advanced config?
y) Yes
n) No (default)
y/n> n

Configuration complete.
Options:
- type: s3
- provider: Other
- access_key_id: your_access_key
- secret_access_key: your_secret_key
- region: msk
- endpoint: your-s3-host.ru
- acl: bucket-owner-full-control
Keep this "first-account" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y

Current remotes:

Name                 Type
====                 ====
first-account        s3

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q

Таким образом, мы добавили новый аккаунт в S3 в конфигурацию rclone. Такую же операцию необходимо провести со вторым аккаунтом.

Для просмотра всех настроенных аккаунтов и их конфигурации можно прописать следующую команду:

$ cat $(rclone config file)

[first-account]
type = s3
provider = Other
access_key_id = your_access_key
secret_access_key = your_secret_key
region = msk
endpoint = your-s3-host.ru
acl = bucket-owner-full-control

[second-account]
type = s3
provider = Other
access_key_id = your_access_key_for_second_acc
secret_access_key = your_secret_key_for_second_acc
region = msk
endpoint = your-new-s3-host.ru
acl = bucket-owner-full-control

Копирование

Команда для просмотра доступных бакетов на аккаунте:

$ rclone listremotes    
first-account:
second-account:
$ rclone lsd first-account:
          -1 2022-04-22 11:50:33        -1 name_of_your_first_bucket

Наконец-то можем приступить к копированию объектов (подробная информацию о команде):

$ rclone copy first-account:name_of_your_first_bucket second-account:name_of_your_second_bucket -P                  

Разберем подробнее аргументы:

first-account:name_of_your_first_bucket – бакет откуда мы копируем данные.

second-account:name_of_your_second_bucket – бакет куда мы копируем данные.

-P – команда для просмотра процесса копирования в реальном времени.

Для тестового запуска, без изменения данных, можно использовать флаг --dry-run.
Так же вы можете задать какие именно бакеты или файлы вы хотите копировать с помощью флага --include.

Процесс копирования:

Transferred:       24.982 MiB / 22.673 GiB, 0%, 528.742 KiB/s, ETA 12h28m35s
Transferred:           14 / 10019, 0%
Elapsed time:      1m15.0s
Transferring:
 *      01d88542-57d5-4220-bbd8-cea20999fe72.jpg: 64% /3.087Mi, 185.849Ki/s, 6s
 *      01ded9e2-a810-4304-b47b-e58afc75e315.jpg: 27% /3.577Mi, 113.062Ki/s, 23s
 *      01dfc0d7-c0b5-4397-a57f-541631375723.jpg: 30% /3.220Mi, 113.324Ki/s, 20s
 *      01e38aff-2c12-4e8a-acfd-0ec10e68de8e.jpg: 60% /1.657Mi, 127.511Ki/s, 5s

Готово! Теперь осталось запастись терпением и пойти сделать себе чашку кофе.

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.