Conohaオブジェクトストレージにcarrierwaveとfogを使って保存する方法

#きっかけ
Amazon S3は無料枠を超えたら請求されるという重量課金制。
趣味でアプリ制作をしている人や、貧乏っ子は転送量が増えたらｶﾞｸﾌﾞﾙΣ(ﾟДﾟ；≡；ﾟдﾟ)という可能性に怯えつつ作業することになります。

ちなみに、私はAWSのルート情報をgithubにアクシデントPUSHしてしまい、すぐに削除したもののAWS登録20時間後に、心無きハッカーによりEC2を悪用され200万請求されました。（爆
詳しい話は関係ないので割愛しますが、AMAZONさんの素晴らしい対応で免除いただきました。
もう本はKINDLE以外で買いません。AMAZON最高！AMAZONバンザイ🙌です。

さて、Conohaとは「お名前.com」で有名なGMOさんが提供してくれている、VPS・オールSSDクラウドサービスです。
SSDを利用することで爆速なサービスを提供していただけるという、コンマ1秒を大事にするウェブデベロッパーには非常にありがたいサービスです。
また、1月900円から利用できるという低価格設定に、転送量もどんだけ使っても無料。
さらには、オブジェクトストレージとして利用できるSSDが100GBあたり450円。安っ！

そして、大事なのがイメージキャラクターの「**このはちゃん**」がかわいい。
![alt](https://www.conoha.jp/conohadocs/images/wallpaper/dl.php?design=2016_summer&name=1280_720.jpg)

今回は、そんな「Conohaオブジェクトストレージ」を利用しようとした時に、がっつりハマってしまったので、私と同じようなヘタレはいないと思いますが、利用してみようという方の助けになれるようにまとめさせていただきます。

#前提条件

もちろんconohaを契約し、オブジェクトストレージの利用契約が済んでいること。

```ruby
Ruby 2.3
Rails 4.2

gem 'carrierwave'
getm 'fog'

heroku
toolbelt
```

オブジェクトストレージ　※以下(OBS)

#Conoha側の設定

- 必要になるAPI情報を取得
- OBS内にコンテナ（ここにデータが保存される）を作成する


##API情報の確認と取得

ConohaのOBSにアクセスするためにはConohaの[コントロールパネル](https://manage.conoha.jp/)からAPIの情報を取得します。
まずは、コンパネの左側のメニューのAPIを選びます。

>Tips:初回API利用時は、パスワードを自分で決めないといけないのだが、このPWはOBSアクセス時に必要になり、もし、忘れてしまった場合は、新しく発行しか道がないので忘れないように保管しておきましょう。

パスワードを決めると、**API情報**が表示されます。
ここに、書かれている情報を用いてOBSを操作します。
以下に、今回利用する情報の照合表を作っておきました。作業中に、これどれだっけ？とならないように、見てください。(実際の作業時は自身の環境に合わせてね。

| 情報名 | キー | パラメータなど | 環境変数名 |
|:-:|:-:|:-:|:-:|
| テナント名  | hoge12345678  | :openstack_tenant  |  CONOHA_TENANT_NAME |
|  Identity Service | 	https://identity.tyo1.conoha.io/v2.0  | :openstack_auth_url  | CONOHA_API_AUTH_URL  |
| Object Storage Service | https://object-storage.tyo1.conoha.io/v1/hogeh..  | config.asset_host  |  CONOHA_ASSET_HOST |
| ユーザー名  | fuga12345678  | :openstack_username  | CONOHA_USERNAME  |
| パスワード  | SakkiKiMetaYatsu  | :openstack_api_key  | CONOHA_API_PASSWORD  |

##コンテナの作成

コンテナの作成は、コンパネからは操作できません。
今回は、せっかくなのでrubyプログラムを自作し、API操作をしてコンテナを作成します。
先ほど取得したAPI情報を、当て込んでいきます。

```ruby:containermaker.rb
require 'fog' #このプログラムはfogがインストールされている環境で動かしてね。

CONOHA_TENANT_NAME = ('hoge12345678')　#テナント名
CONOHA_USERNAME = ('fuga12345678')　#ユーザー名
CONOHA_API_PASSWORD = ('SakkiKiMetaYatsu') #自分で決めたAPIパスワード
CONOHA_API_AUTH_URL = ('https://identity.tyo1.conoha.io/v2.0') #Identity Service
CONOHA_CONTAINER_NAME = ('public') #これは、OBS内にこれから、作るコンテナの名前。今回の例ならば"http://object-s.../public/.."というディレクトリ名にあたる。

strage = Fog::Storage.new(
  provider: 'OpenStack', #conohaはopenstackベースなのでopenstack API形式で動かします。
  openstack_tenant: CONOHA_TENANT_NAME,
  openstack_username: CONOHA_USERNAME,
  openstack_api_key: CONOHA_API_PASSWORD,
  openstack_auth_url: CONOHA_API_AUTH_URL + '/tokens',
)

strage.put_container(CONOHA_CONTAINER_NAME,
  public: true, headers: { 'X-Web-Mode' => 'true' }) #これを忘れるとweb公開できなくて後悔します（ /// ）
```

で、実行。

```ruby:terminal
>ruby containermaker.rb
```

以下のようなレスポンスが返ってきます。

```ruby:terminal
//201 Created     コンテナが作れたよ～。
//202 Accepted    同じ名前のコンテナがすでにあるで～
//401 Unauthorize 認証失敗。入力情報に間違いないか見直し!
```

ちなみに、本当にできてるか心配な人は`curl`コマンドを送信して、確認するといいよ。

###curlを用いて確認方法
[cURL](https://ja.wikipedia.org/wiki/CURL)の動くPCから操作。インストされていない場合にubuntuなら`sudo apt-get install curl`で一発や！そう、ubuntuならね！

- トークンの取得
- コンテナ情報の取得

※テナントidだけは、ConohaコンパネのAPIのテナント情報から確認してください。

[APIマニュアル-トークン発行](https://www.conoha.jp/docs/identity-post_tokens.html)
[このべん API取得マニュアル](https://www.conoha.jp/conoben/archives/10025)

まずは、トークンを発行します。

```ruby:terminal
>curl -i -X POST \
-H "Accept: application/json" \
-d '{"auth":{"passwordCredentials":{"username":"ConoHa","password":"SakkiKiMetaYatsu"},"tenantId":"hogefugatenanteid1234567890"}}' \
https://identity.tyo1.conoha.io/v2.0/tokens
```
上記を実行すると、何やら長ったらしく、改行されてなくて読みにくい文字列が返ってくるので、最初のほうにある`id`の情報をコピー

```ruby:terminal
{"access":{"token":{"issued_at":"2016-06-18T12:06:51.766452","expires":"2016-06-19T12:06:51Z","id":"fungahogefunga3431248309jojoomoroi","tenant":{
```

[APIマニュアル-コンテナ情報](https://www.conoha.jp/docs/swift-show_container_details_and_list_objects.html)

そして、再度、cURLを使いコンテナ情報を取得。

```ruby:terminal
>curl -i -X GET \
-H "Accept: application/json" \
-H "X-Auth-Token:fungahogefunga3431248309jojoomoroi" \ #X-Auth-Token:ここにさっきのidをペースト
https://object-storage.tyo1.conoha.io/v1/hogeh../　#ここは、Object Storage Serviceのurl
```

成功すれば、オブジェクト内にあるコンテナの情報が表示されます。

```ruby:terminal
HTTP/1.1 200 OK
Content-Length: 49
X-Account-Container-Count: 1
X-Account-Object-Count: 1
X-Account-Storage-Policy-Policy-0-Bytes-Used: 230877
X-Account-Storage-Policy-Policy-0-Container-Count: 1
X-Timestamp: 1466141730.87115
X-Account-Storage-Policy-Policy-0-Object-Count: 1
X-Account-Bytes-Used: 230877
X-Account-Meta-Quota-Bytes: 107374182400
Content-Type: application/json; charset=utf-8
Accept-Ranges: bytes
X-Trans-Id: txee55498935404a2caad89-0052dd3b77
Date: Sat, 18 Jun 2016 12:09:39 GMT

[{"count": 1, "bytes": 230877, "name": "public"}] #ここにpublicができてるー！
```
失敗した方は、きちんと情報があっているか再度見直してください。
ちなみに私はconohaサイトから面倒なのでコピペして使い、全角スペーストリックに気づかずに失敗し続けました。

これで必要な情報がそろった

| 情報名 | キー | パラメータなど | 環境変数名 |
|:-:|:-:|:-:|:-:|
| コンテナ名  | public  | 無し  | CONOHA_CONTAINER_NAME  |


#herokuの設定

今回は、アプリのUPのPaaSをherokuとしました。
私のような貧乏っ子にはうってつけの、無料のPaaS🙌！非常に有り難いサービスです。

さて、冒頭で述べたとおりに心無きハッカーにフルボッコにされた私の経験をもとに、セキュリティ面で優れている環境変数にAPI情報を直接記述していきます。
![alt](https://www.conoha.jp/conoben/wp-content/uploads/sites/2/2015/11/st11.jpg)

>herokuを動かすようにするには、herokuからでている[toolbelt](https://toolbelt.heroku.com/)を使って動くようにします。
cloud9とかなら最初から動くから楽です。
[herokuの基礎的な動作方法](https://devcenter.heroku.com/articles/getting-started-with-rails4)

herokuにログイン後は、`heroku config:set 環境変数名=キー`を用いて環境設定を記述していきます。
また、環境変数名は、半角スペースで連続して記述も可能。

```ruby:terminal
>heroku config:set CONOHA_TENANT_NAME=hoge12345678 CONOHA_API_AUTH_URL=https://identity.tyo1.conoha.io/v2.0 CONOHA_ASSET_HOST=https://object-storage.tyo1.conoha.io/v1/hogeh.. CONOHA_USERNAME=fuga12345678 CONOHA_API_PASSWORD=SakkiKiMetaYatsu
```
ちゃんと変数が定義されたかどうかは、`heroku config`で簡単に確認できます。

```ruby:terminal
>heroku config
=== appname Config Vars
CONOHA_API_AUTH_URL:      https://identity.tyo1.conoha.io/v2.0
CONOHA_API_PASSWORD:      SakkiKiMetaYatsu
CONOHA_ASSET_HOST:        https://object-storage.tyo1.conoha.io/v1/hogeh..
CONOHA_CONTAINER_NAME:    public
CONOHA_TENANT_NAME:       hoge12345678
CONOHA_USERNAME:          fuga12345678
.
.
```

このように表示されればOKです。

#Rails側での設定

ここからはRailsサイドでの編集に移ります。

`Gemfile`に`carrierwave`と`fog`を追加しておいてください。

##carrierwave.rbの作成

initializersの中に、carrierwave.rbとしてファイルを作ります。
そして、以下記述。

```ruby:carrierwave.rb
CarrierWave.configure do |config|
    config.fog_credentials = {
      :provider => 'OpenStack',
      :openstack_tenant => ENV['CONOHA_TENANT_NAME'],
      :openstack_username => ENV['CONOHA_USERNAME'],
      :openstack_api_key => ENV['CONOHA_API_PASSWORD'],
      :openstack_auth_url => ENV['CONOHA_API_AUTH_URL'] + '/tokens',
    }
    config.fog_directory = ENV['CONOHA_CONTAINER_NAME']
    config.storage :fog
    config.asset_host = ENV['CONOHA_ASSET_HOST'] + '/' + ENV['CONOHA_CONTAINER_NAME']
end
```

これで、あとはherokuにpushして問題なく、保存ができればOKです。
![alt](https://www.conoha.jp/conoben/wp-content/uploads/sites/2/2015/11/st01.jpg)



#参考サイト


[Conoha API Documentation](https://www.conoha.jp/docs/index.html)
[このべん](https://www.conoha.jp/conoben/archives/tag/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8)
[黒曜の吹き溜まり](http://blog.kokuyouwind.com/archives/1129)