2010-09-14 6 views
0

Je reçois une exception AWS :: S3 :: NoConnectionEstablished lorsque j'essaie de télécharger un fichier en utilisant paperclip + s3. Je peux lancer s3sh et créer une connexion très bien avec les informations d'identification S3 dans ma configuration. Quelle est la meilleure prochaine étape que je puisse prendre pour déboguer ce problème? C'est ce que mon modèle ressemble:Erreur AWS :: S3 :: NoConnectionEstablished en utilisant aws-s3 gem dans Rails

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" 

Et l'erreur se produit ici:

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 

J'ai essayé de coder en dur une connexion comme la première ligne dans la méthode temporary_s3_url mais je reçois un « seau pas trouvé " Erreur. Je pense que le problème est définitivement que paperclip a un problème d'initialisation de ma configuration s3.

Répondre

0

Rappelez-vous que le stockage S3 n'est pas fiable - la connexion peut être perdue, le magasin échouer avant de remplir, etc.

J'ai créé mes propres routines de bibliothèque qui tentent de faire le magasin, mais attraper diverses erreurs. Pour l'erreur sans connexion, je me reconnecte. Pour d'autres erreurs de stockage, je réessaie (jusqu'à trois fois). Vous pouvez également attendre une seconde entre les tentatives.

Ajouté

est inférieure à la routine de la bibliothèque que j'utilise pour les appels AWS.

Vous devez ajouter/modifier les clauses de récupération pour détecter les erreurs que vous rencontrez. Vos méthodes connection_reset et error reporting seront également spécifiques à votre 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

Cela semble cool, mais cela a complètement cessé de fonctionner, donc je sais que ce n'est pas un hoquet. Votre bibliothèque est-elle open source? Ce serait génial de vérifier. –

+0

Ce n'est pas vraiment une bibliothèque, voir la réponse modifiée. –

0

J'ai un trombone avec S3 et Heroku sur deux applications. C'est ce qui a fonctionné pour moi:

Dans le mode:

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

dans 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 

et bien sûr dans votre environment.rb vous devez avoir la gemme inclus ou bien vous incluez des gemmes.

Questions connexes