heroku のアプリから s3 にファイルをアップロードすると、一見ランダムなエラーが発生します。CORS メソッドとこのコードを使用して、jquery-file-upload を使用してバケット内の tmp/ ディレクトリに写真をアップロードしています。
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 エラーが発生します。何が原因なのかわからない。
そこから、remote__url 呼び出しを使用してキャリアウェーブに画像を添付するバックグラウンド ジョブを処理するために Qu を使用しています。これが私のバックグラウンドタスクです:
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-development [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&Expires=1354480332&Signature=4wPc+nT84WEdOuxS6+Ry4iMNkys= HTTP/1.1" 403 SignatureDoesNotMatch 895 - 8 - "-" "Ruby" -
私はこれについてよく読んでいますが、署名にエスケープされていない「+」があると、この問題が発生することがあるようです。これが Carrierwave、Fog、または AWS::S3 の問題であるかどうかはわかりません。
これについて何かご助力いただければ幸いです。
ありがとう。