Статьи

Scala-клиент для Amazon Glacier

Amazon Glacier — это безопасный, надежный и чрезвычайно недорогой сервис облачного хранения для архивирования данных и долгосрочного резервного копирования. Glacier предлагает решение для архивирования данных в холодном хранилище, что означает, что хранимые данные недоступны для немедленного извлечения. Вы должны сначала запросить получение данных, и время доступа может варьироваться от минут до нескольких часов, в зависимости от выбранного вами уровня обслуживания.

Хотя хранение в холодильнике поначалу может показаться обременительным, оно также имеет свои преимущества. Никто не сможет случайно изменить важные архивные файлы. Также возможно полностью предотвратить удаление, если это необходимо.

Glacier предназначен для случаев использования, когда поиск происходит редко и является исключительным, и данные будут храниться в течение длительных периодов времени.

Концепции

Если вы раньше не работали со службами AWS или Glacier, полезно сначала изучить несколько концепций:

Регион AWS — именованный набор ресурсов AWS в одной географической зоне. Регионы полностью изолированы друг от друга, поэтому при просмотре своих ресурсов вы увидите только ресурсы, связанные с указанным вами регионом. В терминах Glacier хранимые данные привязаны к определенному региону. Цены на хранение ледников варьируются в зависимости от региона.

Хранилище — контейнер для хранения данных в виде архивов. В хранилище может храниться неограниченное количество архивов. Хранилища и их содержимое доступны только в том регионе, где они были созданы. Права доступа, уведомления и контроль соответствия настраиваются на уровне хранилища.

Архив — архив может представлять собой любые данные, такие как фото, видео или документ, и является базовой единицей хранения в Amazon Glacier. Каждый архив имеет уникальный идентификатор и необязательное описание. Вы можете загрузить один файл в виде архива, но ваши расходы будут ниже, если вы агрегируете свои данные. Архивы, хранящиеся в Amazon Glacier, являются неизменяемыми, то есть архивы могут быть загружены, загружены и удалены, но их нельзя редактировать или перезаписывать, как в таких сервисах, как Dropbox.

(Хранилище) Инвентарь — Консоль AWS покажет вам список хранилищ, но не список содержимого хранилища или инвентаря. Запас должен быть запрошен отдельно для поиска, и выполнение запроса может занять несколько часов.

Задание — получение архива или инвентаризации хранилища (списка архивов) — это асинхронные операции в Amazon Glacier. Сначала вы запускаете задание, а затем загружаете вывод задания после того, как Amazon Glacier завершит задание. Благодаря Amazon Glacier ваши запросы на получение данных помещаются в очередь, и выполнение заданий займет несколько часов.

Конфигурация уведомлений — поскольку для выполнения заданий требуется время, Amazon Glacier поддерживает механизм уведомлений, который уведомляет вас о завершении задания. Вы можете настроить хранилище для отправки уведомлений в раздел Amazon Simple Notification Service (Amazon SNS) после завершения работ. Вы можете указать одну тему SNS для каждого хранилища в конфигурации уведомлений.

Более подробную информацию об этих концепциях можно найти здесь: Модель данных Amazon Glacier

Glacier client

Amazon Glacier можно использовать с интерфейсом командной строки Amazon AWS, но использовать его довольно неуклюже, особенно для загрузки архива. Некоторые инструменты резервного копирования поддерживают хранилище на основе Glacier, но те, с которыми я сталкивался, не подходили для резервного копирования на стороне сервера или для программного использования. Amazon AWS Console позволяет, например, создавать и настраивать хранилища, но операции архивирования не поддерживаются.

Клиент Glacier — это простой инструмент, который я создал для работы с Amazon Glacier. Он был разработан для поддержки как интерактивного использования (с Scala REPL), так и программного использования с Scala или Java. Он хорошо подходит для использования на стороне сервера. Glacier клиент построен на Amazon AWS SDK для Java.

Код можно найти на GitHub: https://github.com/marko-asplund/glacier-client

Настройка Glacier

Конфигурация AWS

Чтобы использовать Glacier, сначала необходимо настроить учетную запись пользователя AWS и разрешения в консоли AWS следующим образом:

  • Создать учетную запись пользователя в AWS IAM (идентификация и управление доступом)
  • Предоставьте пользователю следующие разрешения: AmazonGlacierFullAccess, Предоставьте AmazonSQSFullAccess, AmazonSNSFullAccess
  • Создать ключ доступа

Некоторые операции, такие как создание инвентаризации хранилища или подготовка архива для загрузки, выполняются асинхронно. Настройка уведомлений будет полезна при выполнении этих операций. Необходимо включить уведомления в хранилище и настроить соответствующую тему SNS в консоли AWS.

Настройка клиента Glacier

Настройте учетные данные AWS

