Ошибка AWS :: S3 :: NoConnectionEstablished при использовании гема aws-s3 в Rails - PullRequest
0 голосов
/ 15 сентября 2010

Я получаю исключение AWS :: S3 :: NoConnectionEstablished при попытке загрузить файл с помощью paperclip + s3.Я могу запустить s3sh и создать соединение просто с учетными данными s3 в моей конфигурации.Какой лучший следующий шаг я могу предпринять для устранения этой проблемы?Вот как выглядит моя модель:

has_attached_file :file,
                    :storage => :s3,
                    :s3_permssions => :private,
                    :path => lambda { |attachment| ":id_partition/:basename.:extension" },
                    :url => lambda { |attachment| "products/:id/:basename.:extension" },
                    :s3_credentials => "#{Rails.root}/config/amazon_s3.yml",
                    :bucket => "products.mycompany.com"

И здесь возникает ошибка:

def temporary_s3_url(options={})
    options.reverse_merge! :expires_in => 10.minutes #, :use_ssl => true
    hard_url = AWS::S3::S3Object.url_for file.path, file.options[:bucket], options
    # Use our vanity URL
 hard_url.gsub("http://s3.amazonaws.com/products.mycompany.com","http://products.mycompany.com")
  end

Я попытался жестко закодировать соединение в качестве первой строки в методе temporary_s3_url, но яполучить ошибку "bucket not found"Я думаю, что проблема определенно в том, что у paperclip есть проблема при инициализации моей конфигурации s3.

Ответы [ 2 ]

0 голосов
/ 15 сентября 2010

Помните, что сохранение на S3 не является надежным - соединение может быть потеряно, сбой хранилища до завершения и т. Д.

Я создал свои собственные библиотечные процедуры, которые пытаются сделать хранилище, но ловят различные ошибки. Для ошибки без подключения я переподключаюсь. Для других ошибок хранения я повторяю (до трех раз). Вы также можете подождать секунду между попытками.

Добавлена ​​

Ниже приведена библиотечная процедура, которую я использую для вызовов AWS.

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

# Usage example:
# aws_repeat("Storing #{bucket}/#{obj}"){
#   AWS::S3::S3Object.store(obj, data, bucket, opt)}    

def aws_repeat(description = nil)
  # Calls the block up to 3 times, allowing for AWS connection reset problems
  for i in 1..3
    begin
      yield
    rescue Errno::ECONNRESET => e
      ok = false
      ActiveRecord::Base.logger.error \
           "AWS::S3 *** Errno::ECONNRESET => sleeping"
      sleep(1)
      if i == 1
        # reset connection
        connect_to_aws # re-login in to AWS
        ActiveRecord::Base.logger.error \
           "AWS::S3 *** Errno::ECONNRESET => reset connection"
      end        
    else
      ok = true
      break
    end
  end

  unless ok
    msg = "AWS::S3 *** FAILURE #{description.to_s}"
    ActiveRecord::Base.logger.error msg
    security_log(msg)
  end

  ok
end

############################################
############################################

def connect_to_aws
  # load params. Cache at class (app) level 
  @@s3_config_path ||= RAILS_ROOT + '/config/amazon_s3.yml'
  @@s3_config ||= 
       YAML.load_file(@@s3_config_path)[ENV['RAILS_ENV']].symbolize_keys

  AWS::S3::Base.establish_connection!(
    :access_key_id     => @@s3_config[:access_key_id],
    :secret_access_key => @@s3_config[:secret_access_key],
    :server            => @@s3_config[:server],
    :port              => @@s3_config[:port],
    :use_ssl           => @@s3_config[:use_ssl],
    :persistent        => false # from http://www.ruby-forum.com/topic/110842
    )

  true 
end
0 голосов
/ 15 сентября 2010

У меня есть скрепка с S3 и Heroku в двух приложениях. Вот что у меня сработало:

В вашем режиме:

has_attached_file :image, 
   :styles => {  :thumb => "250x250>" },
   :storage => :s3, :s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
   :path => "username/:attachment/:style/:id.:extension"

в config / s3.yml

development:
  bucket: name
  access_key_id: xyz
  secret_access_key: xyz

test:
  bucket: name
  access_key_id: xyz
  secret_access_key: xyz

production:
  bucket: name
  access_key_id: xyz
  secret_access_key: xyz

и, конечно, в вашей среде. Rb вам нужно включить драгоценный камень или, тем не менее, включить драгоценные камни.

...