В инструкции рассмотрен процесс загрузки и выгрузки файлов в/из объектного хранилища 1cloud с помощью языка программирования Python.
Что это такое?
Иногда бывает удобно использовать именно язык Python в силу разных причин для резервирования данных в объектное хранилище. В инструкции описано получение токена авторизации для подключения к хранилищу и скрипты для загрузки или выгрузки файлов.
В нашей инструкции используется версия Python 2.7.
Первоначальные требования
Для того чтобы выполнить резервное копирование данных, необходимо:
- Наличие контейнера в облачном хранилище, в котором будут храниться резервные копии. Создать его можно несколькими способами: через панель управления; с помощью приложений S3Browser, Cyberduck или Rclone; с помощью Swift API или S3 REST API.
- Необходимо запомнить ExternalId хранилища в системе swift, это можно сделать через API запрос.
- Пользователь, от имени которого будет происходить загрузка дампа в контейнер, должен иметь к нему доступ. К приватным контейнерам по умолчанию доступ имеет только владелец хранилища, к публичным доступ имеют все пользователи. О том как предоставить доступ другим пользователям для работы с приватным контейнером читайте в нашей инструкции.
Установка Python на Linux
Для установки Python выполните следующие команды, но как правило Python уже установлен на наших виртуальных серверах:
sudo apt update
sudo apt install python2.7
Для установки необходимых зависимостей выполните следующие команды:
sudo apt update
sudo apt install python-pycurl python-certifi
Установка Python на Windows
По умолчанию на серверах Windows не установлен интерпретатор Python, для его загрузки перейдите на официальный сайт Python и скачайте установщик.
После установки в меню Windows появится ссылка на командную строку. Для дальнейшей работы необходимо открыть командную строку.
Для установки дополнительных библиотек используйте pip. Откройте командную строку и перейдите в каталог:
cd C:\Python27\Scripts
Для установки выполните следующие команды:
.\pip.exe install certifi
.\pip.exe install pycurl
Теперь все необходимые пакету установлены.
Получения токена для управления хранилищем
Запустите следующий скрипт для получения токена авторизации, указав при этом следующие параметры: <TenantId>, <имя_пользователя>, <пароль>.
Скрипт:
import pycurl, json, certifi
from StringIO import StringIO
buffer = StringIO()
c = pycurl.Curl()
c.setopt(pycurl.URL, 'https://1cloud.store/v3/auth/tokens')
c.setopt(pycurl.HTTPHEADER, ['Content-Type: application/json'])
c.setopt(pycurl.CAINFO, certifi.where())
data = json.dumps({'auth': {'scope': {'project': {'domain': {'name': 'Default'}, 'name': '<TenantId>'}}, 'identity': {'password': {'user': {'domain': {'name': 'Default'}, 'password': '<пароль>', 'name': '<имя_пользователя>'}}, 'methods': ['password']}}})
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, data)
c.setopt(pycurl.VERBOSE, 1)
c.setopt(pycurl.WRITEHEADER, buffer)
c.perform()
body = buffer.getvalue()
print(body)
Например:
import pycurl, json, certifi
from StringIO import StringIO
buffer = StringIO()
c = pycurl.Curl()
c.setopt(pycurl.URL, 'https://1cloud.store/v3/auth/tokens')
c.setopt(pycurl.HTTPHEADER, ['Content-Type: application/json'])
c.setopt(pycurl.CAINFO, certifi.where())
data = json.dumps({'auth': {'scope': {'project': {'domain': {'name': 'Default'}, 'name': '66'}}, 'identity': {'password': {'user': {'domain': {'name': 'Default'}, 'password': 'fRSWHnjZtkxL', 'name': '66_admin'}}, 'methods': ['password']}}})
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, data)
c.setopt(pycurl.VERBOSE, 1)
c.setopt(pycurl.WRITEHEADER, buffer)
c.perform()
body = buffer.getvalue()
print(body)
В результате выполнения вы увидите подобный ответ:
>>> print(body) HTTP/1.1 201 Created Server: nginx Date: Thu, 27 Sep 2018 11:03:37 GMT Content-Type: application/json Transfer-Encoding: chunked Connection: keep-alive X-Subject-Token: gAAAAABbrLkJgz8qWqiJ9D1bNly9RmASFfpJgrdcK_7NWhR93zA4Qpk_FyVjv8o77QAzthaHbCekk-kFIXKBABPJoClRdM-T7ELxKL-XgxkSYzVrcg1y0aVEu1lDwHMEJ8sezOCIVcFkFxQnbpWSB9dJfUI5vPHmPc0m2CJhYvz_x21XZcm5Ab7 Vary: X-Auth-Token x-openstack-request-id: req-12f5b3d6-a429-42a0-a258-8сс1ad5b430c Access-Control-Allow-Origin: * Strict-Transport-Security: max-age=31536000; includeSubDomains; X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff Access-Control-Allow-Headers: X-Auth-Token, Content-Type, Origin, Cache-Control Access-Control-Expose-Headers: X-Backend-Timestamp, Last-Modified, ETag, X-Timestamp, Content-Type, X-Subject-Token
Токен является значением параметра X-Subject-Token, это значение в дальнейшем и будет использоваться.
Загрузка файлов в хранилище
Для того чтобы загрузить файл в объектное хранилище замените в следующих строках кода параметры на свои: <ExternalId>, <имя_контейнера>, <имя_файла>, <токен>, <путь_до_файла_для_загрузки>>:
c.setopt(pycurl.URL, 'https://1cloud.store/v1/AUTH_<ExternalId>/<имя_контейнера>/<имя_файла>')
c.setopt(pycurl.HTTPHEADER, ['Content-Type: text/html'])
c.setopt(pycurl.HTTPHEADER, ['X-Auth-Token: <токен>'])
c.setopt(c.UPLOAD, 1)
file = open('<путь_до_файла_для_загрузки>')
c.setopt(c.READDATA, file)
c.perform()
Например:
c.setopt(pycurl.URL, 'https://1cloud.store/v1/AUTH_o4TnXNEfma3D1iVPx9rbYRo2YTHZAfxe/publ/win.txt')
c.setopt(pycurl.HTTPHEADER, ['Content-Type: text/html'])
c.setopt(pycurl.HTTPHEADER, ['X-Auth-Token: gAAAAABbrLkJgz8qWqiJ9D1bNly9RmASFfpJgrdcK_7NWhR93zA4Qpk_FyVjv8o77QAzthaHbCekk-kFIXKBABPJoClRdM-T7ELxKL-XgxkSYzVrcg1y0aVEu1lDwHMEJ8sezOCIVcFkFxQnbpWSB9dJfUI5vPHmPc0m2CJhYvz_x21XZcm5Ab7'])
c.setopt(c.UPLOAD, 1)
file = open('C:\Users\\ivan.ivanov\Documents\output.txt')
c.setopt(c.READDATA, file)
c.perform()
В результате указанный файл будет загружен в файловое хранилище.
Выгрузка файла
С помощью Python также можно загрузить файл из объектного хранилища на ваш локальный компьютер или сервер. Замените в следующих строках кода параметры на свои: <ExternalId>, <имя_контейнера>, <имя_файла>, <токен>, <путь_до_загружаемого_файла>. В результате на вашей машине будет создан новый файл:
c.setopt(pycurl.URL, 'https://1cloud.store/v1/AUTH_<ExternalId>/<имя_контейнера>/<имя_файла>')
c.setopt(pycurl.HTTPHEADER, ['X-Auth-Token: <токен>'])
c.setopt(pycurl.HTTPGET, 1)
file = open('<путь_до_загружаемого_файла>', "w+")
c.setopt(c.WRITEFUNCTION, file.write)
c.perform()
file.close()
Например:
c.setopt(pycurl.URL, 'https://1cloud.store/v1/AUTH_o4TnXNEfma3D1iVPx9rbYRo2YTHZAfxe/publ/win.txt')
c.setopt(pycurl.HTTPHEADER, ['X-Auth-Token: gAAAAABbrLkJgz8qWqiJ9D1bNly9RmASFfpJgrdcK_7NWhR93zA4Qpk_FyVjv8o77QAzthaHbCekk-kFIXKBABPJoClRdM-T7ELxKL-XgxkSYzVrcg1y0aVEu1lDwHMEJ8sezOCIVcFkFxQnbpWSB9dJfUI5vPHmPc0m2CJhYvz_x21XZcm5Ab7'])
c.setopt(pycurl.HTTPGET, 1)
file = open('C:\Users\\ivan.ivanov\Documents\download.txt', "w+")
c.setopt(c.WRITEFUNCTION, file.write)
c.perform()
file.close()
После выполнения скрипта по указанному пути появится файл из хранилища.