Nieudana proba polaczenia paperclipa z Amazonem S3

Witam wszystkich. Jestem poczatkujacym uzytkownikiem (programista? :O) RoR. Stworzylem dla siebie pewna aplikacje, ktora sam chce wykorzystywac. Chcialbym ja na poczatku odpalic na Heroku z racji latwosci obslugi. Zgodnie z zaleceniami zalozylem takze konto na Amazon AWS i zarejestrowalem sie do S3, aby wrzucac tam obrazki potrzebne do mojej strony. Probuje teraz polaczyc moja aplikacje za pomoca paperclipa z moim kontem S3 i niestety podczas odpalania http://localhost:3000/images dostaje taki blad:

ArgumentError in Images#index

Showing app/views/images/index.html.erb where line #19 raised:

syntax error on line 0, col 39: `bucket: (tutaj nazwa bucketu)
access_key_id: (tutaj access key id)
secret_access_key: (a tutaj oczywiscie secret access key)

Extracted source (around line #19):

16:

<%=h image.created_at %>
17: <%=h image.updated_at %>
18:
19: <% if image.img.exists? then %>
20:

<%= image_tag image.img.url(:thumb) %>


21: <% else %>
22:

There are no photo’s attached, upload one.


RAILS_ROOT: C:/Users/Mariusz/Sites/wiw_development

Application Trace | Framework Trace | Full Trace
C:/Ruby/lib/ruby/1.8/yaml.rb:133:in load' C:/Ruby/lib/ruby/1.8/yaml.rb:133:inload’
C:/Users/Mariusz/Sites/wiw_development/vendor/plugins/paperclip/lib/paperclip/storage.rb:236:in find_credentials' C:/Users/Mariusz/Sites/wiw_development/vendor/plugins/paperclip/lib/paperclip/storage.rb:176:inparse_credentials’
C:/Users/Mariusz/Sites/wiw_development/vendor/plugins/paperclip/lib/paperclip/storage.rb:138:in extended' C:/Users/Mariusz/Sites/wiw_development/vendor/plugins/paperclip/lib/paperclip/storage.rb:137:ininstance_eval’
C:/Users/Mariusz/Sites/wiw_development/vendor/plugins/paperclip/lib/paperclip/storage.rb:137:in extended' C:/Users/Mariusz/Sites/wiw_development/vendor/plugins/paperclip/lib/paperclip/attachment.rb:269:inextend’
C:/Users/Mariusz/Sites/wiw_development/vendor/plugins/paperclip/lib/paperclip/attachment.rb:269:in initialize_storage' C:/Users/Mariusz/Sites/wiw_development/vendor/plugins/paperclip/lib/paperclip/attachment.rb:51:ininitialize’
C:/Users/Mariusz/Sites/wiw_development/vendor/plugins/paperclip/lib/paperclip.rb:326:in new' C:/Users/Mariusz/Sites/wiw_development/vendor/plugins/paperclip/lib/paperclip.rb:326:inattachment_for’
C:/Users/Mariusz/Sites/wiw_development/vendor/plugins/paperclip/lib/paperclip.rb:229:in img' C:/Users/Mariusz/Sites/wiw_development/app/views/images/index.html.erb:19:in_run_erb_app47views47images47index46html46erb’
C:/Users/Mariusz/Sites/wiw_development/app/views/images/index.html.erb:12:in each' C:/Users/Mariusz/Sites/wiw_development/app/views/images/index.html.erb:12:in_run_erb_app47views47images47index46html46erb’
C:/Users/Mariusz/Sites/wiw_development/app/controllers/images_controller.rb:7:in `index’

Tak wygladaja moje pliki:

  1. app/views/images/index.html.erb

Listing images

<% @images.each do |image| %>

<% end %>
Id File Name Created at Updated at Img
<%=h image.id %> <%=h image.img_file_name %> <%=h image.created_at %> <%=h image.updated_at %> <% if image.img.exists? then %>

<%= image_tag image.img.url(:thumb) %>

<% else %>

There are no photo's attached, upload one.

<% end %>
<%= link_to 'Show', image %> <%= link_to 'Edit', edit_image_path(image) %> <%= link_to 'Destroy', image, :confirm => 'Are you sure?', :method => :delete %>

<%= link_to ‘New image’, new_image_path %>

  1. app/models/image.rb

