Работаем с регионами SPB и MSK в объектном хранилище из Python
В статье разберемся, как хранить и обрабатывать данные в Москве и Санкт-Петербурге, используя единую авторизацию и простой интерфейс. Улучшим катастрофоустойчивость и доступность, снизим задержки при работе с объектами.

Катастрофоустойчивое хранение данных — одна из актуальных задач при построении IT-инфраструктуры. Но ее решение может завести в тупик. Как оптимальнее организовать хранение данных, исключив домены отказа? А как разместить определенные данные ближе к целевой нагрузке или части аудитории? Как организовать асинхронную репликацию данных между Москвой и Санкт-Петербургом?
Меня зовут Гришин Александр, я продакт-менеджер в Selectel и отвечаю за развитие объектного хранилища и облачных баз данных. В этой статье я расскажу, как с помощью мультирегиональности взаимодействовать с разными регионами S3 через Python и библиотеку boto3.
Обзор регионов в объектном хранилище Selectel
Объектное S3-хранилище в Selectel на данный момент предлагает к использованию два региона: Санкт-Петербург и Москву.
Регион Санкт-Петербург, пул ru-1. Находится в группе ЦОД Дубровка и представляет собой три отдельных, независимых друг от друга дата-центра уровня Tier III общей мощностью около 1 000 стоек. Суммарная полезная площадь — около 2 500 м2. Каждый ЦОД в этой группе имеет независимые системы: питание (в том числе резервное с дизель-генераторными установками), сетевое оборудование, сетевой канал, системы охлаждения, системы пожаротушения и т. д. Кстати, мы планируем кратно увеличить мощности в этом регионе.
Регион Москва, пулы gis-1 и ru-7. Находятся в группе ЦОД Берзарина и представляют собой отдельные независимые друг от друга этажи в одном здании уровня Tier III. Объем мощности — около 1 500 стоек, полезная площадь — около 2 800 м2. Каждый этаж в этой локации также обладает теми же независимыми системами жизнеобеспечения, что и дата-центры в Петербурге.
В этом году мы планируем ввести в эксплуатацию первую очередь нового ЦОД «Юрловский» в Москве. Это будет дата-центр уровня Tier IV. Особенностью локации станет самый большой единый машинный зал в России площадью 4 500 м2. Более того, здесь мы разместим стойки с водяным охлаждением и увеличенным питанием для оборудования с GPU, в том числе для Big Data, ML и HPC-суперкомпьютеров.
Отдельно отмечу, что пул gis-1 соответствует требованиям 17 Приказа ФСТЭК для работы государственных информационных систем. Используйте его, если для вас актуальны:
- требования Приказа ФСТЭК России от 11 февраля 2013 г. № 17,
- требования Приказа ФСТЭК России от 18 февраля 2013 г. № 21,
- специальные требования и рекомендациям по технической защите конфиденциальной информации (СТР-К, Приказ Гостехкомиссии от 30.08.2002 № 282).
К тому же, дата-центр подходит для размещения:
- государственных информационных систем до первого класса защищенности (К1) включительно,
- информационных систем персональных данных (ИСПДн) до первого уровня защищенности (УЗ-1) включительно,
- автоматизированных систем (АС) в защищенном исполнении класса 1Г.
Часть работы в панели управления Selectel
Очень подробный пошаговый гайд вы найдете в недавней статье моего коллеги. Я же перечислю только основные шаги:
- Перейдите в панель управления → Объектное хранилище
- Выберете нужный регион и нажмите Создать контейнер.
- Выберите тип адресации vHosted. Что касается типа контейнера, то для работы с чувствительными данными подойдет приватный, а если планируете реализовать доступ к контенту без авторизации, выберите публичный.
- Повторите первые три шага в каждом интересующем вас регионе: ru-1, gis-1, ru-7.
- Создайте служебного пользователя с ролью администратор объектного хранилища и доступом в нужный проект.
- Создайте S3-ключ в панели управления.
- Сохраните Access Key и Secret Key (будьте внимательны: ключи не хранятся в наших системах и показываются только один раз).
Часть работы на стороне клиента
Настройка клиента boto3 для разных регионов
Для работы с мультирегиональным хранилищем будем указывать соответствующий endpoint — URL для каждого региона:
import boto3
def get_s3_client(region):
endpoints = {
'ru-1': 'https://s3.ru-1.storage.selcloud.ru',
'gis-1': 'https://s3.gis-1.storage.selcloud.ru',
'ru-7': 'https://s3.ru-7.storage.selcloud.ru'
}
return boto3.client(
's3',
endpoint_url=endpoints[region],
aws_access_key_id='ВАШ_ACCESS_KEY',
aws_secret_access_key='ВАШ_SECRET_KEY'
)
Создание бакетов в разных регионах
В рамках нашей услуги бакет — это контейнер с vHosted-адресацией и, как следствие, уникальным именем и доменом вида <имя_контейнера.s3.storage.selcloud.ru>.
Выше мы уже создавали нужные бакеты через панель управления. Однако создание бакета поддерживается и через S3 API, а значит оно возможно из кода:
s3_ru1 = get_s3_client('ru-1')
s3_gis1 = get_s3_client('gis-1')
s3_ru7 = get_s3_client('ru-7')
bucket_name_ru1 = 'my-bucket-ru1'
bucket_name_gis1 = 'my-bucket-gis1'
bucket_name_ru7 = 'my-bucket-ru7'
# Создаём бакеты в каждом регионе
s3_ru1.create_bucket(Bucket=bucket_name_ru1)
s3_gis1.create_bucket(Bucket=bucket_name_gis1)
s3_ru7.create_bucket(Bucket=bucket_name_ru7)
print('Бакеты успешно созданы в разных регионах.')
Список объектов в бакетах разных регионов
Теперь выведем список объектов в нашем мультирегиональном хранилище:
def list_objects(s3_client, bucket_name):
response = s3_client.list_objects_v2(Bucket=bucket_name)
return [obj['Key'] for obj in response.get('Contents', [])]
print('Файлы в ru-1:', list_objects(s3_ru1, bucket_name_ru1))
print('Файлы в gis-1:', list_objects(s3_gis1, bucket_name_gis1))
print('Файлы в ru-7:', list_objects(s3_ru7, bucket_name_ru7))
Просто и элегантно мы получаем список объектов, фактически хранящихся в разных городах и ЦОДах.
Копирование объектов между регионами
Для репликации данных можно перемещать их между регионами. Например, при помощи copy_object:
copy_source = {'Bucket': bucket_name_ru1, 'Key': file_name}
s3_gis1.copy_object(CopySource=copy_source, Bucket=bucket_name_gis1, Key=file_name)
print(f'Файл {file_name} скопирован из ru-1 в gis-1')
Теперь мы уверены, что в случае катастрофы в одном регионе наши данные продублированы в другом.
Тривиальный пример работы с мультирегиональным хранилищем
Теперь соберем все это воедино:
import boto3
import botocore.exceptions
def get_s3_client(region):
""" Создает S3 клиент для указанного региона """
endpoints = {
'ru-1': 'https://s3.ru-1.storage.selcloud.ru',
'gis-1': 'https://s3.gis-1.storage.selcloud.ru',
'ru-7': 'https://s3.ru-7.storage.selcloud.ru'
}
return boto3.client(
's3',
endpoint_url=endpoints[region],
region_name=region, # Указываем регион явно
aws_access_key_id="YOUR_ACCESS_KEY",
aws_secret_access_key="YOUR_SECRET_KEY"
)
def bucket_exists(s3_client, bucket_name):
""" Проверяет, существует ли бакет, используя head_bucket() """
try:
s3_client.head_bucket(Bucket=bucket_name)
return True
except botocore.exceptions.ClientError as e:
if e.response['Error']['Code'] == '404': # Бакета нет, можно создать
return False
print(f'Ошибка при проверке существования бакета {bucket_name}: {e}')
return False
def create_bucket_if_not_exists(s3_client, bucket_name, region):
""" Создает бакет, если он не существует """
if bucket_exists(s3_client, bucket_name):
print(f'Бакет {bucket_name} уже существует.')
return
try:
s3_client.create_bucket(
Bucket=bucket_name,
CreateBucketConfiguration={'LocationConstraint': region}
)
print(f'Бакет {bucket_name} успешно создан в регионе {region}.')
except Exception as e:
print(f'Ошибка при создании бакета {bucket_name}: {e}')
# Подключаемся к разным регионам
s3_clients = {
'ru-1': get_s3_client('ru-1'),
'gis-1': get_s3_client('gis-1'),
'ru-7': get_s3_client('ru-7'),
}
buckets = {
'ru-1': 'habr-ru-1',
'gis-1': 'habr-gis-1',
'ru-7': 'habr-ru-7',
}
# Проверяем и создаем бакеты, если их нет
for region, s3_client in s3_clients.items():
create_bucket_if_not_exists(s3_client, buckets[region], region)
print('Все бакеты обработаны.')
Заключение
Мультирегиональность в объектном хранилище Selectel открывает новые возможности для управления данными. Среди них — балансировка нагрузки, катастрофоустойчивость, резервное копирование и ускоренный доступ. Используя Python и boto3, можно легко работать с разными регионами, перемещать объекты и обеспечивать отказоустойчивость.