2013-10-11 148 views
3

我想讓Carrierwave與我的Amazon S3存儲桶一起工作,但我對我的運氣有點失望。在我的config/initializers文件夾中,我有一個名爲carrierwave.rb的文件。該文件包含以下內容:Carrierwave,霧,亞馬遜S3,Rails 4

CarrierWave.configure do |config| 
    config.fog_credentials = { 
     :provider    => 'AWS', 
     :aws_access_key_id  => ENV['AWS_ACCESS_KEY_ID'], 
     :aws_secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'] 
    } 
    config.cache_dir = "#{Rails.root}/tmp/uploads" 
    config.fog_directory = ENV['AWS_S3_BUCKET'] 
    config.fog_public  = true 
    config.fog_attributes = {'Cache-Control' => 'max-age=315576000'} 
end 

我現在用的寶石​​作爲住房我的環境配置變量的機制。在application.yml內部,我定義了ENV['AWS_ACCESS_KEY_ID'],ENV['AWS_SECRET_ACCESS_KEY']ENV['AWS_S3_BUCKET']

這三個變量似乎正確填充。使用FTP程序,我可以使用我在application.yml文件中定義的訪問密鑰和祕密訪問密鑰連接到我的amazon s3實例。我有三重檢查,我的公衆祕密鍵是正確的。

當試圖在我的Rails應用程序執行上傳,我收到一個錯誤,指出:

