El almacenamiento de credenciales de Amazon S3 en .bashrc variables ambientales provoca rieles aplicación a fallar

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

Pregunta

Estoy desarrollando una aplicación que utiliza los carriles clip para almacenar cosas en Amazon S3. La aplicación se encuentra alojado en Heroku. Estoy desarrollando en Ubuntu Karmic.

El problema que estoy a punto de describir se produce en el desarrollo (en mi localhost) y la producción (en Heroku).


La forma estándar de pasar creds S3 a paperclip es poniéndolos en config / s3.yml este modo:

access_key_id: 12345678
secret_access_key: 903490409fdf09fshsfdoif/43432

Cuando hago esto, todo funciona muy bien. Pero esto hace que sea difícil compartir el código con los demás para Heroku sugerir un método alternativo - http: // docs. heroku.com/config-vars .

Ellos aconsejan que usted debe poner su S3_KEY y S3_SECRET en su .bashrc este modo:

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

A continuación, sugieren que se crea config / inicializadores / s3.yml (nótese la ruta ligeramente diferente) y poner el siguiente en el archivo:

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

Pero cuando hago esto, clip tiros un wobbler y escupe el siguiente mensaje de error:

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 

Así que está claro que todo está iniciando el interior del módulo storage.rb. Pasando a través de la traza de la pila:

El método parse_credentials en la línea 176 se encuentra en posición - aquí está la llamada tal como aparece en el código:

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

El método parse_credentials intenta llamar a otro método, find_credentials, y aquí es donde yo creo que el problema radica. Aquí está el código para 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

No puedo ver cómo está equipado el método find_credentials para leer los valores de mi archivo .bashrc. Tiene dos casos en los que se puede leer desde YAML y uno en el que está buscando un hash.

Mi modelo hace referencia a las credenciales de este modo:

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

Si quito el: s3_credentials hash a partir del modelo, el error stringify_keys desaparece y la consola rieles lanza el mensaje de error que aparece al final del método find_credentials: es decir, "Las credenciales no son un camino, un archivo o de hash" .

Así que estoy perplejo. Soy consciente de que esto es posiblemente una pregunta para los chicos de Heroku (que estoy realmente va a enviar por correo electrónico el enlace con la esperanza de que puedan responder a ella) y también, posiblemente, una pregunta para los doods en thoughtbot.

Como dije al principio, mi aplicación funciona bien cuando tomo el enfoque estándar de meter la clave y el secreto en config / s3.yml, pero yo preferiría usar el método que sugiere Heroku porque hace las cosas manera más fácil para mí y significa que puedo guardar mi repo en mi página de gitHub pública para que otros utilicen sin tener que escribir cualquier cliente fusionar los conductores en Git para mantener mis claves de la aPI de dominio público.

He intentado pegar las variables ENV en etc / bash.bashrc, así como ~ / .bashrc y después de reiniciar, todavía tengo el mismo problema. Los problemas se producen en la máquina de desarrollo, así como en Heroku. Me he asegurado de empujar mis config-vars a Heroku también.

¿Fue útil?

Solución

Después de mucho buscar encontré la respuesta aquí - http: / /tammersaleh.com/posts/managing-heroku-environment-variables-for-local-development

El truco es quitar el archivo S3.rb por completo y sólo se refieren a las variables ENV en el modelo de esta manera:

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

De todos modos, David, gracias por su sugerencia. No sé si se desea actualizar los documentos heroku decir que algunos usuarios han tenido que hacerlo de esta manera. Gracias de nuevo.

Otros consejos

Cambie el nombre del archivo a config/initializers/s3.yml config/initializers/s3.rb y darle una oportunidad.

Aquí está el problema:

:bucket         => ENV['S3_BUCKET'],

Es necesario que haya

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

es decir. las asignaciones no se están interpretando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top