2012-12-03 86 views
0

從heroku上的應用程序上傳文件到s3時,我得到看似隨機的erorrs。我正在使用jquery-file-upload將圖片上傳到我的桶中的tmp /目錄,使用CORS方法和此代碼。Intermittent Carrierwave S3 403簽名不匹配錯誤

def url 
    temp_url = AWS::S3::S3Object.url_for(
     s3_key, 
     S3_CONFIG['bucket'], 
     use_ssl: true) 
    puts temp_url 
    temp_url 
    # temp_url.to_s.encode_signs 
    end 

    def delete_photo_from_s3 
    begin 
     photo = AWS::S3::S3Object.find(s3_key, S3_CONFIG['bucket']) 
     photo.delete 
    rescue Exception => e 
     Rails.logger.error e.message 
    end 
    end 

    private 

    def s3_key 
    parent_url = self[:uri] 
    # If the url is nil, there's no need to look in the bucket for it 
    return nil if parent_url.nil? 
    # This will give you the last part of the URL, the 'key' params you need 
    # but it's URL encoded, so you'll need to decode it 
    object_key = parent_url.split(/\//) 
    "#{object_key[3]}/#{object_key[4]}/#{object_key[5]}" 
    end 

從那裏我使用carrierwave上傳和處理這些圖像。但是,有時上傳會失敗,我的s3存儲桶中出現403 Forbidden錯誤。不知道是什麼原因造成的。

從那裏,我使用Qu處理後臺作業,使用remote__url調用將圖像附加到carrierwave。這是我的後臺任務:

class PhotoUploader 
    def self.perform(finding_id, photo_id) 
    begin 
     finding = Finding.find(finding_id) 
     photo = Photo.find(photo_id) 
     upload = finding.uploads.build 
     # attached_picture = photo.temp_image_url || photo.url 
     upload.remote_attachment_url = photo.url 
     if upload.save! 
     Rails.logger.debug "#{Time.now}: Photo #{photo_id} saved to finding..." 
     photo.set(:delete_at => 1.hour.from_now) # UTC, same as GMT (Not local time!) 
     photos = Photo.where(:processing => true, :delete_at.lte => Time.now.utc) # Query for UTC time, same type as previous line (also not local time!) 
     finding.unset(:temp_image) 
     if photos 
      photos.each do |photo| 
      photo.destroy 
      Rails.logger.debug "Photo #{photo.id} - #{photo.uri} destroyed." 
      end 
     end 
     else 
     raise "Could not save to s3!" 
     end 
    rescue Exception => e 
     Rails.logger.debug "#{Time.now}: PH01 - Error processing photo #{photo_id}, trying again... :: #{e.message}" 
     retry 
    end 
    end 
end 

這有時候,但並不總是,這真的很奇怪。 我最終得到了一堆這樣的錯誤在我的S3日誌:

fc96aee492e463ff67c0a9835c23c81a09c4c36a53cdf297094ded3a7d02c62f actionlog發展[02/DEC/2012:20:27:18 +0000] 71.205.197.214 - 625CEFB5DB7867A7 REST.GET.OBJECT TMP/4f75d2fb4e484f2ffd000001/apcm_photomix1_0022.jpg 「GET /actionlog-development/tmp/4f75d2fb4e484f2ffd000001/apcm_photomix1_0022.jpg?AWSAccessKeyId=AKIAI_ _ _ZA6A &過期= 1354480332 &簽名= 4wPc + nT84WEdOuxS6 + Ry4iMNkys = HTTP/1.1」 403 SignatureDoesNotMatch 895 - 8 - 「 - 」「Ruby」 -

我已經閱讀了很多關於這方面的內容,看起來人們有時會在簽名中出現非轉義'+'的時候出現這個問題。我不確定這是Carrierwave,Fog還是AWS :: S3問題。

如果您可以提供任何援助,這將不勝感激。

謝謝。

+0

得到了同樣的問題。你有沒有找到解決辦法? – damienbrz

+0

我找到了解決方法。首先,確保你的服務器的系統時間準確無誤。這可能會導致AWS的「時間偏差」錯誤。然後將此添加到您的載波上傳器 'def process_uri(uri) URI。解析(uri) 結束' 這將覆蓋默認的carrierwave url解析器,我認爲這是解析器。 你可以在這裏閱讀更多關於這個問題https://github.com/carrierwaveuploader/carrierwave/issues/700 – Bramanga

回答

0

更好地使用v4簽名,應該防止這種錯誤。只需在url_for調用中添加選項「signature_version::v4」即可。

temp_url = AWS::S3::S3Object.url_for(
    s3_key, 
    S3_CONFIG['bucket'], 
    use_ssl: true, 
    signature_version: :v4) 
0

它與EXCON問題。

請參閱this answer瞭解如何解決問題並切換到使用實際aws-sdk的更好解決方案。


圖書館---磁盤空間--- ---代碼的啓動時間---運行時的DEP的線路---開發的DEP

霧--- 28.0M --- 133469 - - 0.693 --- 9 --- 11

AWS-SDK - 5.4M --- 90290 --- 0.098 --- 3 --- 8 *