Самый простой способ настроить авторизацию клиента Glacier — настроить «файл профилей учетных данных по умолчанию», как описано в разделе Работа с учетными данными AWS .

Файл профилей представляет собой текстовый файл с простым форматом файла, так что вы можете настроить его только с помощью текстового редактора, следуя инструкциям на вышеупомянутой странице.

Вы также можете настроить файл с помощью интерфейса командной строки AWS, вызвав команду «aws configure» для настройки файла учетных данных по умолчанию, как описано в разделе Параметры конфигурации интерфейса командной строки AWS .

Получить ледник-клиент

Для запуска glacier-client вам необходимо установить Git, sbt и Java JRE.

1
2
git clone https://github.com/marko-asplund/glacier-client.git
cd glacier-client

Основная операция

Запустите Scala REPL с помощью sbt

1
2
3
4
5
6
7
8
9
~/glacier-backup-cli (master ✔) ᐅ sbt console
 
[info] Loading settings from plugins.sbt ...
[info] Loading project definition from /Users/marko/glacier-backup-cli/project
[info] Loading settings from build.sbt ...
[info] Set current project to glacier-backup-cli (in build file:/Users/marko/glacier-backup-cli/)
[info] Starting scala interpreter...
Welcome to Scala 2.11.11 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_151).
Type in expressions for evaluation. Or try :help.

Перечислите названия доступных регионов AWS

1
2
scala> fi.markoa.glacier.GlacierClient.regions
res0: Array[String] = Array(us-gov-west-1, us-east-1, us-east-2, us-west-1, us-west-2, eu-west-1, eu-west-2, eu-central-1, ap-south-1, ap-southeast-1, ap-southeast-2, ap-northeast-1, ap-northeast-2, sa-east-1, cn-north-1, ca-central-1)

Создайте клиент Glacier, который подключается к региону us-west-2

1
2
scala> val c = fi.markoa.glacier.GlacierClient("us-west-2")
c: fi.markoa.glacier.GlacierClient = fi.markoa.glacier.GlacierClient@11b6e34a

Создать новое хранилище. Идентификатор (или ARN) для вновь созданного хранилища возвращается.

1
2
scala> c.createVault("test-vault-1")
res1: String = /429963740182/vaults/test-vault-1

Перечислите все хранилища в регионе. Возвращается последовательность объектов хранилища, в данном случае она включает только хранилище, которое мы создали выше. Обратите внимание, что при операциях с хранилищем результаты видны сразу.

1
2
scala> c.listVaults
res2: Seq[fi.markoa.glacier.Vault] = ArrayBuffer(Vault(arn:aws:glacier:us-west-2:429963740182:vaults/test-vault-1,test-vault-1,2017-11-19T08:18:38.990Z,None,0,0))

Теперь мы готовы загрузить архив в хранилище:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
scala> c.uploadArchive("test-vault-1", "my backup archive", "my-backup.zip")
TransferStarted: transfer started
TransferProgress: transfer progress: 5% (bytes: 516096)
TransferProgress: transfer progress: 10% (bytes: 1024000)
TransferProgress: transfer progress: 15% (bytes: 1540096)
TransferProgress: transfer progress: 20% (bytes: 2048000)
TransferProgress: transfer progress: 25% (bytes: 2564096)
TransferProgress: transfer progress: 30% (bytes: 3072000)
...
TransferProgress: transfer progress: 90% (bytes: 9216000)
TransferProgress: transfer progress: 95% (bytes: 9732096)
TransferProgress: transfer progress: 100% (bytes: 10240000)
TransferCompleted: transfer completed
res3: fi.markoa.glacier.Archive = Archive(WREjqj2BItYhI5BGV7mdJGsDl3oztPvpvVh_hngm5SWqJkOd5jnLipLyYy2KkM74-3mkt85nUjI4a_hcQZhtLnQF03K0sv2Bc97BYEwYQ7M4O_lmtgrCTuGCyAEEiuQmCFfRSnBkTw,Some(my-backup.zip),0c5dc86251d157e29cfadb04ac615426600a4e1177a8ac2c1134d895378b3acd,10240000,Some(my backup archive))

Обратите внимание, что Glacier не поддерживает обновленное содержимое хранилища списков — список содержимого необходимо запрашивать явным образом, и его подготовка может занять очень много времени. По этой причине клиент Glacier хранит локальный каталог архивов для каждого хранилища. Содержимое хранилища может быть перечислено следующим образом:

1
2
scala> c.catListArchives("test-vault-1")
res4: Seq[fi.markoa.glacier.Archive] = ArraySeq(Archive(WREjqj2BItYhI5BGV7mdJGsDl3oztPvpvVh_hngm5SWqJkOd5jnLipLyYy2KkM74-3mkt85nUjI4a_hcQZhtLnQF03K0sv2Bc97BYEwYQ7M4O_lmtgrCTuGCyAEEiuQmCFfRSnBkTw,Some(my-backup.zip),0c5dc86251d157e29cfadb04ac615426600a4e1177a8ac2c1134d895378b3acd,10240000,Some(my backup archive)))

