How to get a access url for an object in S3's private bucket using carrierwave

Viewed 1741

I am uploading my file to s3's private bucket using carrierwave whose policy is 'Bucket and Object are not public'.

Now when I try to generate an access url with @docuemnt.pdf_file.url for my object in that private bucket I am getting an error which says " bucket_name is required " even after passing bucketname as @docuemnt.pdf_file.url 'privatebucketname' I get an error which says " ArgumentError: Version privatebucketname doesn't exist! ".

How am i supposed to get url to access private bucket object from within my rails app using carrier-wave.

My uploader code is as follows:

class SecureUploader < CarrierWave::Uploader::Base

  include CarrierWave::MiniMagick


  storage :fog

  def fog_directory
    ENV['AWS_SECURED_BUCKET']
  end

  def fog_public
    false
  end

  def fog_authenticated_url_expiration
    1.minutes # in seconds from now,  (default is 10.minutes)
  end
end

My carrierwave config is as follows:

CarrierWave.configure do |config|
  config.fog_credentials = {
    provider:               'AWS',
    aws_access_key_id:      ENV['AWS_KEY'],
    aws_secret_access_key:  ENV['AWS_SECRET'],
    region:                 ENV['AWS_REGION']
  }

  # For testing, upload files to local `tmp` folder.
  if Rails.env.test? || Rails.env.cucumber?
    config.storage           = :file
    config.enable_processing = false
    config.root              = "#{Rails.root}/tmp"
  else
    config.storage = :fog
  end

  config.cache_dir        = "#{Rails.root}/tmp/uploads" # To let CarrierWave work on Heroku
  config.fog_directory    = ENV['AWS_BUCKET']
end
1 Answers

I normally have an initializer carrierwave.rb and keep config there.

CarrierWave.configure do |config|
  if Rails.env.production?
    config.fog_provider = 'fog/aws'
    config.enable_processing = true
    config.fog_directory = Rails.application.credentials.aws[:bucket]
    config.fog_public = false # optional, defaults to true
    config.fog_attributes = { "Cache-Control" => "max-age=315576000" }

    config.fog_credentials = {
      provider: "AWS",
      aws_access_key_id: Rails.application.credentials.aws[:access_key_id]
      aws_secret_access_key: Rails.application.credentials.aws[:secret_access_key]
      region: Rails.application.credentials.aws[:region]
    }
    config.storage = :fog
  else
    config.enable_processing = false
    config.storage = :file
  end
end
Related