Проблемы с настройкой Paperclip + AWS S3 для хранения изображений в нашем приложении Rails3 / Heroku - PullRequest
4 голосов
/ 22 марта 2011

Мы уже создали приложение rails, в котором есть несколько пользователей и изображение для каждого из них. Выполняя всю работу разработчика на нашем локальном хосте, у нас есть рабочие семена для пользователей и фотографий ... но теперь, когда мы пытаемся использовать S3 для хранения изображений, мы сталкиваемся с ошибками во время ... всегда во время "семени" шаг миграции, при этом:

rake db: мигрировать: сбросить

Извиняюсь за вопрос, но мы ударяем по этому вопросу в течение 11 часов, изучая все связанные вопросы стека по этому вопросу. У многих подобных постов была ошибка NoSuchBucket и другие типы проблем, но мы ни одно из предложенных изменений не устранили нашу проблему ... возможно, это связано с новейшими версиями драгоценных камней, которые мы используем?

Мы используем Rails 3.0.4, Ruby 1.8.7, Paperclip 2.3.8, aws-s3 0.6.2

Мы добавляем семена для первоначальных пользователей и фотографии для каждого пользователя, используя наш файл seed.rb в папке / migrate /. Это всегда хорошо работало при хранении файлов и изображений на локальном компьютере (с использованием скрепки, но не S3). Мы также проверили удаление файла seed и просто создание нового пользователя с работающим приложением и получили ту же ошибку:

Учетные данные не являются путем, файлом или Хэш

Для пользовательского модуля мы протестировали оба варианта, в которых мы устанавливаем следующие ключи S3 через файл (a) yml и (b) непосредственно в пользовательской модели. access_key_id: «секретный» secret_access_key: 'secret'

Мы пытались сделать это от нашего локального хоста (еще не жившего на Heroku), и мы также попытались запустить это через Heroku.

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

не может конвертировать модуль в хэш

Поиск в сообщении об ошибке возвращает ноль результатов, поэтому мы не знаем, что там происходит. Это была самая расстраивающая часть ... казалось бы, каждая попытка вернула нас к этой ошибке.

Мы также попробовали оба:

(1) жесткое кодирование клавиш доступа в пользовательской модели, как:

:access_key_id => ENV['accesskeyid'],
:secret_access_key => ENV['secretaccesskey'],

В этом случае мы часто получаем эту ошибку:

Вы не предоставили оба необходимых ключа доступа. Пожалуйста, предоставьте access_key_id и secret_access_key.

Разочарование, потому что у нас всегда были оба списка, проверенные с кавычками и без, изменение порядка и т. Д.

Мы попробовали это как (а) с ENV ['accesskeyid'], так и (б) без них ... просто blahblah => 'accesskeyid'.

и (2) вставка ключей в файл yml, например:

has_attached_file :photo,
  :storage => :s3,
  :s3_credentials => "#{Rails.root}/config/s3.yml",
  :path => "/:photo/:filename"

с этим в файле yml:

development:
  access_key_id: accesskeyid
  secret_access_key: secretaccesskey
  bucket: ourbucketname
production:
  access_key_id: accesskeyid
  secret_access_key: secretaccesskey
  bucket: ourbucketname

Мы попробовали это с одинарными кавычками вокруг клавиш и без.

Мы также попытались определить сегмент в модели, а не в файле yml, и получили ту же ошибку.

и (3), настраивая его так:

if Rails.env == "производство" S3_CREDENTIALS = {: access_key_id => ENV ['S3_KEY'],: secret_access_key => ENV ['S3_SECRET'],: bucket => "ourbucket"} else S3_CREDENTIALS = Rails.root.join ("config / s3.yml")
конец

has_attached_file: фотография, : storage =>: s3, : styles => {: small => "50x50>",: thumb => "75x75>",: medium => "400x400>"}, : path => "/: photo /: filename"

С таким же содержимым в нашем файле yml.

Это дало нам эту ошибку:

учетные данные не являются файлом, путем или хэшем

Естественно, мы четыре раза проверили, что у нас есть правильные ключи доступа (из нашей учетной записи AWS), и протестировали несколько различных способов настройки хэша, но так и не получили того, что хотели.

Вот соответствующая часть Gemfile: gem 'aws-s3',: require => 'aws / s3' #Для хранения изображений на Amazon драгоценный камень "скрепка"

В качестве еще одной попытки мы попытались использовать гем right_aws в Gemfile, но это привело к этой ошибке:

нет такого файла для загрузки - aws / s3 (Вы возможно, потребуется установить гем aws-s3)

Обратите внимание, что мы делали все это и исправляли все эти ошибки, выполняя миграцию с локального хоста, а не из живого приложения Heroku, но даже не смогли пройти этот простой шаг «начальных пользователей».

В настоящее время наше ведро называется media.oururl.com. Есть ли какая-то проблема с наличием точек в имени сегмента?

Собираюсь спросить об этом и героев, ребята, но, учитывая, насколько удивительным является это сообщество, я надеюсь, что один из вас знает, что мы делаем с ней не так.

ОЧЕНЬ высоко ценится - и, надеюсь, это поможет тем, кто следует за нами.

1 Ответ

5 голосов
/ 22 марта 2011

отличный вопрос. Я провел довольно много времени с подобной проблемой некоторое время назад

Основная проблема заключается в том, что вам нужно переместить следующий код в собственный файл инициализатора:

if Rails.env == "production" 
   S3_CREDENTIALS = { :access_key_id => ENV['S3_KEY'], :secret_access_key => ENV['S3_SECRET'], :bucket => "ourbucket"} 
 else 
   S3_CREDENTIALS = Rails.root.join("config/s3.yml")
end

Затем вы должны добавить следующую строку в вашу модель, где у вас есть * has_attached_file: photo * Строка, которую нужно добавить, -.

:s3_credentials => S3_CREDENTIALS,

Это то, чего вам не хватало раньше.

Кроме того, когда вы объявляете имя своего сегмента, убедитесь, что это стандартно для нас. Если вы используете одно из других мест, вам необходимо соответствующим образом обновить путь.

Надеюсь, это поможет!

...