randika
randika

Reputation: 1539

Carrierwave+fog+s3 not working with Cloud Front URLs

I'm having this problem with carrierwave+fog+s3 with Amazon cloud front. With the following setup I can upload files to s3 but after uploaded, the S3 Objects URLs I get from my rails app doesn't have the assets_host based URLs i.e I'm expeting the URLs to be looks like this format https://mycloudfrontname.cloudfront.net/uploads/myfile.mp3

But they all appear in this format https://mybucketname.s3.amazonaws.com/uploads/myfile.mp3

What might be wrong here?

CarrierWave.configure do |config|
  config.fog_credentials = {
    :provider               => 'AWS',
    :aws_access_key_id      => 'XXXX',
    :aws_secret_access_key  => 'XXXX',
    :region                 => 'us-east-1'
  }
  config.fog_directory  = 'mybucketname'
  config.asset_host     = 'https://mycloudfrontname.cloudfront.net'
  config.fog_public     = false
  config.fog_attributes = {'Cache-Control' => 'max-age=315576000'}
end

UPDATE:

I found this code bit from Carrierwave's /lib/carrierwave/storage/fog.rb - So if we set the asset_host as on above code snippet this must work right? or is there any other configuration I must do as well?

def public_url
          if host = @uploader.asset_host
            if host.respond_to? :call
              "#{host.call(self)}/#{path}"
            else
              "#{host}/#{path}"
            end
          else
            # AWS/Google optimized for speed over correctness
            case @uploader.fog_credentials[:provider]
            when 'AWS'
              # if directory is a valid subdomain, use that style for access
              if @uploader.fog_directory.to_s =~ /^(?:[a-z]|\d(?!\d{0,2}(?:\d{1,3}){3}$))(?:[a-z0-9\.]|(?![\-])|\-(?![\.])){1,61}[a-z0-9]$/
                "https://#{@uploader.fog_directory}.s3.amazonaws.com/#{path}"
              else
                # directory is not a valid subdomain, so use path style for access
                "https://s3.amazonaws.com/#{@uploader.fog_directory}/#{path}"
              end
            when 'Google'
              "https://commondatastorage.googleapis.com/#{@uploader.fog_directory}/#{path}"
            else
              # avoid a get by just using local reference
              directory.files.new(:key => path).public_url
            end
          end
        end

Upvotes: 4

Views: 2608

Answers (3)

NoDisplayName
NoDisplayName

Reputation: 15736

Change config.fog_public to true and add config.asset_host = 'YOUR_CND_ADDRESS'. The asset_host doesn't work when fog_public is false

Upvotes: 2

jfeust
jfeust

Reputation: 845

Don't use asset_host. The asset_host setting is for files served by the rails asset helpers. CarrierWave files are handled in a different manner. The config you are looking for is config.fog_host

config.fog_host = 'https://mycloudfrontname.cloudfront.net'

Upvotes: 0

Paul Pettengill
Paul Pettengill

Reputation: 4855

In your environment file you need to set the asset host. Just add the line below to your config/environments/production.rb file, and you should be okay. Also may want to make sure you're using the latest version of carrierwave and fog gems.

-- config/environments/production.rb

Myapp::Application.configure do

  # Use Content Delivery Network for assets
  config.action_controller.asset_host = 'https://mycloudfrontname.cloudfront.net'

end

Upvotes: 0

Related Questions