Speicher von Amazon S3 Anmeldeinformationen in Bashrc Umgebungsvariablen verursacht Rails-Anwendung zum Scheitern verurteilt

StackOverflow https://stackoverflow.com/questions/2260957

Frage

Ich entwickle ein Schienen-app, dass Anwendungen zum Speichern von Sachen auf Amazon S3 Büroklammer. Die App ist auf Heroku gehostet. Ich entwickle auf Ubuntu Karmic.

Das Problem, dass ich etwa tritt in der Entwicklung zu beschreiben (auf meinem localhost) und Produktion (auf Heroku).


Der üblicher Weg der Weitergabe S3 creds zu Büroklammer ist, indem sie in config / s3.yml setzen wie folgt:

access_key_id: 12345678
secret_access_key: 903490409fdf09fshsfdoif/43432

Wenn ich das tue, funktioniert alles einwandfrei. Aber das macht es schwierig, meinen Code mit anderen zu teilen, so Heroku eine alternative Methode vorschlagen - http: // docs. heroku.com/config-vars .

Sie darauf hinweisen, dass Sie Ihre S3_KEY und S3_SECRET in Ihre .bashrc wie so setzen sollte:

S3_KEY=12345678
export S3_KEY
S3_SECRET=903490409fdf09fshsfdoif/43432
export S3_SECRET

Sie schlagen vor, dann, dass Sie erstellen config / initializers / s3.yml (beachten Sie den etwas anderen Weg) und setzen Sie die folgenden in dieser Datei:

AWS::S3::Base.establish_connection!(
  :access_key_id     => ENV['S3_KEY'],
  :secret_access_key => ENV['S3_SECRET']
)

Aber wenn ich das tue, Büroklammer wirft ein Wobbler und spuckt die folgende Fehlermeldung:

undefined method `stringify_keys' for #<String:0xb6d6c3f4>

/vendor/plugins/paperclip/lib/paperclip/storage.rb:176:in `parse_credentials'
/vendor/plugins/paperclip/lib/paperclip/storage.rb:138:in `extended'
/vendor/plugins/paperclip/lib/paperclip/storage.rb:137:in `instance_eval'
/vendor/plugins/paperclip/lib/paperclip/storage.rb:137:in `extended'

.... other stuff 

So klar es ist alles im Inneren des storage.rb Modul Auftakt. Stepping durch den Stack-Trace:

Die parse_credentials Methode auf der Linie 176 ist markiert - hier ist der Anruf, wie es im Code erscheint:

def parse_credentials creds
  creds = find_credentials(creds).stringify_keys
  (creds[RAILS_ENV] || creds).symbolize_keys
end

Die parse_credentials Methode versucht eine andere Methode, find_credentials zu nennen, und das ist, wo ich das Problem liegt glauben. Heres der Code für find_credentials:

def find_credentials creds
    case creds
    when File
      YAML::load(ERB.new(File.read(creds.path)).result)
    when String
      YAML::load(ERB.new(File.read(creds)).result)
    when Hash
      creds
    else
      raise ArgumentError, "Credentials are not a path, file, or hash."
    end
end

Ich kann nicht sehen, wie die find_credentials Methode ausgestattet Werte von meiner .bashrc-Datei zu lesen. Es ist zwei Fällen kam, wo es von YAML lesen kann und eine, wo es für einen Hash suchen.

Meine Modellreferenzen der Anmeldeinformationen wie folgt:

  has_attached_file :photo,
                (some code removed)
                :s3_credentials => "#{RAILS_ROOT}/config/initializers/s3.yml",

Wenn ich das entfernen: s3_credentials Hash aus dem Modell, der stringify_keys Fehler weggeht und die Schienen-Konsole die Fehlermeldung führt, dass erscheint am Ende der find_credentials Methode: das heißt „Credentials ist kein Weg, eine Datei oder hash“ .

So stapfte ich bin. Ich weiß, dass dies für die Jungs bei Heroku möglicherweise eine Frage ist (wer ich eigentlich diesen Link an, in der Hoffnung auf eine E-Mail werde, dass sie es beantworten kann) und es ist möglicherweise auch eine Frage für die doods bei thoughtbot.

Wie gesagt ich am Anfang, meine app funktioniert gut, wenn ich den Standardansatz nehme meinen Schlüssel und Geheimnis des Klebens in config / s3.yml, aber ich würde es vorziehen, um die Methode zu verwenden, dass Heroku vorschlagen, weil es Dinge WAY erleichtert für mich und es bedeutet, dass ich meine Repo auf meiner öffentlichen github Seite für andere Verwendung speichern kann, ohne dass Kunden merge Treiber in Git schreiben meine api Schlüssel aus dem öffentlichen Bereich zu halten.

Ich habe versucht, kleben die ENV Variablen in etc / bash.bashrc sowie ~ / .bashrc und nach dem Neustart habe ich immer noch das gleiche Problem haben. Die Probleme treten auf Entwicklungsmaschine sowie auf Heroku. Ich habe dafür gesorgt, wie auch meine config-VARs Heroku zu schieben.

War es hilfreich?

Lösung

Nach langem Suchen fand ich die Antwort hier - http: / /tammersaleh.com/posts/managing-heroku-environment-variables-for-local-development

Der Trick besteht darin, die Datei S3.rb ganz zu entfernen und nur auf die ENV Variablen im Modell beziehen sich wie folgt:

has_attached_file :photo, 
                  #...
                  :storage        => :s3, 
                  :bucket         => ENV['S3_BUCKET'],
                  :s3_credentials => { :access_key_id     => ENV['S3_KEY'], 
                                       :secret_access_key => ENV['S3_SECRET'] }

Wie auch immer, David, vielen Dank für Ihren Vorschlag. Ich weiß nicht, ob Sie die Heroku docs aktualisieren möchte zu sagen, dass einige Nutzer es auf diese Weise zu tun gehabt haben. Nochmals vielen Dank though.

Andere Tipps

Benennen Sie die Datei config/initializers/s3.yml zu config/initializers/s3.rb und probieren Sie es aus.

Hier ist Ihr Problem:

:bucket         => ENV['S3_BUCKET'],

Bedürfnisse sein

:bucket         => <%= ENV['S3_BUCKET'] %>,

d. die Zuweisungen werden nicht interpretiert werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top