2013-05-21 138 views
1

我試圖在我的Rails應用程序使用Carrierwave與Amazon S3,我不斷收到錯誤Carrierwave上傳與Amazon S3 - 403 Forbidden錯誤

"Excon::Errors::Forbidden (Expected(200) <=> Actual(403 Forbidden)." 
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method. 

我也收到警告

"[WARNING] fog: the specified s3 bucket name() is not a valid dns name, which will negatively impact performance. For details see: http://docs.amazonwebservices.com/AmazonS3/latest/dev/BucketRestrictions.html" 

配置/初始化/ carrierwave.rb:

CarrierWave.configure do |config| 
    config.fog_credentials = { 
    provider: 'AWS',      
    aws_access_key_id: ENV["AWS_ACCESS_KEY_ID"], 
    aws_secret_access_key: ENV["AWS_ACCESS_KEY"] 
    } 
    config.fog_directory = ENV["AWS_BUCKET"]     
end 

我的存儲桶名稱是「buildinprogress」

我再次檢查了我的存取密鑰ID和訪問密鑰是正確的。

我該如何解決這個錯誤?

+0

我發現如果我硬編碼carrierewave.rb文件中的存儲桶名稱,它可以工作,但是當我將桶名稱定義爲環境變量時,它不起作用。 – scientiffic

+0

那不可能;那麼你可能會弄亂一些ENV變量。在初始化文件中執行'puts ENV [「AWS_BUCKET」]。inspect'並檢查是否打印了正確的桶名稱... – severin

回答

4

這是Fog/Excom的一個問題,爲我也不斷拋出隨機錯誤。

我的修復是消除寶石「霧」寶石「carrierwave-AWS」,而不是取代它。

然後,在你* _uploader.rb變化

storage :fog ---> storage :aws 

和更新carrierwave.rb文件例:

CarrierWave.configure do |config| 
    config.storage = :aws     # required 
    config.aws_bucket = ENV['S3_BUCKET']  # required 
    config.aws_acl = :public_read 

    config.aws_credentials = { 
     access_key_id:  ENV['S3_KEY'],  # required 
     secret_access_key: ENV['S3_SECRET']  # required 
    } 

    config.aws_attributes = { 
           'Cache-Control'=>"max-age=#{365.day.to_i}", 
           'Expires'=>'Tue, 29 Dec 2015 23:23:23 GMT' 
          } 
    end 

欲瞭解更多信息請查看carrierwave-aws GitHub的頁面