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

More than 3 years have passed since last update.


きっかけ

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

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


前提条件

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

Ruby 2.3

Rails 4.2

gem 'carrierwave'
getm 'fog'

heroku
toolbelt

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


Conoha側の設定


  • 必要になるAPI情報を取得

  • OBS内にコンテナ(ここにデータが保存される)を作成する


API情報の確認と取得

ConohaのOBSにアクセスするためにはConohaのコントロールパネルから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情報を、当て込んでいきます。


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公開できなくて後悔します( /// )


で、実行。


terminal

>ruby containermaker.rb


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


terminal

//201 Created     コンテナが作れたよ~。

//202 Accepted 同じ名前のコンテナがすでにあるで~
//401 Unauthorize 認証失敗。入力情報に間違いないか見直し!

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


curlを用いて確認方法

cURLの動くPCから操作。インストされていない場合にubuntuならsudo apt-get install curlで一発や!そう、ubuntuならね!


  • トークンの取得

  • コンテナ情報の取得

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

APIマニュアル-トークン発行

このべん API取得マニュアル

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


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の情報をコピー


terminal

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


APIマニュアル-コンテナ情報

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


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

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


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


herokuを動かすようにするには、herokuからでているtoolbeltを使って動くようにします。

cloud9とかなら最初から動くから楽です。

herokuの基礎的な動作方法


herokuにログイン後は、heroku config:set 環境変数名=キーを用いて環境設定を記述していきます。

また、環境変数名は、半角スペースで連続して記述も可能。


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で簡単に確認できます。


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サイドでの編集に移ります。

Gemfilecarrierwavefogを追加しておいてください。


carrierwave.rbの作成

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

そして、以下記述。


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


参考サイト

Conoha API Documentation

このべん

黒曜の吹き溜まり