Работаем с регионами SPB и MSK в объектном хранилище из Python - Академия Selectel

Работаем с регионами SPB и MSK в объектном хранилище из Python

Александр Гришин
Александр Гришин Продакт-менеджер
1 апреля 2025

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

Изображение записи

Катастрофоустойчивое хранение данных — одна из актуальных задач при построении 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

Очень подробный пошаговый гайд вы найдете в недавней статье моего коллеги. Я же перечислю только основные шаги:

  1. Перейдите в панель управленияОбъектное хранилище
  2. Выберете нужный регион и нажмите Создать контейнер.
  3. Выберите тип адресации vHosted. Что касается типа контейнера, то для работы с чувствительными данными подойдет приватный, а если планируете реализовать доступ к контенту без авторизации, выберите публичный.
  4. Повторите первые три шага в каждом интересующем вас регионе: ru-1, gis-1, ru-7.
  5. Создайте служебного пользователя с ролью администратор объектного хранилища и доступом в нужный проект.
  6. Создайте S3-ключ в панели управления.
  7. Сохраните 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, можно легко работать с разными регионами, перемещать объекты и обеспечивать отказоустойчивость.