Expected(200) <=> Actual(403 Forbidden) response => #<Excon::Response:0x007fb29a862ac8 
@data={:body=>"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error>< 
Code>SignatureDoesNotMatch</Code> 
<Message>The request signature we calculated does not match the signature you provided. 
Check your key and signing method.</Message> 

爲了解決這個問題,我也試過:

  1. 創建一個新的Amazon S3存儲桶
  2. 手動將access_key_id/secret_access_key/fog_directory放置在配置文件中。

這兩個選項都不起作用。當我創建一個新的S3存儲桶並在config.fog_directory中指定它時,我收到了同樣的錯誤。

當我在carrierwave.rb文件中手動輸入密鑰和存儲桶名稱時,仍然收到相同的錯誤。

我試着在網上搜索一下答案,但大部分答案似乎是用戶錯誤地輸入了錯誤的訪問密鑰或密鑰。我不認爲這是這種情況,因爲我已將密鑰直接複製並粘貼到Amazon S3管理控制檯中的carrierwave.rb文件中。

如果任何人有任何你想我嘗試的洞察力或事情,請隨時留下評論。如果您需要更多信息,請告訴我,我會在這裏發佈。我的應用程序是Rails 4應用程序,具有以下寶石:

gem 'carrierwave' 
gem 'fog', github: 'fog/fog' 
gem 'mini_magick' 
gem 'figaro' 

在此先感謝!

編輯:一對夫婦補充的:

我剛纔試圖創建一個新的密鑰組,並再次複製粘貼+鍵進入我carrierwave.rb文件。我仍然收到相同的錯誤。我的文件現在內容如下:

CarrierWave.configure do |config| 
    config.fog_credentials = { 
     :provider    => 'AWS', 
     :aws_access_key_id  => "***********", 
     :aws_secret_access_key => "***********" 
    } 

    config.cache_dir = "#{Rails.root}/tmp/uploads" 
    config.fog_directory = 'soawsthree' 
    config.fog_public  = true 
    config.fog_attributes = {'Cache-Control' => 'max-age=315576000'} 
end 

- 從S3鬥

響應。注 - 下面列出的公共訪問密鑰是正確的。不知道祕密訪問密鑰在哪裏傳入?:

Expected(200) <=> Actual(403 Forbidden) response => #<Excon::Response:0x007fc6e3997008 @data={:body=>"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><StringToSignBytes>50 55 54 0a 0a 69 6d 61 67 65 2f 70 6e 67 0a 46 72 69 2c 20 31 31 20 4f 63 74 20 32 30 31 33 20 30 34 3a 31 30 3a 34 31 20 2b 30 30 30 30 0a 78 2d 61 6d 7a 2d 61 63 6c 3a 70 75 62 6c 69 63 2d 72 65 61 64 0a 2f 75 70 6c 6f 61 64 73 2f 70 68 6f 74 6f 2f 70 69 63 2f 33 2f 74 6f 75 63 68 2e 70 6e 67</StringToSignBytes><RequestId>22E53DA9E453D05E</RequestId><HostId>ccNccOFV+iJa3/BM9RiwAqEwmJhr1KIMvmFm0EjhrBGkN4hwMWOuRF7qH5diDYd3</HostId><SignatureProvided>hiogXz0b65S/bOSWKvca7hyXzYI=</SignatureProvided><StringToSign>PUT\n\nimage/png\nFri, 11 Oct 2013 04:10:41 +0000\nx-amz-acl:public-read\n/uploads/photo/pic/3/touch.png</StringToSign><AWSAccessKeyId>AKIAIKNIDTDI2WI7RPNA</AWSAccessKeyId></Error>", :headers=>{"x-amz-request-id"=>"22E53DA9E453D05E", "x-amz-id-2"=>"ccNccOFV+iJa3/BM9RiwAqEwmJhr1KIMvmFm0EjhrBGkN4hwMWOuRF7qH5diDYd3", "Content-Type"=>"application/xml", "Transfer-Encoding"=>"chunked", "Date"=>"Fri, 11 Oct 2013 04:10:34 GMT", "nnCoection"=>"close", "Server"=>"AmazonS3"}, :status=>403, :remote_ip=>"72.21.195.65"}, @body="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><StringToSignBytes>50 55 54 0a 0a 69 6d 61 67 65 2f 70 6e 67 0a 46 72 69 2c 20 31 31 20 4f 63 74 20 32 30 31 33 20 30 34 3a 31 30 3a 34 31 20 2b 30 30 30 30 0a 78 2d 61 6d 7a 2d 61 63 6c 3a 70 75 62 6c 69 63 2d 72 65 61 64 0a 2f 75 70 6c 6f 61 64 73 2f 70 68 6f 74 6f 2f 70 69 63 2f 33 2f 74 6f 75 63 68 2e 70 6e 67</StringToSignBytes><RequestId>22E53DA9E453D05E</RequestId><HostId>ccNccOFV+iJa3/BM9RiwAqEwmJhr1KIMvmFm0EjhrBGkN4hwMWOuRF7qH5diDYd3</HostId><SignatureProvided>hiogXz0b65S/bOSWKvca7hyXzYI=</SignatureProvided><StringToSign>PUT\n\nimage/png\nFri, 11 Oct 2013 04:10:41 +0000\nx-amz-acl:public-read\n/uploads/photo/pic/3/touch.png</StringToSign><AWSAccessKeyId>AKIAIKNIDTDI2WI7RPNA</AWSAccessKeyId></Error>", @headers={"x-amz-request-id"=>"22E53DA9E453D05E", "x-amz-id-2"=>"ccNccOFV+iJa3/BM9RiwAqEwmJhr1KIMvmFm0EjhrBGkN4hwMWOuRF7qH5diDYd3", "Content-Type"=>"application/xml", "Transfer-Encoding"=>"chunked", "Date"=>"Fri, 11 Oct 2013 04:10:34 GMT", "nnCoection"=>"close", "Server"=>"AmazonS3"}, @status=403, @remote_ip="72.21.195.65"> 
+0

有沒有多餘的空間?或者也許是關鍵的URL編碼問題?奇怪的東西可能會起作用。 – Vidya

+0

嘿,謝謝你的回覆。我剛剛嘗試使用訪問密鑰和祕密訪問密鑰(從亞馬遜直接複製和粘貼)。仍然沒有這樣的運氣:-(.. –

+0

此外,我應該注意到,我每次進行配置更改時重新啓動我的本地主機服務器,只是爲了確保我開始乾淨。 –

回答

6

看起來好像Fog使用'excon'來連接S3存儲桶。我通過去除霧和外部0.27.2來解決我的問題。我切換到carrierwave-aws寶石(使用相同的憑據,並且一切都按預期工作)。

+0

好工作讓心臟的物。 – Vidya