Архив рубрики: storage

Подключение Active Storage к Yandex Object Storage

link

Для работы с Yandex Object Storage необходимо еще:

  1. прописать в Gemfile`gem “aws-sdk-s3”, require: false` и потом естественно bundle install
  2. прописать у сервиса yandex параметр `region: ‘ru-central3’`

PS если ранее не пользовались, то выполнить поддержку Active Storage:

3. `rails active_storage:install`

4. `rails db:migrate`

И вот только после этого будет все работать.

Пояснение относительно gem-а:

Active Storage http://rusrails.ru/active_storage_overview#servis-amazon-s3 требует указанный выше gem для работы с Amazon S3. Это нужно так как Yandex Object Storage поддерживает методы Amazon S3 https://cloud.yandex.ru/docs/storage/s3/, то и устанавливаем его https://github.com/aws/aws-sdk-ruby

Пояснение относительно ключа region:

Без него не работало, так как трубуется указание ключа региона https://cloud.yandex.ru/docs/storage/s3/signing-requests

 


Для начала, нам нужны ключи для доступа к API. Их можно создать во вкладке “Сервисные аккаунты”: Создать новый ключ > Создать ключ доступа. Идентификатор ключа будет выполнять роль YOUR_ACCESS_KEY_ID, а Секретный ключ, соответственно, YOUR_SECRET_ACCESS_KEY.

Точкой отсчёта мы возьмём стандартный конфиг от Амазона, который лежит в config/storage.yml:

amazon:
   service: S3
   access_key_id: 'YOUR_ACCESS_KEY_ID'
   secret_access_key: 'YOUR_SECRET_ACCESS_KEY'
   region: eu-north-1
   bucket: bucketname

Для подключения к стороннему хранилищу, нам нужно указать для него эндпоинт, в случае с яндексом это будет:

https://storage.yandexcloud.net

Также нам понадобится установить переменную force_path_style в true, чтобы AS использовал нужный нам тип URL. Итого получим такой конфиг:

yandex:
  service: S3
  access_key_id: 'YOUR_ACCESS_KEY_ID'
  secret_access_key: 'YOUR_SECRET_ACCESS_KEY'
  bucket: bucketname
  endpoint: 'https://storage.yandexcloud.net'
  force_path_style: true

Останется в конфиге окружения указать Яндекс:

Rails.application.configure do
  ...
  config.active_storage.service = :yandex
  ...
end

После этого можно использовать апи Active Storage в своем приложении.