Ошибки:: SignatureDoesNotMatch, AWS-SDK для поддержки S3 на paperclip 3.0.1 и рельсах 3.2

Я переношу свое приложение из Rails 3.0.9 в 3.2.3 и ruby ​​1.9.3. Я использовал paperclip (2.3.11) с драгоценным камнем aws-s3 для хранения моих изображений.

Теперь я хочу использовать последнюю версию paperclip (3.0.1), а затем мне нужно использовать aws-sdk gem.

Я установил свой файл aws.yml как:

    development: &development
      bucket: bucket_name_for_dev
      access_key_id: *****
      secret_access_key: *******
    staging:
      <<: *development
      bucket: bucket_name_for_staging

    production:
      <<: *development
      bucket: bucket_name_for_prod

моя модель содержит:

    has_attached_file :picture, :styles => { :medium => "300x300>", :thumb => "50x50>" }, :default_url => 'picture_missing.png',
         :storage => :s3,
         :bucket => "bucket_name_for_dev",
         :s3_credentials => Rails.root.join("config/aws.yml"),
         :path => "/presentation_pictures/:id/:style/:filename",
         :url  => ":s3_eu_url"

    attr_accessible :picture
    attr_accessor :picture_url

При попытке загрузить файл я получаю сообщение об ошибке:

AWS::S3::Errors::SignatureDoesNotMatch The request signature we calculated does not match the signature you provided. Check your key and signing method.

Я проверил, что мои ключи доступны и установлены в правильное значение.

Вот что я получаю от консоли:

    [paperclip] Saving attachments.
    [paperclip] saving /presentation_pictures/43/original/Image_1.png
    [AWS S3 200 0.813272 0 retries] put_object(:acl=>:public_read,:bucket_name=>"*******_dev",:content_type=>"image/png",:data=>#<Paperclip::UploadedFileAdapter:0x2e144b4 @target=#<ActionDispatch::Http::UploadedFile:0x2dbb1fc @original_filename="Image 1.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"presentation_picture[picture]\"; filename=\"Image 1.png\"\r\nContent-Type: image/png\r\n", @tempfile=#<File:/var/folders/tb/tbmv4LE9EwGNPr1QqU2S0E+++TI/-Tmp-/RackMultipart20120407-33502-1gajfe9>>, @tempfile=#<File:/var/folders/tb/tbmv4LE9EwGNPr1QqU2S0E+++TI/-Tmp-/Image 1.png20120407-33502-an4dcy>>,:key=>"presentation_pictures/43/original/Image_1.png")

Есть ли у вас какие-либо идеи, откуда могла возникнуть эта проблема? спасибо

Ответ 1

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

Двойная проверка моего секретного ключа и исправление этого исправления для меня.

Ответ 2

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

:s3_host_name => 's3-eu-west-1.amazonaws.com'

в параметрах has_attached_file.

Если вы настроили свой S3 на использование https, добавьте

:s3_protocol => 'https' 

если нет, просто игнорируйте его.

И если ваше ведро является закрытым, добавьте

:s3_permissions => :private

Вам также не нужно явно настраивать ведро в параметре параметров, поскольку вы уже объявили его в своем aws.yml и установили его через :s3_credentials => Rails.root.join("config/aws.yml").

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

Ответ 3

Моя ошибка заключалась в использовании ключа доступа root, а не ключа доступа пользователя. AWS недавно изменил его, поэтому вы должны создать отдельного пользователя AIM для себя, а затем использовать этот ключ доступа пользователя (не root)