Рекомендации по использованию S3 в продукте Кибер Инфраструктура

Рекомендации по использованию S3 в продукте Кибер Инфраструктура#

В этом разделе предлагаются рекомендации о том, как лучше всего использовать функцию S3 в продукте Кибер Инфраструктура.

Политики именования корзин и ключей S3

Рекомендуется использовать имена корзин, соответствующие соглашениям об именовании DNS:

  • длиной от 3 до 63 символов;

  • должны начинаться и заканчиваться буквой нижнего регистра или цифрой;

  • могут содержать буквы нижнего регистра, цифры, точки (.), дефисы (-) и символы подчеркивания (_);

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

Ключ объекта может быть строкой из любых символов в кодировке UTF-8 длиной до 1024 байт.

Использование передачи по частям для крупных объектов

Хранилище объектных данных поддерживает передачу объектов размером до 5 ГБ на один запрос PUT (50 ТБ при передаче по частям). Производительность передачи можно улучшить, разбив большие объекты на фрагменты и передавая их параллельно (разделяя таким образом нагрузку между несколькими сервисами ОС) с помощью API передачи по частям.

Максимальное количество частей при передаче объекта по частям — 10 000.

Рекомендуется использовать передачу по частям для объектов размером больше 5 МБ.

Совместимые клиентские приложения для работы с S3

  • CyberDuck — файловый менеджер для macOS, Linux и Windows;

  • boto — набор средств разработки для работы с сервисами AWS с поддержкой языков программирования Python 2.x и Python 3.x;

  • boto3 — набор средств разработки для работы с сервисами AWS с поддержкой языков программирования Python 2.x и Python 3.x;

  • AWS CLI — интерфейс командной строки для работы с сервисами AWS;

  • s3cmd — консольный клиент (Linux, macOS) для управления хранилищами объектов S3;

  • s5cmd.

Пример использования boto3

До начала работы получите реквизиты доступа к объектному хранилищу (адрес точки доступа S3, идентификатор ключа доступа к S3 и секретный ключ доступа к S3). Создайте в домашнем каталоге файл .aws/credentials и задайте ключ доступа в формате:

[default]
aws_access_key_id = <id>
aws_secret_access_key = <secretKey>

Задайте в файле .aws/config регион в формате:

[default]
region=us-east-1
Пример использования класса хранения

Создайте новый класс хранения TYPE_1:

ostor-ctl set-storage-class -s /mnt/vstorage/vols/ostor/ -V 0100000000000002 -C 1 -O 2 --vstorage-attr "replicas=2:1 tier=0"

Создайте объект, использующий класс хранения TYPE_1:

#!/usr/bin/python3
import boto3
import urllib3

urllib3.disable_warnings()
# boto3.set_stream_logger(name='botocore') # enable to see HTTP headers

s3_client = boto3.client(
    service_name='s3',
    endpoint_url='https://s3.example.com:443',
    aws_access_key_id='XXX',
    aws_secret_access_key='XXX',
    verify=False
)

obj_id='011010100101'
bucket_id='testbucket'

s3_client.create_bucket(Bucket=bucket_id)
s3_client.put_object(Body=b'Here we have some data', Bucket=bucket_id, Key=obj_id, StorageClass='TYPE_1')

obj_info = s3_client.head_object(Bucket=bucket_id, Key=obj_id)
s3_client.delete_object(Bucket=bucket_id, Key=obj_id)

print(obj_info['StorageClass'])
Пример параллельной загрузки файлов и частей файлов
import os
import boto3
from boto3.s3.transfer import TransferConfig

from multiprocessing.pool import ThreadPool

access_key = 'XXX'
secret_key = 'XXX'
endpoint_url = 'https://s3.example.com'
bucket = 'bucket'

def get_resource():
    return boto3.Session().resource(
        's3',
        aws_access_key_id=access_key,
        aws_secret_access_key=secret_key,
        endpoint_url=endpoint_url,
        verify=False
    )

# Параллельная загрузка нескольких файлов (из директории)
def put_file(path, bucket, key):
    s3 = get_resource()
    s3.Bucket(bucket).upload_file(path, key)

# Параллельная загрузка частей файла
def put_file_multipart(path, bucket, key, chunk_size=100*1024, n_threads=20):
    s3 = get_resource()
    config = TransferConfig(multipart_threshold=chunk_size,
                            max_concurrency=n_threads,
                            multipart_chunksize=chunk_size,
                            use_threads=True)
    s3.Object(bucket, key).upload_file(path, Config=config)

def put_dir(bucket_name, directory_name, n_processes=20):
    p = ThreadPool(n_processes)
    files = [(os.path.join(directory_name, file),
              bucket_name, file) for file in os.listdir(directory_name)]
    p.starmap(put_file, files)
    # p.starmap(put_file_multipart, files)