naichi's lab

3日後の自分(他人)への書き置き

Ruby on Rails、CarrierWave + fog で412 Precondition Failedエラー

CarrierWave + fogでConoHaのオブジェクトストレージへファイルをアップロードする処理を作ってて知らぬ間にエラーしてた。

さっさとテスト書けよって感じですが書き方分からなくて後回しにしてます。

とりあえず解決方法だけメモ。30分ぐらい悩んだ…

エラー内容

f:id:naichilab:20160301080907p:plain

Excon::Errors::PreconditionFailed in IconsController#update

Expected(201) <=> Actual(412 Precondition Failed)
excon.error.response :body => "Bad URL" :headers => { 
    "Content-Length" => "7"
    "Content-Type" => "text/html; charset=UTF-8"
    "Date" => "Mon, 29 Feb 2016 23:05:42 GMT"
    "X-Trans-Id" => "tx3c40b02b9bed4206be615-0056d4cec6"
} :local_address => "xxx.xxx.xxx.xxx"
:local_port => 63026
:reason_phrase => "Precondition Failed"
:remote_ip => "xxx.xxx.xxx.xxx"
:status => 412
:status_line => "HTTP/1.1 412 Precondition Failed\r\n"

原因

carrierwaveの設定でfog_directoryに/が入っていたのが原因でした。

config/initializers/carrierwave.rb

CarrierWave.configure do |config|

  container_name = '/unityroom_' + Rails.env # これがNG

  config.fog_credentials = {
      provider: 'openstack',
      openstack_tenant: ENV['CONOHA_TENANT_NAME'],
      openstack_username: ENV['CONOHA_API_USERNAME'],
      openstack_api_key: ENV['CONOHA_API_PASSWORD'],
      openstack_auth_url: ENV['CONOHA_API_AUTH_URL'] + '/tokens',
  }
  config.fog_directory = container_name
  config.storage :fog
  config.asset_host = ENV['CONOHA_ASSET_HOST'] + container_name

end

下記のように書き換えることでエラーは解消した。

container_name = 'unityroom_' + Rails.env

めでたしめでたし。