Перенос образа диска Yandex Compute Cloud в S3-совместимое хранилище стороннего провайдера без вспомогательной ВМ
Вы можете сохранить копию диска Yandex Compute Cloud в объектном хранилище другого провайдера. Такая копия позволяет хранить данные за пределами Yandex Cloud и использовать их для восстановления.
В этой инструкции вы выгрузите снимок или образ диска в S3-совместимое хранилище без создания вспомогательной ВМ. Затем с помощью утилиты yc-nbs-export-unpack восстановите образ в файл .raw или на блочное устройство. Далее чтобы запустить ВМ у другого провайдера, импортируйте полученный образ по инструкции этого провайдера.
Чтобы перенести образ диска в S3-совместимое хранилище:
- Подготовьте бакет и доступ к нему.
- Заполните заявку и выгрузите снимок или образ.
- Подготовьте утилиту.
- Настройте доступ к хранилищу.
- Подготовьте ключ шифрования, если диск зашифрован.
- Восстановите образ.
Подготовьте бакет и доступ к нему
Для выгрузки снимка или образа поддерживаются S3-совместимые хранилища сторонних провайдеров и Yandex Object Storage.
Для Yandex Object Storage создайте бакет и статический ключ доступа сервисного аккаунта с ролью storage.admin на этот бакет.
Чтобы получить выгрузку в бакет стороннего провайдера, например Selectel:
-
Создайте
бакет в Selectel:Примечание
В примере используется приватный бакет Selectel
в регионеru-7. Для другого S3-совместимого хранилища замените параметры подключения и проверьте требования провайдера к доступу и размеру объектов.-
Укажите имя, например
disk-snapshot-dr-bucket. Если имя занято, выберите другое и замените его в командах ниже. -
Выберите приватный доступ.
-
Выберите тип адресации
Path-Style. -
Выберите холодный класс хранения.
Важно
Перед загрузкой ознакомьтесь с условиями тарификации
, включая чтение данных и минимальный срок хранения.
-
-
На вкладке Подключение создайте
ключ S3 с именемdisk-snapshot-bucket-key. В поле владельца ключа выберите Мне для разового переноса либо отдельного сервисного пользователя Selectel для постоянного использования. -
Для сервисного пользователя предоставьте полный доступ к операциям с нужным бакетом, включая:
- чтение, запись и удаление объектов;
- просмотр содержимого бакета;
- операции составной загрузки (multipart upload).
-
Сохраните
Access keyиSecret keyв защищенном месте. Они понадобятся при заполнении формы экспорта и настройке утилиты.
Заполните заявку и выгрузите снимок или образ
- Откройте форму экспорта снимка или образа диска
в консоли управления и следуйте указаниям на странице. - Дождитесь выгрузки файлов в указанный бакет.
- Найдите в бакете каталог с именем вашего снимка или образа и убедитесь, что в нем есть файл
manifest.json. В командах ниже этот каталог обозначен как<каталог_диска>.
Если выгрузка завершилась с ошибкой или файлы не появились в бакете, обратитесь в техническую поддержку
Подготовьте утилиту
-
Скачайте архив по ссылке
. -
Распакуйте архив и перейдите в каталог
yc-nbs-export-unpack-<версия>.Например, для версии 1.0:
tar -xzf yc-nbs-export-tool.1.0.tar.gz cd yc-nbs-export-unpack-0.1.0 -
Выберите бинарный файл для вашей системы. Доступные платформы перечислены в файле
BINARIES.json.Система
x64 (Intel/AMD)
ARM64
Linux
bin/linux-x64/bin/linux-arm64/macOS
bin/macos-x64/bin/macos-arm64/Windows
bin/windows-x64/—
Например, для Linux на x64 выполните:
./bin/linux-x64/yc-nbs-export-unpack --helpДля Windows используйте PowerShell и соответствующий файл
.exe:.\bin\windows-x64\yc-nbs-export-unpack.exe --helpКоманды ниже приведены для Linux x64. Для другой системы замените
./bin/linux-x64/yc-nbs-export-unpackна путь к выбранному бинарному файлу.Если бинарного файла для вашей платформы нет
Подготовьте окружение Python и установите зависимости:
python3 -m venv .venv source .venv/bin/activate python3 -m pip install -r requirements.txtПроверьте запуск утилиты:
python3 yc-nbs-export-unpack --helpВ командах ниже используйте
python3 yc-nbs-export-unpackвместо./bin/linux-x64/yc-nbs-export-unpack.
Настройте доступ к хранилищу
Задайте ключи доступа к S3 через переменные окружения:
export AWS_ACCESS_KEY_ID='<идентификатор_ключа>'
export AWS_SECRET_ACCESS_KEY='<секретный_ключ>'
# Для временных ключей также задайте AWS_SESSION_TOKEN
Вместо <идентификатор_ключа> и <секретный_ключ> подставьте идентификатор и секретный ключ доступа к бакету.
Другие способы передачи ключей
Вы можете сохранить ключи в файле ~/.aws/credentials:
[default]
aws_access_key_id = <идентификатор_ключа>
aws_secret_access_key = <секретный_ключ>
Для временных ключей добавьте aws_session_token в тот же раздел. Именованный профиль выбирается параметром --s3-profile NAME или переменной AWS_PROFILE. Другой путь к файлу можно задать переменной AWS_SHARED_CREDENTIALS_FILE.
При этих способах не указывайте --s3-credentials-file. Если профиль не выбран явно через --s3-profile, переменные с ключами имеют приоритет над файлом ~/.aws/credentials.
Также можно создать JSON-файл:
{
"id": "<идентификатор_ключа>",
"secret": "<секретный_ключ>"
}
Передайте путь к нему параметром --s3-credentials-file. JSON-файл имеет приоритет над переменными окружения и не может использоваться одновременно с --s3-profile.
Подготовьте ключ шифрования
Этот шаг нужен только для зашифрованного диска.
-
Скачайте из бакета файлы
<каталог_диска>/encrypted.dekи<каталог_диска>/kek.id. Они содержат зашифрованный ключ диска (DEK) и идентификатор ключа, которым он зашифрован. -
Расшифруйте DEK с помощью Yandex Cloud CLI. Пользователю должна быть назначена роль
kms.keys.decrypterна указанный ключ.yc kms symmetric-crypto decrypt \ --id <kek_id> \ --profile <имя_профиля> \ --ciphertext-file encrypted.dek \ --plaintext-file decrypted.dekГде
<kek_id>— идентификатор из файлаkek.id, а<имя_профиля>— имя профиля CLI.
При восстановлении образа передайте в параметре --decryption-key содержимое файла decrypted.dek, закодированное в Base64. Например, с помощью OpenSSLopenssl base64 -A -in decrypted.dek.
Восстановите образ
Утилита прочитает манифест и данные снимка или образа из S3-хранилища, при необходимости расшифрует их и восстановит содержимое диска. Результат можно сохранить в файл образа .raw для дальнейшего импорта или записать на блочное устройство.
Чтобы сохранить образ в файл с ключами доступа из переменных окружения, выполните команду:
AWS_ACCESS_KEY_ID='<идентификатор_ключа>' \
AWS_SECRET_ACCESS_KEY='<секретный_ключ>' \
./bin/linux-x64/yc-nbs-export-unpack \
--s3-endpoint <эндпоинт_S3> \
--s3-region <регион_хранилища> \
--s3-bucket <имя_бакета> \
--manifest-key <каталог_диска>/manifest.json \
--output <путь_к_файлу_образа> \
--workers 10
Где:
-
AWS_ACCESS_KEY_ID— идентификатор ключа доступа к бакету. -
AWS_SECRET_ACCESS_KEY— секретный ключ доступа к бакету. -
--s3-endpoint— эндпоинт S3-хранилища. Например,https://storage.yandexcloud.kzдля Yandex Object Storage илиhttps://s3.ru-7.storage.selcloud.ruдля бакета в Selectel. -
--s3-region— регион хранилища. Например,kz1для Yandex Object Storage илиru-7для бакета в Selectel. -
--s3-bucket— имя бакета, в который выгружен снимок или образ. -
--manifest-key— путь к файлуmanifest.jsonотносительно бакета. Вместо<каталог_диска>укажите путь к каталогу с выгруженными файлами. -
--output— путь к файлу, в который будет сохранен образ, напримерmy_disk.raw. Файл не должен существовать.Вместо файла образ можно выгрузить на блочное устройство.
-
--workers— количество параллельных обработчиков.
Для временных ключей также передайте AWS_SESSION_TOKEN.
Примеры
Сохранение образа в файл с ключами из JSON-файла
./bin/linux-x64/yc-nbs-export-unpack \
--s3-endpoint https://s3.ru-7.storage.selcloud.ru \
--s3-region ru-7 \
--s3-credentials-file my_cred.json \
--s3-bucket disk-snapshot-dr-bucket \
--manifest-key my_disk/manifest.json \
--output my_disk.raw \
--workers 10
Где --s3-credentials-file — путь к JSON-файлу с ключами доступа.
Сохранение образа в файл с именованным профилем
Добавьте профиль recovery в ~/.aws/credentials:
[recovery]
aws_access_key_id = <идентификатор_ключа>
aws_secret_access_key = <секретный_ключ>
Передайте имя профиля в команду:
./bin/linux-x64/yc-nbs-export-unpack \
--s3-endpoint https://s3.ru-7.storage.selcloud.ru \
--s3-region ru-7 \
--s3-profile recovery \
--s3-bucket disk-snapshot-dr-bucket \
--manifest-key my_disk/manifest.json \
--output my_disk.raw \
--workers 10
Где --s3-profile — имя профиля с ключами доступа в файле ~/.aws/credentials. Вместо --s3-profile recovery можно задать переменную окружения AWS_PROFILE=recovery, если переменные AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY не заданы. Иначе будут использованы ключи из переменных окружения.
Восстановление образа на блочное устройство
Важно
Восстановление на блочное устройство поддерживается только в Linux. Данные на целевом блочном устройстве будут перезаписаны.
Используйте профиль recovery и выполните команду, указав целевое устройство.
./bin/linux-x64/yc-nbs-export-unpack \
--s3-endpoint https://s3.ru-7.storage.selcloud.ru \
--s3-region ru-7 \
--s3-profile recovery \
--s3-bucket disk-snapshot-dr-bucket \
--manifest-key my_disk/manifest.json \
--device /dev/vdc \
--overwrite-device \
--workers 10
Где:
--s3-profile— имя профиля с ключами доступа в файле~/.aws/credentials.--device— путь к целевому блочному устройству, например/dev/vdc.--overwrite-device— разрешение перезаписать данные на устройстве.
Сохранение образа зашифрованного диска в файл
Используйте профиль recovery и подготовьте ключ шифрования. Выполните команду:
./bin/linux-x64/yc-nbs-export-unpack \
--s3-endpoint https://s3.ru-7.storage.selcloud.ru \
--s3-region ru-7 \
--s3-profile recovery \
--s3-bucket disk-snapshot-dr-bucket \
--manifest-key my_disk/manifest.json \
--output my_disk.raw \
--decryption-key "$(openssl base64 -A -in decrypted.dek)" \
--workers 10
Где --decryption-key — содержимое файла decrypted.dek, закодированное в Base64 утилитой OpenSSL