Webサービスを作って潰すのが趣味な人のブログ

とりあえず作ってから怒られよう

Carrierwave+fog+ConoHaオブジェクトストレージを使用している時、データ更新時に「Expected([200, 204]) <=> Actual(401 Unauthorized) (Excon::Errors::Unauthorized)」が発生した時の対処法

http://www.flickr.com/photos/54742819@N00/2124300110

photo by Bryan Bruchman

 

先日サーバーA→ConoHaのオブジェクトストレージにファイルを移す作業を行っていたのですが、その際タイトルにある「Expected([200, 204]) <=> Actual(401 Unauthorized)(Excon::Errors::Unauthorized)」が発生しかなり頭を悩まされました

 

色々検証した結果原因がわかったので対処法と一緒にメモしておきます

※AmazonS3なんかでも同じかもしれません

 

発生するモデルケース

User

  - id:integer

  - icon:string

 

Userテーブルにidとiconカラムがあるだけのモデルです

ここに一度データを突っ込んで保存します

 

gisteb2efd1e3451321c5691

 

デフォルトでは「#{Rails.root}/public/uploads/user/icon/*id*/*filename*」に保存されます

その後、保存先をローカルからAmazonS3やConoHaなどのオブジェクトストレージに変更した上でデータを更新しようとすると……

gist72bb0280eec490ee8e2b

 

原因は?

Carrierwaveはデータがアップデートされるときに古いファイルを削除するようになっています

保存先をオブジェクトストレージに変えた場合、「オブジェクトストレージの中から古いデータを探して削除しようとする」のが原因でエラーが発生します

旧データはローカルサーバーにしかないため当たり前なんですけどね……

 

それにしてもエラーが分かりづらい!!しかもネットを検索しても似たような情報が出てこない!!

ということで一生懸命ソースを追ったところファイルの削除を行っているcallbackを飛ばせばこのエラーを回避出来そうでした

 

永久にskipする場合は

gist741095d608c253f6f0f8

modelに直接書いちゃえばOKです

 

 

一時的にskipする場合は

このブログを参考にさせていただき

blog.hello-world.jp.net

 

こんな感じにすればOKだと思います

gistcbfa961cc8498719bd68

 

その他

レコードが削除されてもデータが残り続ける状態はあまり良くないのでどちらかというと下の方を使ったほうがいいと思います

あんまり詳しく調べてないので自分のCarrierwaveの設定が悪いような気がしないでもないですがめんどくさいのでとりあえず対処法だけ残しておきます