Настройка ActiveStorage для использования S3 с ролью IAM - PullRequest
2 голосов
/ 15 марта 2019

Я пытаюсь настроить ActiveStorage для использования корзины S3 в качестве бэкэнда хранилища, однако я не хочу передавать ни один из access_key_id, secret_access_key, region. Вместо этого я хотел бы использовать ранее определенную роль IAM. Такая конфигурация упоминается здесь . Это читает (я добавил жирным шрифтом):

Если вы хотите использовать переменные среды, стандартные файлы конфигурации SDK, профили, профили экземпляра IAM или роли задач, вы можете пропустить access_key_id, secret_access_key и ключи региона в приведенном выше примере. Сервис Amazon S3 поддерживает все параметры аутентификации, описанные в документации AWS SDK.

Однако я не могу заставить его работать. Мой storage.yml выглядит примерно так:

amazon:
  service: S3
  bucket: bucket_name
  credentials:
    role_arn: "linked::account::arn"
    role_session_name: "session-name"

Я запустил rails active_storage:install, применил сгенерированные миграции и установил config.active_storage.service = :amazon в конфигурации моего приложения.

Проблема в том, что когда я пытаюсь сохранить файл, я получаю неожиданную ошибку:

u = User.first
s = StringIO.new
s << 'hello,world'
s.seek 0
u.csv.attach(io: s, filename: 'filename.csv')

Traceback (most recent call last):
        2: from (irb):3
        1: from (irb):3:in `rescue in irb_binding'
LoadError (Unable to autoload constant ActiveStorage::Blob::Analyzable, expected /usr/local/bundle/gems/activestorage-5.2.2/app/models/active_storage/blob/analyzable.rb to define it)

Я использую Rails 5.2.2.

1 Ответ

1 голос
/ 16 марта 2019

Вы пробуете этот код внутри экземпляра AWS EC2 или локально на вашем компьютере?

Если вы проверяете методы аутентификации в AWS: https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/setup-config.html#aws-ruby-sdk-credentials-iam

Вы увидите следующий раздел:

Настройка учетных данных с использованием IAM

Для экземпляра Amazon Elastic Compute Cloud создайте роль управления удостоверениями и доступом AWS, а затем предоставьте вашему экземпляру Amazon EC2 доступ к этой роли. Для большего информацию см. в разделе Роли IAM для Amazon EC2 в Руководстве пользователя Amazon EC2. для экземпляров Linux или роли IAM для Amazon EC2 в пользователе Amazon EC2 Руководство по экземплярам Windows.

Это означает, что для работы этого метода аутентификации необходимо:

  • Создание экземпляра EC2 на AWS
  • Создание роли EC2 IAM с разрешениями на запись в S3 Bucket
  • Настройте свой экземпляр EC2, подключив к нему новую роль IAM

С ролью, прикрепленной к экземпляру, ваш файл config / storage.yml будет выглядеть следующим образом:

amazon:
  service: S3
  bucket: test-stackoverflow-bucket-app
  region: "us-west-1"

Обратите внимание, что регион является обязательным параметром, если вы пропустите его, вы получите сообщение об ошибке: https://github.com/aws/aws-sdk-ruby/issues/1240#issuecomment-231866239

Боюсь, это не будет работать локально, чтобы использовать active_storage локально, вы должны установить значения access_key_id, secret_access_key.

...