Вопросы и ответы про Object Storage
- Что такое Yandex Object Storage?
- Что я могу делать с Yandex Object Storage?
- Как начать пользоваться Yandex Object Storage?
- Какие форматы данных я могу хранить?
- Как мне оставить отзыв на Yandex Object Storage?
- Как обратиться в службу технической поддержки?
- Сколько я могу хранить данных?
- Почему объекты не загружаются, хотя максимальный размер бакета еще не достигнут?
- Как удалить несколько объектов за один раз?
- Почему сервисный аккаунт не может получить доступ в бакет?
- Что Yandex Cloud делает с данными, которые я храню в Yandex Object Storage?
- Использует ли Яндекс Object Storage для размещения своих данных?
- Какую модель консистентности данных использует Yandex Object Storage?
- Какие возможности AWS S3 поддерживаются в Yandex Object Storage?
- Где хранятся мои данные?
- Как защищены мои данные в Yandex Object Storage?
- От чего зависит скорость загрузки и скачивания данных в Yandex Object Storage?
- Как подключить собственный домен к бакету Object Storage?
- Почему после создания/изменения политики доступа пропал доступ к бакету?
- Как получить доступ к Object Storage из облачной сети Virtual Private Cloud?
- Проверяются ли объекты, загружаемые в бакет, на наличие чувствительных данных и вредоносного кода?
- Как исправить некорректный MIME-тип объектов при их загрузке в бакет?
- Как настроить заголовок Cache-Control для объектов в бакете?
- Как скопировать содержимое бакета в другой бакет?
- Как восстановить удаленные объекты?
- Как изменить класс хранения объектов?
- Как разрешить чтение объектов только из сетей Cloud CDN?
- Как исправить ошибку SignatureDoesNotMatch?
- Почему при удалении бакета возникает ошибка Bucket is not empty?
- Почему запрос OPTIONS возвращает ошибку 403 без заголовка Access-Control-Allow-Origin?
- Как исправить ошибку сертификата при использовании собственного домена?
- Почему при создании бакета возникает ошибка BucketAlreadyExists?
Что такое Yandex Object Storage?
Yandex Object Storage — это универсальное масштабируемое решение для хранения данных. Оно подходит как для высоконагруженных сервисов, которым требуется надежный и быстрый доступ к данным, так и для проектов с невысокими требованиями к инфраструктуре хранения.
Что я могу делать с Yandex Object Storage?
С Object Storage вы можете:
- Разместить в Object Storage файлы своего проекта (сайта или серверного приложения) для публичного или закрытого доступа. Файлы могут быть любого формата.
- Хранить архивные данные большого объема (до 5 ТБ на один файл), которые будут доступны только тем, кому вы разрешите.
- Обеспечить совместную работу с данными внутри распределенной организации.
- Обеспечить доступ к своим данным из любого места Земли, где есть интернет.
Как начать пользоваться Yandex Object Storage?
Чтобы начать работать с Object Storage:
- Зарегистрируйтесь в Yandex Cloud.
- Создайте каталог.
На этом шаге уже можно пользоваться Object Storage с помощью консоли управления Yandex Cloud. Можно создавать и удалять бакеты, загружать объекты в бакеты и скачивать их оттуда. - Получите статические ключи, чтобы использовать HTTP API Object Storage или готовые SDK и приложения.
Более подробные инструкции вы найдете в разделах Как начать работать с Yandex Object Storage и Как пользоваться S3 API.
Какие форматы данных я могу хранить?
Вы можете хранить данные в любом формате. Yandex Object Storage сохраняет данные в изначальном виде, никаким образом их не преобразовывая.
Как мне оставить отзыв на Yandex Object Storage?
Воспользуйтесь формой обратной связи в центре поддержки
Как обратиться в службу технической поддержки?
Вы можете обратиться в службу технической поддержки в разделе Поддержка
Сколько я могу хранить данных?
Ознакомьтесь с разделом Квоты и лимиты в Object Storage.
Почему объекты не загружаются, хотя максимальный размер бакета еще не достигнут?
Возможно, в вашем облаке исчерпана квота Объём хранилища (storage.volume.size). В консоли управления при этом может появляться ошибка We encountered an internal error, please try again..
Максимальный размер бакета ограничивает объем данных в отдельном бакете, а квота storage.volume.size — суммарный объем данных во всех бакетах облака. Увеличение максимального размера бакета не изменяет квоту облака.
Например, если максимальный размер бакета — 500 ГБ, а квота облака — 100 ГБ, загрузка новых объектов может завершаться ошибкой при достижении суммарного объема 100 ГБ во всех бакетах облака.
- Посмотрите значение и потребление квоты
storage.volume.sizeдля облака, в котором находится бакет. - Если квота исчерпана или оставшегося объема недостаточно для загрузки, создайте запрос на ее увеличение.
- После увеличения квоты повторите загрузку объектов.
Как удалить несколько объектов за один раз?
Вы можете удалить несколько объектов через консоль управления Yandex Cloud или через API с помощью метода deleteMultipleObjects.
Почему сервисный аккаунт не может получить доступ в бакет?
Проверьте, что сервисному аккаунту назначена роль для доступа в бакет.
Если у бакета включено шифрование, назначьте сервисному аккаунту роль kms.keys.encrypterDecrypter на ключ KMS, которым зашифрован бакет. Это можно сделать, например, с помощью команды CLI:
yc kms symmetric-key add-access-binding \
--id <идентификатор_ключа> \
--service-account-id <идентификатор_сервисного_аккаунта> \
--role kms.keys.encrypterDecrypter
Где:
--id— идентификатор ключа KMS.--service-account-id— идентификатор сервисного аккаунта.
Что Yandex Cloud делает с данными, которые я храню в Yandex Object Storage?
Данные сохраняются в том виде, в котором их передал пользователь.
Использует ли Яндекс Object Storage для размещения своих данных?
Да. Object Storage используется в инфраструктуре Яндекса. Несколько сервисов Яндекса держат в хранилище статические данные для своих сайтов.
Какую модель консистентности данных использует Yandex Object Storage?
Для перезаписываемых (PUT) или удаляемых (DELETE) объектов используется режим строгой консистентности (strong consistency).
Какие возможности AWS S3 поддерживаются в Yandex Object Storage?
В Object Storage поддерживаются:
- Авторизация статическими токенами.
- Некоторые методы HTTP API. Полный список поддерживаемых методов смотрите в Справочнике API.
Где хранятся мои данные?
Данные хранятся в нескольких географически распределенных дата-центрах на территории России. Подробнее в разделе Зоны доступности.
Как защищены мои данные в Yandex Object Storage?
Физические носители расположены в дата-центрах Yandex Cloud, которые являются режимными объектами.
Данные хранятся в зашифрованном виде, и никто из тех, кто имеет доступ к физическому носителю, не сможет прочитать данные.
По умолчанию доступ к хранилищу осуществляется по протоколу HTTPS.
От чего зависит скорость загрузки и скачивания данных в Yandex Object Storage?
Время ответа Object Storage зависит от многих факторов:
- Производительности клиентской стороны (скорости сети, загрузки CPU или дисковой подсистемы).
- Скорости магистральных соединений, соединений между дата-центрами или соединения между клиентом и сервером.
- Производительности самого сервиса Object Storage.
Из-за этого мы не можем указать конкретное значение времени ответа. При этом мы не считаем нормой резкое увеличение времени ответа или заметное снижение скорости отправки данных и постоянно работаем над улучшением технических характеристик Object Storage.
Соответствует ли сервис требованиям Федерального закона Российской Федерации № 152-ФЗ О персональных данных
?
Да, вы можете ознакомиться с полным заключением
Я могу получить логи моей работы в сервисах?
Да, вы можете запросить информацию о работе с вашими ресурсами из логов сервисов Yandex Cloud. Для этого обратитесь в техническую поддержку
Как подключить собственный домен к бакету Object Storage?
Чтобы подключить свой домен к бакету:
-
Создайте бакет с именем домена.
-
Настройте бакет в качестве хостинга.
-
Создайте на своем DNS-сервере CNAME-запись, чтобы привязать ваш домен к бакету.
-
(опционально) Добавьте свой сертификат в Certificate Manager или выпустите бесплатный сертификат от Let's Encrypt.
-
Настройте HTTPS: привяжите к бакету сертификат из Certificate Manager или загрузите свой.
После успешного выполнения всех шагов доступ к объектам будет работать по ссылкам вида <имя_домена>/<ключ_объекта>.
Почему после создания/изменения политики доступа пропал доступ к бакету?
Если после настройки политики доступа возникает ошибка Access Denied или не отображается список объектов, проверьте правила политики.
Возможно несколько причин:
-
Для политики доступа объекты в бакете и сам бакет — это разные ресурсы. Чтобы правило в политике доступа относилось и к бакету, и к объектам в нем, укажите их как отдельные ресурсы. Например,
samplebucketиsamplebucket/*. -
Если к бакету применена политика доступа без правил, то доступ будет запрещен всем пользователям. Чтобы отключить проверки запросов по политике доступа, удалите ее.
-
Если с бакетом взаимодействует кластер Apache Hive™ Metastore или Yandex Managed Service for Apache Airflow™ и для бакета настроена политика доступа, кластер не сможет записывать данные в бакет или читать данные из бакета без сервисного аккаунта с соответствующей ролью. Подробнее в инструкциях для Apache Hive™ Metastore и Managed Service for Apache Airflow™.
Как получить доступ к Object Storage из облачной сети Virtual Private Cloud?
Для ресурсов, которые размещены в облачной сети VPC и не имеют публичных IP-адресов или выхода в интернет, можно организовать подключение к Object Storage через API Endpoint. FQDN эндпоинта с помощью службы DNS будет преобразован в публичный IP-адрес.
Проверяются ли объекты, загружаемые в бакет, на наличие чувствительных данных и вредоносного кода?
В Object Storage объекты, загружаемые в бакет, не проверяются на наличие чувствительных данных или вредоносного кода.
Реализуйте проверку на наличие вредоносного кода самостоятельно перед загрузкой объектов в бакет.
Для выявления чувствительных данных в бакете воспользуйтесь модулем контроля данных (DSPM) Yandex Security Deck.
Как исправить некорректный MIME-тип объектов при их загрузке в бакет?
Если бакет используется для хостинга сайта, некорректный MIME-тип
В таком случае в браузере в консоли разработчика отображаются ошибки о некорректных MIME-типах объектов, загружаемых из бакета.
В зависимости от способа загрузки объектов в бакет заголовок Content-Type может подбираться автоматически, при этом не всегда корректно, например text/plain вместо text/css, либо выставляться по умолчанию — binary/octet-stream.
Чтобы избежать ошибок, явно укажите заголовок Content-Type при загрузке объектов в бакет:
Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.
По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name или --folder-id.
Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.
-
Посмотрите описание команды для загрузки объекта:
yc storage s3api put-object --help -
Загрузите файл с явно заданным MIME-типом:
yc storage s3api put-object \ --bucket <имя_бакета> \ --key <ключ_объекта> \ --body <путь_к_локальному_файлу> \ --content-type "application/javascript"Где
--bucketи--key— обязательные параметры: имя бакета и ключ объекта. Параметр--bodyзадает путь к загружаемому файлу. Необязательный параметр--content-typeявно задает MIME-тип; в примере указан тип для JavaScript.
aws s3 cp \
<путь_к_локальному_файлу> \
s3://<имя_бакета>/ \
--no-guess-mime-type \
--content-type "application/javascript" \
--endpoint-url=https://storage.yandexcloud.net
s3cmd put \
--no-guess-mime-type \
--no-mime-magic \
--mime-type="application/javascript" \
<путь_к_локальному_файлу> \
s3://<имя_бакета>/
Также вы можете изменить заголовок Content-Type для уже загруженных объектов, например:
aws s3 cp \
s3://<имя_бакета>/ \
s3://<имя_бакета>/ \
--exclude '*' \
--include '*.js' \
--no-guess-mime-type \
--content-type="application/javascript" \
--metadata-directive="REPLACE" \
--recursive \
--endpoint-url=https://storage.yandexcloud.net
s3cmd modify \
--recursive \
--exclude '*' \
--include '*.js' \
--no-guess-mime-type \
--no-mime-magic \
--mime-type="application/javascript" \
s3://<имя_бакета>/
Как настроить заголовок Cache-Control для объектов в бакете?
Заголовок Cache-Control относится к системным метаданным объекта. Его можно задать при загрузке объекта или изменить для уже загруженного объекта.
С помощью s3cmd заголовок добавляется при загрузке файла:
s3cmd --add-header 'Cache-Control:max-age=3600' \
put <путь_к_локальному_файлу> s3://<имя_бакета>/<ключ_объекта>
Для уже загруженного объекта:
s3cmd --add-header 'Cache-Control:max-age=3600' \
modify s3://<имя_бакета>/<ключ_объекта>
Пример загрузки с помощью AWS CLI:
aws --endpoint-url=https://storage.yandexcloud.net s3 cp \
<путь_к_локальному_файлу> s3://<имя_бакета>/<ключ_объекта> \
--cache-control 'max-age=3600'
В примерах время кэширования — 3600 секунд.
Как скопировать содержимое бакета в другой бакет?
Содержимое бакета можно скопировать в бакет того же каталога, другого каталога, облака или организации. Для этого нужны права на чтение объектов в бакете-источнике и на запись в бакете-приемнике. При копировании всех объектов также нужен доступ к списку объектов источника.
Пример для AWS CLI:
aws --endpoint-url=https://storage.yandexcloud.net s3 cp \
s3://<бакет_источник>/ s3://<бакет_приемник>/ \
--recursive
Для копирования между организациями доступны следующие варианты:
-
С помощью Yandex Cloud CLI — от имени аккаунта в Яндексе, у которого есть нужные права в обеих организациях:
yc storage s3 cp \ s3://<бакет_источник>/ s3://<бакет_приемник>/ \ --recursiveПеред выполнением команды установите и настройте CLI.
-
С помощью AWS CLI — от имени сервисного аккаунта с правами на бакет-приемник, если в бакете-источнике разрешено публичное чтение объектов и их списка. Этот вариант подходит только для данных, которые можно сделать общедоступными.
Если объекты не зашифрованы, копирование происходит на стороне сервера, в том числе между организациями. Для зашифрованных объектов действуют особенности, описанные в инструкции Скопировать объект.
Команды копируют объекты и сохраняют их в исходном бакете. При переносе данных удаление исходных объектов выполняется отдельно после проверки копии.
Как восстановить удаленные объекты?
Если при загрузке объекта было включено версионирование и нужная версия сохранилась, ее можно восстановить.
Если восстановить объект не удалось, создайте запрос в техническую поддержку
Важно
Техническая поддержка не гарантирует восстановление данных, удаленных пользователем. Пока инженеры работают над запросом, не записывайте новые данные в затронутый бакет.
Как изменить класс хранения объектов?
Класс хранения, заданный в свойствах бакета, применяется к новым объектам, только если инструмент загрузки явно не указывает другой класс. Например, в бакет с ледяным классом по умолчанию можно загрузить объект стандартного класса.
Для уже загруженных объектов изменение настройки бакета не меняет класс хранения. Чтобы изменить его, можно:
- Настроить правила жизненного цикла для перехода в более холодный класс хранения.
- Повторно загрузить объект с нужным классом или скопировать его по тому же ключу с указанием нового класса с помощью S3-клиента.
Как разрешить чтение объектов только из сетей Cloud CDN?
Доступ к объектам можно ограничить с помощью политики доступа, которая разрешает чтение только из подсетей Yandex Cloud CDN.
Список подсетей периодически меняется. Скрипт ниже получает актуальный список, объединяет смежные диапазоны и формирует политику в формате JSON. Все диапазоны находятся в одном условии aws:SourceIp и применяются с логикой ИЛИ.
Скрипт генерации политики
Сохраните код в файл cdn-bucket-policy.py:
import argparse
import ipaddress
import json
import urllib.request
parser = argparse.ArgumentParser()
parser.add_argument("--bucket", required=True)
parser.add_argument("--source", required=True)
args = parser.parse_args()
with urllib.request.urlopen(args.source, timeout=30) as response:
prefixes = json.load(response)["prefixes"]
if not prefixes:
raise ValueError("Список подсетей CDN пуст")
networks = [ipaddress.ip_network(prefix) for prefix in prefixes]
cidrs = []
for version in (4, 6):
cidrs.extend(
str(network)
for network in ipaddress.collapse_addresses(
network for network in networks if network.version == version
)
)
policy = {
"Version": "2012-10-17",
"Statement": [{
"Sid": "AllowCloudCDNOnly",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": f"arn:aws:s3:::{args.bucket}/*",
"Condition": {"IpAddress": {"aws:SourceIp": cidrs}},
}],
}
print(json.dumps(policy, indent=2, ensure_ascii=False))
Запустите скрипт с помощью Python 3, указав имя бакета:
python3 cdn-bucket-policy.py --bucket <имя_бакета> \
--source https://tech.cdn.yandex.net/prefixes/yc.json > policy.json
Проверьте полученный файл и примените политику к бакету. Скрипт только создает JSON-файл и не меняет настройки бакета.
Политика разрешает только чтение объектов из сетей CDN. Для других операций, в том числе доступа через консоль управления, нужны отдельные правила. Если в бакете уже есть политика, учитывайте ее правила при внесении изменений: другие разрешающие правила могут открыть чтение и для адресов вне сетей CDN.
Периодически запускайте скрипт повторно и обновляйте политику, чтобы учитывать изменения списка подсетей.
Как исправить ошибку SignatureDoesNotMatch?
Ошибка The request signature we calculated does not match the signature you provided при работе через S3-клиент или SDK может возникать из-за неверно указанного статического ключа доступа. Проверьте идентификатор и секретную часть ключа, а также их формат в настройках клиента.
Для диагностики повторите операцию с помощью AWS CLI с параметром --debug. В выводе будут промежуточные результаты расчета подписи, которые помогут найти причину ошибки.
Если ошибка сохраняется, создайте запрос в техническую поддержку
Почему при удалении бакета возникает ошибка Bucket is not empty?
Удалить можно только пустой бакет. Ошибка Bucket is not empty возникает, если в нем остались объекты, их версии, маркеры удаления или незавершенные составные загрузки.
Чтобы очистить бакет:
- Удалите все объекты, их версии и маркеры удаления. В инструкции есть примеры для CLI, AWS CLI и Python (boto3).
- Удалите незавершенные составные загрузки.
Также очистку можно настроить с помощью правил жизненного цикла. Они обрабатываются асинхронно, поэтому бакет может освободиться не сразу.
Почему запрос OPTIONS возвращает ошибку 403 без заголовка Access-Control-Allow-Origin?
Проверьте конфигурацию CORS в бакете и заголовки запроса OPTIONS:
- Заголовок
Originдолжен содержать источник запроса, напримерhttps://example.com, разрешенный вAllowedOrigin. - Заголовок
Access-Control-Request-Methodдолжен содержать метод последующего запроса, разрешенный вAllowedMethod. - Если запрос передает
Access-Control-Request-Headers, перечисленные заголовки должны быть разрешены вAllowedHeader. Чтобы разрешить все заголовки, используется*.
Если источник или метод не разрешены, Object Storage возвращает ошибку 403 без заголовков Access-Control-*.
Подробнее о механизме — в разделе CORS и принцип одинакового источника.
Как исправить ошибку сертификата при использовании собственного домена?
Ошибки err_cert_common_name_invalid и ssl_error_bad_cert_domain могут возникать, когда CNAME-запись для домена сайта указывает на <имя_бакета>.storage.yandexcloud.net. Для хостинга сайта она должна указывать на <имя_бакета>.website.yandexcloud.net.
Проверьте CNAME-запись и настройку HTTPS: сертификат должен соответствовать домену сайта.
Почему при создании бакета возникает ошибка BucketAlreadyExists?
Ошибка 409 BucketAlreadyExists означает, что имя бакета уже занято. Имена бакетов уникальны в пределах региона и его эндпоинта, в том числе между каталогами, облаками и организациями.
Выберите другое имя и повторите создание. Требования к имени приведены в разделе Правила именования бакетов.