2010-06-11 1 views
4

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

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

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

Paperclip S3 документы: 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 

Затем, когда вы настраиваете Скрепка в вашей модели, вы ссылаетесь значение, как это:

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

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

+0

Хотя это верно, проверьте ошибку в исходном сообщении. Он указывает, что access_key_id даже не принят, поэтому ведра еще не будут играть. – x1a4

+0

Это не имеет никакого смысла, но я сфокусировал свои ключи доступа (хотя они переменные окружения) ... Я не знаю, почему, я следовал совету Heroku в T, но это закончилось тем, что работало, спасибо! – Jimmy

+0

Разве вы не можете добавить s3.yml в свой список игнорирования git, чтобы он не отображался на Heroku? – Kevin

1

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

Есть несколько вещей, по крайней мере, что вы можете сделать за пределами помещения этой фактической информации в файл yaml. Вы можете look into enabling ERB in your yaml configs или просто не использовать файл yaml для своих учетных данных вообще, потому что вы всегда вытаскиваете из среды в каждом из ваших rails_envs, поэтому файл yaml - это просто дополнительный слой косвенности в вашем случае, который бесполезен.

+0

+1 Вот еще одна полезная ссылка из блога Heroku - http://blog.heroku.com/archives/2009/4/7/config-vars/ – Anurag

+0

thats именно то, что я делаю – Jimmy

+0

@Jimmy Это не то, что вы делаю. Вы помещаете материал ENV в файл yaml, где * он не будет обрабатываться как код Ruby *. Примеры в блоге в блоге Heroku помещают оценку ENV в сам класс, что тоже прекрасно, и устраняет необходимость объявления его для каждой среды отдельно в файле s3.yml. – x1a4

3

Я все время получал ошибку 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 

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

+0

Ты мой полный герой! – altuzar