2010-06-11 75 views
4

我有一個在Heroku上運行的rails應用程序。我使用回形針對於一些簡單的圖片上傳用戶頭像和一些其他的東西,我有S3設置爲我的後端,一切似乎是工作的罰款試圖推到S3我收到以下錯誤時除外:回形針和Amazon S3問題

The AWS Access Key Id you provided does not exist in our records. 

思考我錯誤地粘貼了我的訪問密鑰和密鑰,我再次嘗試,仍然沒有運氣。思考也許它只是一個錯誤的關鍵我停用它,併產生一個新的。仍然沒有運氣。

現在對於這兩個鍵我已經使用OS X上的S3瀏覽器應用程序,並且能夠連接到每個鍵,並查看我當前的存儲桶和添加/刪除存儲桶。有什麼我應該尋找的?我有我的應用程序的S3和回形針設置像這樣

development: 
    bucket: (unique name) 
    access_key_id: ENV['S3_KEY'] 
    secret_access_key: ENV['S3_SECRET'] 

test: 
    bucket: (unique name) 
    access_key_id: ENV['S3_KEY'] 
    secret_access_key: ENV['S3_SECRET'] 

production: 
    bucket: (unique_name) 
    access_key_id: ENV['S3_KEY'] 
    secret_access_key: ENV['S3_SECRET'] 

has_attached_file :cover, 
    :styles => { 
     :thumb => "50x50" 
    }, 
    :storage => :s3, 
    :s3_credentials => "#{RAILS_ROOT}/config/s3.yml", 
    :path => ":class/:id/:style/:filename" 

編輯注:ENV [「S3_KEY」]和ENV [「S3_SECRET」]在Heroku的環境變量,我已經直接和它用我的鑰匙試着連仍然不起作用

注意:我只是添加了(唯一名稱)位,那些實際上並不存在 - 我也驗證了存儲桶名稱,但我甚至不認爲這會得到那麼多。我也有我的heroku環境變量安裝正確,並讓他們安裝在dev

回答

3

您沒有設置存儲桶。它在你的s3.yml文件中,但是你沒有讀到你撥打has_attached_file的值。

回形針S3文檔: http://rubydoc.info/gems/paperclip/Paperclip/Storage/S3#s3_protocol-instance_method

此外,要注意那些誰告訴你不要使用s3.yml文件,對Heroku的人。這是一種浪費,只是增加了一無所獲的抽象。您已經使用所需的值設置了ENV,請使用它們。

我已經完成了這個之前我不想將一個s3.yml文件推送到Heroku,但我確實想用它來進行測試和開發。在初始化,你可以做這樣的事情:

# If an s3.yml file exists, use the key, secret key, and bucket values from there. 
# Otherwise, pull them from the environment. 
if File.exists?("#{Rails.root}/config/s3.yml") 
    s3_config = YAML.load_file("#{Rails.root}/config/s3.yml") 
    S3[:key] = s3_config[Rails.env]['key'] 
    S3[:secret] = s3_config[Rails.env]['secret'] 
    S3[:bucket] = s3_config[Rails.env]['bucket'] 
else 
    S3[:key] = ENV['S3_KEY'] 
    S3[:secret] = ENV['S3_SECRET'] 
    S3[:bucket] = ENV['S3_BUCKET'] 
end 

然後,當你在你的模型設置回形針,你參考值是這樣的:

... 
:s3_credentials => { 
    :access_key_id => S3[:key], 
    :secret_access_key => S3[:secret] 
}, 
:bucket => S3[:bucket] 

顯然,這意味着你做不想在你的git倉庫中擁有你的s3.yml文件(真的,你不應該)。

+0

儘管如此,請檢查原始帖子中的錯誤。它表明access_key_id甚至沒有被接受,所以桶不會在場。 – x1a4 2010-06-11 02:04:11

+0

它沒有任何意義,但內聯我的訪問鍵(即使他們是環境變量)工作......我不知道爲什麼,我遵循Heroku的建議T,但這最終工作,謝謝! – Jimmy 2010-06-11 03:19:14

+0

難道你不能只添加s3.yml到你的git忽略列表,所以它不會顯示在Heroku上? – Kevin 2010-06-11 15:22:03

1

您的S3 yaml文件實際上使用字符串ENV['S3_KEY']ENV['S3_SECRET']作爲s3的身份驗證信息。他們沒有被評估爲紅寶石代碼。

至少有幾件事情可以在將實際信息放入yaml文件之外完成。你可以使用look into enabling ERB in your yaml configs或者根本就不使用yaml文件,因爲你總是從每個rails_envs的環境中拉出來,所以yaml文件在你的情況下只是一個額外的間接層,沒有用處。

+0

+1這是另一個有用的鏈接,從Heroku的博客 - http://blog.heroku.com/archives/2009/4/7/config-vars/ – Anurag 2010-06-11 00:49:45

+0

這就是我正在做的 – Jimmy 2010-06-11 00:52:29

+0

@Jimmy這不是你正在做。您將ENV文件放在yaml文件中,其中*不會被視爲Ruby代碼*。 Heroku博客文章中的示例將ENV評估放入類本身,當然這也很好,並且不需要在s3.yml文件中分別爲每個環境聲明它。 – x1a4 2010-06-11 01:11:41

3

我一直得到相同的AWS::S3::InvalidAccessKeyId錯誤,並有一個非常類似的s3.yml文件。正如x1a4推薦的,我在我的yaml文件中使用了ERB,並且它工作正常。下面是它看起來像現在:

# myapp/config/s3.yml 

development: &DEFAULTS 
    bucket: myapp_dev 
    access_key_id: <%= ENV['S3_KEY'] %> 
    secret_access_key: <%= ENV['S3_SECRET'] %> 

test: 
    <<: *DEFAULTS 
    bucket: myapp_test 

production: 
    <<: *DEFAULTS 
    bucket: myapp 

staging: 
    <<: *DEFAULTS 
    bucket: myapp_staging 

我想這可能會一點點太間接了一些人,但它似乎是最乾淨的實施給我。

+0

你是我的完整英雄! – altuzar 2016-01-29 22:20:28