2015-08-18 17 views
12

Ho un'applicazione che funziona già (in staging e prod) con S3.
Ora vogliamo che funzioni con il cloudfront.Rails 4 - uso cloudfront con Paperclip

ho capito che da qualche ragione ho definizioni graffetta in due luoghi:

/confog/initializers/paperclip.rb:

if Rails.env.production? || Rails.env.staging? || true 
    Paperclip::Attachment.default_options[:url] = ':s3_domain_url' 
    Paperclip::Attachment.default_options[:path] = '/:class/:attachment/:id_partition/:style/:filename' 
end 

/config/environments/staging.rb e /config/environments/production.rb

config.paperclip_defaults = { 
    :storage => :s3, 
    :s3_credentials => { 
    :bucket => s3_options[:bucket], 
    :access_key_id => s3_options[:access_key_id], 
    :secret_access_key => s3_options[:secret_access_key] 
    } 
} 

(I caricare s3_options da s3.yml lima che ho)

Prima domanda - è necessario (o al contrario - è sbagliato) per avere questi due posti con configurazione?

Con questa configurazione ottengo questo:

> Profile.last.image.url 
=> "https://mybucket.s3.amazonaws.com/profiles/images/000/000/001/original/someimage.jpg?1439912576" 

Il mio obiettivo: ottenere l'URL cloundfront invece di S3.

Ho provato diverse cose:

  1. Aggiungere a paperclip.rb questa linea:

    Paperclip::Attachment.default_options[:s3_host_alias] = "xxxxx.cloudfront.net" 
    

    (dove xxxxx stand per l'hash CloudFront).
    Risultato: non è cambiato nulla.

  2. Aggiungi al paperclip.rb questa linea:

    Paperclip::Attachment.default_options[:s3_host_name] = "xxxxx.cloudfront.net" 
    

    (dove xxxxx stand per l'hash CloudFront).
    Risultato: graffetta concatenare il nome secchio prima esso:

    > Profile.last.image.url 
    => "https://mybucket.xxxxx.cloudfront.net/profiles/images/000/000/001/original/someimage.jpg?1439912576" 
    
  3. configurazione Disattiva in paperclip.rb e aggiungere queste righe al file di configurazione dell'ambiente (ho provato su sviluppo.RB):

    config.paperclip_defaults = { 
         : 
        :s3_credentials => { 
        : 
        : 
        :url => "xxxxx.cloudfront.net", 
        :s3_host_name => "xxxxx.cloudfront.net", 
        :path => '/:class/:attachment/:id_partition/:style/:filename', 
        } 
    } 
    

    Risultato: graffetta concatenare il nome secchio dopo esso:

    > Profile.last.image.url 
    => "https://xxxxx.cloudfront.net/mybucket/profiles/images/000/000/001/original/someimage.jpg?1439912576" 
    
  4. As (3), ma aggiungere queste righe di un livello più alto:

    config.paperclip_defaults = { 
        :storage => :s3, 
        :url => "xxxxx.cloudfront.net", 
        :s3_host_name => "xxxxx.cloudfront.net", 
        :path => '/:class/:attachment/:id_partition/:style/:filename', 
        :s3_credentials => { 
        : 
        : 
        } 
    } 
    

    Risultato: Uguale a (3).

In breve, non importa quello che ho messo in :s3_host_name, graffetta concatenare il nome secchio in qualche luogo.

Qualche idea?

risposta

23

è stato più facile di quanto pensassi.
Sembra graffetta utilizza :url sia come stringa o come riferimento per un simbolo che indica come costruire l'url.

Nei miei /config/environments/staging.rb e /config/environments/production.rb file che ho adesso:

config.paperclip_defaults = { 
    :storage => :s3, 
    :url => ':s3_alias_url', 
    :s3_host_alias => "xxxxx.cloudfront.net", 
    :path => '/:class/:attachment/:id_partition/:style/:filename', 
    :s3_credentials => { 
     : 
     : 
    } 
} 
+1

Sei un vero toccasana. La tua configurazione ha funzionato perfettamente per il nostro aggiornamento CloudFront. –

+0

Qual è la differenza tra 'url' e' s3_host_alias'? – Jwan622

+0

Quindi usi 'bucket' più? – Jwan622

1

Ended utilizzando:

amazon = AppConfiguration.for :amazon 

    config.paperclip_defaults = { 
    storage: :s3, 
    url: ':s3_alias_url', 
    s3_host_alias: amazon.cloudfront, 
    path: '/:class/:attachment/:id_partition/:style/:filename', 
    s3_protocol: :https, 
    s3_credentials: { 
     bucket: amazon.s3_bucket_name, 
     access_key_id: amazon.aws_access_key_id, 
     secret_access_key: amazon.aws_secret_access_key 
    } 
    } 

Alternative a AppConfiguration

config.paperclip_defaults = { 
    storage: :s3, 
    url: ':s3_alias_url', 
    s3_host_alias: ENV['AMAZON_CLOUDFRONT'], 
    path: '/:class/:attachment/:id_partition/:style/:filename', 
    s3_protocol: :https, 
    s3_credentials: { 
    bucket: ENV['AMAZON_S3_BUCKET_NAME'], 
    access_key_id: ENV['AMAZON_AWS_ACCESS_KEY_ID'], 
    secret_access_key: ENV['AMAZON_AWS_SECRET_ACCESS_KEY'] 
    } 
} 

importante da dire, non utilizzare Rails.application.secrets qui. Non è disponibile quando i file di configurazione si caricano su binari 4.1.8 almeno