Архивы должны быть подготовлены до их извлечения, и подготовка может занять несколько часов. По этой причине зачастую удобнее получать их асинхронно: 1) вы запрашиваете извлечение архива, а после того, как Glacier завершил подготовку архива, вы можете 2) загрузить его.

1
2
scala> c.prepareArchiveRetrieval("test-vault-1", "WREjqj2BItYhI5BGV7mdJGsDl3oztPvpvVh_hngm5SWqJkOd5jnLipLyYy2KkM74-3mkt85nUjI4a_hcQZhtLnQF03K0sv2Bc97BYEwYQ7M4O_lmtgrCTuGCyAEEiuQmCFfRSnBkTw")
res1: Option[String] = Some(h479o4kxdawFsho0POzQAznw6e6beampFAIBYuI7s41O_HmzqqWsg2qk2vL2Lw_4MOsI1VFarvokz7NXczBq0CrwPKzv)

Поиск в архиве добавлен в список заданий хранилища. Вы можете перечислить незавершенные вакансии следующим образом:

1
2
scala> c.listJobs("test-vault-1")
res4: Seq[fi.markoa.glacier.Job] = ArrayBuffer(Job(h479o4kxdawFsho0POzQAznw6e6beampFAIBYuI7s41O_HmzqqWsg2qk2vL2Lw_4MOsI1VFarvokz7NXczBq0CrwPKzv,arn:aws:glacier:us-west-2:429963740182:vaults/test-vault-1,ArchiveRetrieval,null,2017-11-19T09:00:34.339Z,InProgress,null,None,Some(WREjqj2BItYhI5BGV7mdJGsDl3oztPvpvVh_hngm5SWqJkOd5jnLipLyYy2KkM74-3mkt85nUjI4a_hcQZhtLnQF03K0sv2Bc97BYEwYQ7M4O_lmtgrCTuGCyAEEiuQmCFfRSnBkTw)))

Обратите внимание на статус InProgress . После завершения подготовки архива список работ будет выглядеть примерно так:

1
2
scala> c.listJobs("test-vault-1")
res8: Seq[fi.markoa.glacier.Job] = ArrayBuffer(Job(h479o4kxdawFsho0POzQAznw6e6beampFAIBYuI7s41O_HmzqqWsg2qk2vL2Lw_4MOsI1VFarvokz7NXczBq0CrwPKzv,arn:aws:glacier:us-west-2:429963740182:vaults/test-vault-1,ArchiveRetrieval,null,2017-11-19T09:00:34.339Z,Succeeded,Succeeded,Some(2017-11-19T12:52:38.363Z),Some(WREjqj2BItYhI5BGV7mdJGsDl3oztPvpvVh_hngm5SWqJkOd5jnLipLyYy2KkM74-3mkt85nUjI4a_hcQZhtLnQF03K0sv2Bc97BYEwYQ7M4O_lmtgrCTuGCyAEEiuQmCFfRSnBkTw)))

Настройка уведомлений избавляет вас от необходимости периодически опрашивать статус завершения работы и вместо этого получать уведомления. Уведомления могут быть настроены через Консоль AWS.

Подготовленный архив затем можно загрузить с Glacier, используя идентификатор задания поиска:

01
02
03
04
05
06
07
08
09
10
11
12
13
scala> c.downloadPreparedArchive("test-vault-1", "h479o4kxdawFsho0POzQAznw6e6beampFAIBYuI7s41O_HmzqqWsg2qk2vL2Lw_4MOsI1VFarvokz7NXczBq0CrwPKzv", "my-backup-restored.zip")
TransferStarted: transfer started
TransferProgress: transfer progress: 5% (bytes: 520869)
TransferProgress: transfer progress: 10% (bytes: 1025701)
TransferProgress: transfer progress: 15% (bytes: 1547941)
TransferProgress: transfer progress: 20% (bytes: 2052773)
TransferProgress: transfer progress: 25% (bytes: 2575013)
TransferProgress: transfer progress: 30% (bytes: 3079845)
...
TransferProgress: transfer progress: 90% (bytes: 9228965)
TransferProgress: transfer progress: 95% (bytes: 9736869)
TransferProgress: transfer progress: 100% (bytes: 10240000)
TransferCompleted: transfer completed

Вот и все для основных операций!

Некоторые другие задачи клиента Glacier, которые вы можете сделать, включают удаление хранилища, запрос инвентаризации хранилища (список архивов, которые содержит хранилище), загрузку инвентаризаций и удаление архивов.

Смотреть оригинальную статью здесь: Клиент Scala для Amazon Glacier

Мнения, высказанные участниками Java Code Geeks, являются их собственными.