Различные URL-адреса для загрузки и выгрузки со скрепкой в ​​хранилище S3

Для локальной разработки я использую Docker-контейнер localstack в качестве песочницы AWS с такой конфигурацией Paperclip:

config.paperclip_defaults = {
  storage:        :s3,
  s3_credentials: {
    access_key_id:     ENV['AWS_ACCESS_KEY_ID'],
    secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
  },
  bucket:         'my-development',
  s3_region:      'localhost-region',
  s3_host_name:   'localhost:4572',
  url:            ':s3_path_url',
}

Ссылки для загрузки контента сформированы правильно и работают:

http://localhost:4572/my-development/files/downloads/be-fl-che-spezialtiefbau-mischanlage-750_ae0f1c99d8.pdf

Но когда я хочу загрузить новые файлы, я получаю Aws :: Errors :: NoSuchEndpointError на основе другого URL:

https://my-development.s3.localhost-region.amazonaws.com/files/downloads/_umschlag-vorlage_c534f5f25e.pdf

Я искал и отлаживал несколько часов, но не смог узнать, где генерируется этот URL и почему он использует amazonaws.com в качестве хоста.

Есть подсказки, где смотреть?


person Sven R.    schedule 31.01.2020    source источник
comment
Ваш paperclip_defaults объект фактически инициирует :s3. В этот момент ваша загрузка всегда будет сосредоточена на s3.   -  person 7urkm3n    schedule 31.01.2020
comment
Localstack также предоставляет сервис S3, и он работает, так что все в порядке. Я просто хочу изменить место загрузки файлов (на каком хосте).   -  person Sven R.    schedule 01.02.2020
comment
Я все еще не понимаю, как получить загружаемый контент, не загружая его [NoSuchEndpointError]? И ваш загружаемый контент не работает должным образом? А если localstack - это разработка, что такое производство S3?   -  person 7urkm3n    schedule 01.02.2020
comment
Я отразил работающий AWS S3 в контейнере локального стека с помощью некоторых команд терминала. Это не имеет никакого отношения к скрепке, рубину или AWS Gem. В производстве я использую настоящий AWS S3.   -  person Sven R.    schedule 01.02.2020


Ответы (2)


Я нашел способ заставить его работать.

Добавить явный URL-адрес конечной точки в конфигурацию

# config/environments/development.rb
config.paperclip_defaults = {
  storage:        :s3,
  s3_credentials: {
    access_key_id:     ENV['AWS_ACCESS_KEY_ID'],
    secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
  },
  s3_options:     {
    endpoint: 'http://localhost:4572/my-development',
  },
  bucket:         'my-development',
  s3_region:      'localhost-region',
  s3_host_name:   'localhost:4572',
  url:            ':s3_path_url',
}

Поскольку URL-адрес будет переименован AWS Gem в имя сегмента, результирующий домен будет my-development.localhost. Я пока не нашел другого решения, кроме как добавить этот поддомен в свой /etc/hosts:

127.0.0.1   localhost
127.0.0.1   my-development.localhost
255.255.255.255 broadcasthost
::1             localhost
::1             my-development.localhost

Это не очень чисто, но работает. Может быть, позже я найду лучшее решение.

person Sven R.    schedule 10.02.2020

Это могло помочь другим. Вы можете обновить конфигурацию aws в файле конфигурации вашей среды.

Aws.config.update(
    endpoint: 'http://localhost:4572',
    force_path_style: true
  )
person Priyanghadevi    schedule 14.05.2020