Ошибка aws-s3: ошибка AWS :: S3 :: MissingAccessKey, но ключи определены? - PullRequest
2 голосов
/ 19 августа 2011

Я довольно новичок в ROR. Я недавно развернул приложение на heroku и попытался добавить функцию прикрепления к приложению с помощью скрепки.

Я выполнил все шаги по добавлению aws-s3 в свое приложение. Вот мой первоначальный код:

user.rb (модель)

has_attached_file :avatar, 
                  :styles => {:small => "70x70>"},
                  :storage => :s3,
                  :s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
                  :path => ":attachment/:id/:style/:basename.:extension"


validates_attachment_size :avatar, :less_than => 1.megabytes
validates_attachment_content_type :avatar, :content_type => ['image/jpeg', 'image/png']

s3.yml (файл находится в папке config) примечание: все эти блоки существуют на моем aws-s3

development:
  bucket: my_avatar-dev
  access_key_id: amazonaccesskey
  secret_access_key: amazon_secret_access_key
test:
  bucket: myapp_avatar-test
  access_key_id: amazonaccesskey
  secret_access_key: amazon_secret_access_key
production:
  bucket: myapp_avatar-pro
  access_key_id: amazonaccesskey
  secret_access_key: amazon_secret_access_key

Gemfile

gem 'aws-s3'

При запуске этой конфигурации я получаю ошибку страницы 500 при загрузке моего приложения. Выполнение Heroku logs показало следующую ошибку: AWS :: S3 :: MissingAccessKey (Вы не предоставили оба требуемых ключа доступа.

Поэтому я последовал некоторому совету и определил ключ и secret_key как переменные среды для heroku, используя следующую строку кода:

heroku config:add S3_KEY=amazonaccesskey S3_SECRET=amazon_secret_key

Затем я добавил инициализатор для тестирования сред и запуска через ключ или файл .yml в зависимости от среды, код выглядит следующим образом:

Инициализаторы / s3.rb

if Rails.env == "production"
  # set credentials from ENV hash
  S3_CREDENTIALS = { :access_key_id => ENV['S3_KEY'], :secret_access_key => ENV['S3_SECRET'], :bucket => "myapp_avatar-pro"}
else
  # get credentials from YML file
  S3_CREDENTIALS = Rails.root.join("config/s3.yml")
end

user.rb модель была обновлена ​​до следующего:

has_attached_file :avatar, :storage => :s3, :s3_credentials => S3_CREDENTIALS

Затем я развернул на heroku и протестировал приложение, но все равно продолжаю получать ту же ошибку (стр. 500) и код ошибки: AWS :: S3 :: MissingAccessKey (Вы не предоставили оба необходимых ключа доступа.

Как это возможно, если я определил переменные в heroku? Есть ли что-то, что мне не хватает? Возможно ли это что-то с жемчужиной? Кроме того, я использую HAML для стиля ... не уверен, что это важно, но на всякий случай. Я совершенно потерян, поэтому любая помощь будет принята с благодарностью. Большое вам спасибо!

Ответы [ 2 ]

0 голосов
/ 21 сентября 2011

Я решил эту проблему следующим образом:

:s3_credentials => {
  :access_key_id => 'mykey',
  :secret_access_key => 'mykey'
0 голосов
/ 09 сентября 2011

Только что проработал ту же проблему и трал несколько похожих постов. Я обнаружил, что любая из возможных конфигураций в ответе выше, то есть объявление всех хэшей в модели, использование .yml или инициализатор, все отлично работает из моего dev и на heroku, пока ведро S3 имеет тип US Standard > Выбор зависит от того, насколько СУХОЙ вы хотите быть.

Когда я изначально настроил S3, я использовал европейское ведро. Это дало мне ложное сообщение об ошибке:

AWS :: S3 :: MissingAccessKey (Вы не предоставили оба необходимых ключа доступа.

Я отмечаю с сайта AWS: http://docs.amazonwebservices.com/general/latest/gr/index.html?rande.html что AWS использует конкретный адрес конечной точки для каждого региона, чтобы уменьшить задержку, и я предполагаю (потому что я начинающий программист), что американский стандарт является стандартным или закодирован в плагине AWS-S3. (Может быть, кто-то может изменить это в более полный ответ?)

...