La memorizzazione delle credenziali Amazon S3 in .bashrc variabili ambientali provoca applicazione Rails a fallire

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

Domanda

Sto sviluppando un'applicazione rotaie che utilizza graffetta per memorizzare roba su Amazon S3. L'applicazione è ospitato su Heroku. Sto sviluppando su Ubuntu Karmic.

Il problema che sto per descrivere si verifica in fase di sviluppo (sul mio localhost) e la produzione (su Heroku).


Il metodo standard di passare creds S3 di graffetta è mettendoli in config / s3.yml in questo modo:

access_key_id: 12345678
secret_access_key: 903490409fdf09fshsfdoif/43432

Quando faccio questo, tutto funziona bene. Ma questo rende difficile condividere il mio codice con gli altri in modo Heroku suggeriscono un metodo alternativo - http: // docs. heroku.com/config-vars .

Si consigliano che si dovrebbe mettere il S3_KEY e S3_SECRET nel vostro .bashrc in questo modo:

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

Hanno poi suggeriscono di creare config / inizializzatori / s3.yml (nota del percorso leggermente diverso) e mettere il seguente in quel file:

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

Ma, quando faccio questo, graffetta getta un disco oscillante e sputa fuori il seguente messaggio di errore:

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 

Così chiaramente è tutto dando il via all'interno del modulo storage.rb. Facendo un passo attraverso l'analisi dello stack:

Il metodo parse_credentials sulla linea 176 viene valutato - ecco la chiamata come appare nel codice:

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

Il metodo parse_credentials tenta di chiamare un altro metodo, find_credentials, e questo è dove credo che il problema risiede. Ecco il codice per 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

Non riesco a vedere come il metodo find_credentials è in grado di leggere i valori dal mio file .bashrc. Essa ha avuto due casi in cui si può leggere da YAML e uno in cui è in cerca di un hash.

Il mio modello fa riferimento le credenziali in questo modo:

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

Se rimuovo il: s3_credentials hash dal modello, l'errore stringify_keys va via e la console rotaie tiri il messaggio di errore che appare alla fine del metodo find_credentials: vale a dire "credenziali non sono un percorso, un file o hash" .

Quindi sono perplesso. Mi rendo conto che questo è forse una domanda per i ragazzi di Heroku (chi sto in realtà sta per invia questo link nella speranza che possano rispondere) ed è anche, eventualmente, una domanda per i doods a thoughtbot.

Come ho detto all'inizio, la mia app funziona benissimo quando prendo l'approccio standard di attaccare la mia chiave e il segreto in config / s3.yml, ma io preferirei usare il metodo che Heroku suggeriscono perché rende le cose modo più semplice per me e questo significa che posso conservare il mio repo sulla mia pagina di GitHub pubblico per altri di utilizzare, senza dover scrivere ogni cliente unire piloti in Git per mantenere le mie chiavi API di dominio pubblico.

Ho provato attaccare le variabili ENV in etc / bash.bashrc così come ~ / .bashrc e dopo il riavvio, ho ancora lo stesso problema. I problemi si verificano sulla macchina di sviluppo e sulla Heroku. Ho fatto in modo di spingere i miei config-VAR di Heroku pure.

È stato utile?

Soluzione

Dopo molte ricerche ho trovato qui la risposta - http: / /tammersaleh.com/posts/managing-heroku-environment-variables-for-local-development

Il trucco è quello di rimuovere il file del tutto il S3.rb e solo fare riferimento alle variabili ENV nel modello in questo modo:

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

In ogni caso, David, grazie per il suggerimento. Non so se si desidera aggiornare i documenti Heroku dire che alcuni utenti hanno dovuto fare in questo modo. Grazie ancora però.

Altri suggerimenti

Rinominare il file config/initializers/s3.yml per config/initializers/s3.rb e fare un tentativo.

Ecco il problema:

:bucket         => ENV['S3_BUCKET'],

deve essere

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

vale a dire. le assegnazioni non vengono interpretati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top