class Image < ActiveRecord::Base
has_and_belongs_to_many :pairs
validates_presence_of :img_file_name
has_attached_file :img, :styles => {:thumb=> “100x100#”, :page => “400x320>”}, :storage => :s3, :s3_credentials => “#{RAILS_ROOT}/config/s3.yml”
end

  1. config/s3.yml
    bucket: (tutaj nazwa bucketu)
    access_key_id: (tutaj access key id)
    secret_access_key: (a tutaj oczywiscie secret access key)

W czym tkwi blad?

1 Like

Ponieważ sypie się find_credentials, sprawdziłbym klucze do wiadra (jakąś inną aplikacją najlepiej).

Dzieki za szybka odpowiedz! Klucze jednak sa w porzadku, wlasnie uzylem ich po raz kolejny do logowania za pomoca windowsowego S3 Backup.

Byc moze to jakis problem z kodowaniem albo klucze i nazwe bucketa trzeba zapisac w jakis konkretny sposob? Powinny byc w cudzyslowach albo pomiedzy jakimis znakami?

Spróbuj:

./script/console

i w konsoli wpisz:

YAML.load(File.open('config/s3.yml').read)

Ja dostaniesz syntax error to masz błąd w pliku yaml’a. A tego jaki błąd to Ci nie powiem, chyba że mi podeślesz ten plik :slight_smile:

Sprawdzilem s3.yml w konsoli jak doradziles i rzeczywiscie wykrylem, ze sa w tym pliku jakies bledy z kodem, mimo, ze w edytorze (windowsowy “e”) wszystko wygladalo dobrze. Otworzylem (dzialajacy) database.yml, wkleilem tekst z s3.yml i nadpisalem s3.yml. Pomoglo :slight_smile: Teraz w kazdym razie moge sobie otworzyc wyscaffoldowany index.html, ale przy probie dodania nowego Image’a wyskakuje mi taki blad:

AWS::S3::PermanentRedirect in ImagesController#create

The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.
RAILS_ROOT: C:/Users/Mariusz/Sites/wiw_development

Application Trace | Framework Trace | Full Trace
C:/Ruby/lib/ruby/gems/1.8/gems/aws-s3-0.6.2/lib/aws/s3/error.rb:38:in raise' C:/Ruby/lib/ruby/gems/1.8/gems/aws-s3-0.6.2/lib/aws/s3/base.rb:72:inrequest’
C:/Ruby/lib/ruby/gems/1.8/gems/aws-s3-0.6.2/lib/aws/s3/base.rb:88:in put' C:/Ruby/lib/ruby/gems/1.8/gems/aws-s3-0.6.2/lib/aws/s3/object.rb:241:instore’
C:/Users/Mariusz/Sites/wiw_development/vendor/plugins/paperclip/lib/paperclip/storage.rb:206:in flush_writes' C:/Users/Mariusz/Sites/wiw_development/vendor/plugins/paperclip/lib/paperclip/storage.rb:203:ineach’
C:/Users/Mariusz/Sites/wiw_development/vendor/plugins/paperclip/lib/paperclip/storage.rb:203:in flush_writes' C:/Users/Mariusz/Sites/wiw_development/vendor/plugins/paperclip/lib/paperclip/attachment.rb:144:insave’
C:/Users/Mariusz/Sites/wiw_development/vendor/plugins/paperclip/lib/paperclip.rb:338:in send' C:/Users/Mariusz/Sites/wiw_development/vendor/plugins/paperclip/lib/paperclip.rb:338:insave_attached_files’
C:/Users/Mariusz/Sites/wiw_development/vendor/plugins/paperclip/lib/paperclip.rb:331:in each_attachment' C:/Users/Mariusz/Sites/wiw_development/vendor/plugins/paperclip/lib/paperclip.rb:330:ineach’
C:/Users/Mariusz/Sites/wiw_development/vendor/plugins/paperclip/lib/paperclip.rb:330:in each_attachment' C:/Users/Mariusz/Sites/wiw_development/vendor/plugins/paperclip/lib/paperclip.rb:337:insave_attached_files’
C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/callbacks.rb:178:in send' C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/callbacks.rb:178:inevaluate_method’
C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/callbacks.rb:166:in call' C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/callbacks.rb:93:inrun’
C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/callbacks.rb:92:in each' C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/callbacks.rb:92:insend’
C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/callbacks.rb:92:in run' C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/callbacks.rb:276:inrun_callbacks’
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/callbacks.rb:344:in callback' C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/callbacks.rb:251:increate_or_update’
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2538:in save_without_validation' C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/validations.rb:1078:insave_without_dirty’
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/dirty.rb:79:in save_without_transactions' C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/transactions.rb:229:insend’
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/transactions.rb:229:in with_transaction_returning_status' C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract/database_statements.rb:136:intransaction’
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/transactions.rb:182:in transaction' C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/transactions.rb:228:inwith_transaction_returning_status’
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/transactions.rb:196:in save' C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/transactions.rb:208:inrollback_active_record_state!’
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/transactions.rb:196:in save' C:/Users/Mariusz/Sites/wiw_development/app/controllers/images_controller.rb:51:increate’
C:/Users/Mariusz/Sites/wiw_development/app/controllers/images_controller.rb:50:in `create’

Wyczytalem na stronach, ze paperclip ma jakis problem z laczeniem sie do europejskich bucketow, ja jednak swoj bucket utworzylem w USA, wiec nie za bardzo wiem co dalej… Jak sie powinno opisac sciezke do pliku? Wydawalo mi sie, ze paperclip zrobi to za mnie :confused:

Niestety AWS::S3 nigdy nie obsługiwał (i pewnie nigdy nie będzie obsługiwał) europejskich bucketów. Potrzebowaliśmy tego jakieś pół roku temu i skończyło się na tym, że napisaliśmy własny gem - s3. Problem jest tylko taki, że nikt nie chce włączyć obsługi gema s3 do attachment_fu ani do paperclipa, więc trzeba sobie samemu ze wszystkim radzić (backendy są w katalogu extras).

Rozumiem, z tymze moj bucket jest wlasnie na amerykanskim serwerze … i paperclip i tak wyrzuca mi ten blad :confused:

Problem rozwiazany! Najprawdopodobniej jest to problem zwiazany z uzyciem programu S3 Bucket. Moje wiadro na 100% bylo umieszczone na amerykanskim serwerze, bo nawet w bilingach na AWS byla odpowiednia informacja. Paperclip nie chcial jednak dzialac. Skasowalem ten bucket i zalozylem nowy przez http://www.s3fm.com. Smiga

Oczywiscie jednak jako poczatkujacy mam dodatkowe pytania :slight_smile: :

  1. Jakie sa plusy i minusy nazywania bucketu nazwa swojej domeny?
  2. Czy mozna tak ustawic bucket, abym dostep do obrazkow w nim umieszczonych mial tylko ja i moja aplikacja railsowa? Tzn. chce, zeby aplikacja pobierala te obrazki z bucketu prywatnie (z uzyciem secure access klucza), a nastepnie wyswietlala na publicznie dostepnej stronie. Nie chce jednak, aby kazdy mial dostep do tych obrazkow przy uzyciu http://mojbucket.s3.amazonaws.com/katalog/obrazek.jpg. Czy to mozliwe? (Gdy przez s3fm.com zabraniam dostepu do READa dla wszystkich userow, a pozostawiam ta mozliwosc autoryzowanym userom to moja aplikacja i tak nie widzi obrazkow z s3)

Próbuje wrzucać i wyświetlać obrazki za pomocą gemu s3 qooby na europejski bucket. O ile upload przebiega ok, to mam problemy z wyświetleniem obrazka, ponieważ Paperclip uparcie chce wyświetlać z lokacji http://s3.amazonaws.com/moj.bucket.costam/images a obrazki są wrzucane na http://s3-eu-west-1.amazonaws.com/moj.bucket.costam/images/… Czy powinienen coś ustawić w opcjach załącznika czy przy wywoływaniu metody generującej tag img ? Próbowałem różnych kombinacji z :s3_host_alias narazie bez skutku.
Aha gem zaintalowany normalnie przez sudo gem install, plik s3_paperclip.rb wrzucony do config/initializers

próbowałem czegos takiego, niestety czyta ale nei zapisuje tym razem

:storage => :s3, :s3_domain_url => "s3-eu-west-1.amazonaws.com", :url => ":s3_domain_url", :s3_credentials => "#{RAILS_ROOT}/config/s3.yml", :path => "/images/:id_partition/costam/:style.:extension"
rozumiem że domena gdzie jest mój bucket sie nie zmieni nigdy i mogę w ten sposób to podawać ?

inny problem, to gdy kasuje element do którego przypisany jest obrazek to dostaję błąd

[quote]S3::Error::ResponseError (S3::Error::ResponseError):
/usr/lib/ruby/gems/1.8/gems/s3-0.3.0/lib/s3/connection.rb:206:in handle_response' /usr/lib/ruby/gems/1.8/gems/s3-0.3.0/lib/s3/connection.rb:196:insend_request’
/usr/lib/ruby/gems/1.8/gems/s3-0.3.0/lib/s3/connection.rb:72:in request' /usr/lib/ruby/gems/1.8/gems/s3-0.3.0/lib/s3/service.rb:64:inservice_request’
/usr/lib/ruby/gems/1.8/gems/s3-0.3.0/lib/s3/bucket.rb:146:in bucket_request' /usr/lib/ruby/gems/1.8/gems/s3-0.3.0/lib/s3/object.rb:196:inobject_request’
/usr/lib/ruby/gems/1.8/gems/s3-0.3.0/lib/s3/object.rb:167:in object_headers' /usr/lib/ruby/gems/1.8/gems/s3-0.3.0/lib/s3/object.rb:49:inretrieve’
/usr/lib/ruby/gems/1.8/gems/s3-0.3.0/lib/s3/object.rb:57:in exists?' config/initializers/s3_paperclip.rb:82:inexists?’
paperclip (2.3.3) lib/paperclip/attachment.rb:311:in queue_existing_for_delete' paperclip (2.3.3) lib/paperclip/attachment.rb:310:inmap’
paperclip (2.3.3) lib/paperclip/attachment.rb:310:in queue_existing_for_delete' paperclip (2.3.3) lib/paperclip.rb:391:insend’
paperclip (2.3.3) lib/paperclip.rb:391:in destroy_attached_files' paperclip (2.3.3) lib/paperclip.rb:377:ineach_attachment’
paperclip (2.3.3) lib/paperclip.rb:376:in each' paperclip (2.3.3) lib/paperclip.rb:376:ineach_attachment’
paperclip (2.3.3) lib/paperclip.rb:390:in destroy_attached_files' app/controllers/my_costam_controller.rb:73:indestroy’[/quote]

działa, w path na początku nie powinno być /