Скрепка и выпуск Amazon S3 - PullRequest
4 голосов
/ 11 июня 2010

У меня есть приложение rails, работающее на Heroku. Я использую скрепку для некоторых простых загрузок изображений для пользовательских аватаров и некоторых других вещей, у меня установлен S3 в качестве бэкэнда, и все, кажется, работает нормально, за исключением того, что при попытке перейти на S3 я получаю следующую ошибку:

The AWS Access Key Id you provided does not exist in our records. 

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

Теперь для обоих ключей я использовал браузерное приложение S3 в OS X и смог подключиться к каждому из них, просмотреть мои текущие сегменты и добавить / удалить сегменты. Есть ли что-то, что я должен высматривать? У меня в приложении S3 и настройка скрепки вот так

development:
  bucket: (unique name)
  access_key_id: ENV['S3_KEY']
  secret_access_key: ENV['S3_SECRET']

test:
  bucket: (unique name)
  access_key_id: ENV['S3_KEY']
  secret_access_key: ENV['S3_SECRET']

production:
  bucket: (unique_name)
  access_key_id: ENV['S3_KEY']
  secret_access_key: ENV['S3_SECRET']

has_attached_file :cover,
    :styles => {
      :thumb => "50x50"
    },
    :storage => :s3,
    :s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
    :path => ":class/:id/:style/:filename"

РЕДАКТИРОВАТЬ ПРИМЕЧАНИЕ: ENV ['S3_KEY'] и ENV ['S3_SECRET'] - это переменные окружения в heroku, которые я пробовал, даже используя свои ключи напрямую, и это все еще не работает

Примечание: я только что добавил биты (уникальных имен), которых на самом деле нет - я также проверил имена сегментов, но даже не думаю, что это заходит так далеко. У меня также правильно настроены мои переменные среды heroku и они настроены на dev

Ответы [ 3 ]

3 голосов
/ 11 июня 2010

Вы не ставите ведро.Он находится в вашем файле s3.yml, но вы не читаете это значение из вашего звонка в has_attached_file.

Paperclip S3 docs: http://rubydoc.info/gems/paperclip/Paperclip/Storage/S3#s3_protocol-instance_method

Также обратите внимание на этих людейкто говорит вам не использовать файл s3.yml с Heroku.Это пустая трата времени и просто добавленная абстракция, которая ничего не покупает.У вас уже есть ENV с нужными вам значениями, поэтому используйте их.

Я делал это раньше, когда не хочу отправлять файл s3.yml в Heroku, но я хочуиспользовать один для тестирования и разработки.В инициализаторе вы можете сделать что-то вроде этого:

# If an s3.yml file exists, use the key, secret key, and bucket values from there.
# Otherwise, pull them from the environment.
if File.exists?("#{Rails.root}/config/s3.yml")
  s3_config = YAML.load_file("#{Rails.root}/config/s3.yml")
  S3[:key] = s3_config[Rails.env]['key']
  S3[:secret] = s3_config[Rails.env]['secret']
  S3[:bucket] = s3_config[Rails.env]['bucket']
else
  S3[:key] = ENV['S3_KEY']
  S3[:secret] = ENV['S3_SECRET']
  S3[:bucket] = ENV['S3_BUCKET']
end

Затем, когда вы настраиваете Paperclip в вашей модели, вы ссылаетесь на значение следующим образом:

...
:s3_credentials => {
  :access_key_id => S3[:key],
  :secret_access_key => S3[:secret]
},
:bucket => S3[:bucket]

Очевидно, этоозначает, что вы не хотите, чтобы ваш файл s3.yml находился в вашем git-репозитории (что на самом деле не стоит).

3 голосов
/ 19 января 2011

Я продолжал получать ту же ошибку AWS::S3::InvalidAccessKeyId, и у меня был очень похожий файл s3.yml.Как рекомендует x1a4, я использовал ERB в своем файле yaml, и это сработало.Вот как это выглядит сейчас:

# myapp/config/s3.yml

development: &DEFAULTS
  bucket: myapp_dev
  access_key_id: <%= ENV['S3_KEY'] %>
  secret_access_key: <%= ENV['S3_SECRET'] %>

test:
  <<: *DEFAULTS
  bucket: myapp_test

production:
  <<: *DEFAULTS
  bucket: myapp

staging:
  <<: *DEFAULTS
  bucket: myapp_staging

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

1 голос
/ 11 июня 2010

Ваш файл s3 yaml фактически использует строки ENV['S3_KEY'] и ENV['S3_SECRET'] в качестве информации об аутентификации для s3.Они не оцениваются как код ruby.

По крайней мере, есть пара вещей, которые вы можете сделать, не помещая эту фактическую информацию в файл yaml.Вы можете изучить включение ERB в своих конфигурациях yaml или просто не использовать файл yaml для своих учетных данных вообще, потому что вы всегда извлекаете данные из окружения в каждом из ваших rails_envs, поэтому файл yamlпросто дополнительный слой косвенности в вашем случае, который бесполезен.

...