ConoHa にはOpenStack Swiftベースのオブジェクトストレージが用意されています。これはその名のとおりストレージサービスの一種で、単独でもVPSと組み合わせてでも使うことができます。今回はそのしくみや使い方を解説し、応用的な使い方もいくつか紹介します。
オブジェクトストレージとは
オブジェクトストレージは、大容量のデータを低価格で格納するのに適したストレージです。容量無制限で上限を気にせずデータを追加できるため、増え続けるデータをスケーラブルに格納できます。また、内部でデータのコピーを保持するため(ConoHaの場合は三重にコピーされます) 、高い耐障害性、信頼性が実現されています。
オブジェクトストレージの特徴は、データを「オブジェクト」という単位で扱うこと、およびそのオブジェクトをAPI経由で操作することです。オブジェクトとは、一般的な「ファイル」にメタデータ(オブジェクトに関連したデータ)が追加されたものと理解してもらえば良いでしょう。たとえば画像データの場合、撮影日、撮影者、撮影場所などがメタデータになります。そして、オブジェクトは「コンテナ」に格納されます。コンテナはオブジェクトの入れ物のようなもので、複数のオブジェクトを格納できます。
オブジェクトストレージは、RESTful APIを通じてコンテナやオブジェクトにアクセスします。RESTについての詳細は割愛しますが、コンテナ/オブジェクトに対して一意なURLがあり、HTTPの各メソッドを使用してオブジェクトを操作することになります。これにより、OSやファイルシステムに依存せずにアクセスできます。
一方で、アクセスの単位が「オブジェクト」になることとHTTPによるオーバーヘッドがあるため、一般的なストレージに比べると低速になります。また、データに対するシーク操作や、部分的なリード/ライト操作は行えません。そして、WindowsエクスプローラーやMac OS XのFinderといった従来のファイル操作ツールは、そのままでは使用できません[1] 。
まとめると、オブジェクトストレージとは
大容量のデータを、低価格で容量無制限に格納可能
「ファイル」ではなく「オブジェクト」という単位でデータを管理
データ本体とメタデータをまとめて管理可能
RESTful APIによるOSやファイルシステムに非依存なアクセス
といった特徴を持つストレージサービスです。
使いどころ
オブジェクトストレージの特性を考えると、あまり書き換えが発生しない情報の管理や、容量の増加が見積もりづらいケースに向いていそうです。逆に、データに対してランダムアクセスが必要なケースや、頻繁に更新が発生する情報の管理には向かないでしょう。具体的には、次のようなデータには適しているといえそうです。
画像ファイル、動画ファイル
バックアップファイル
ログファイルのアーカイブ
仮想マシンイメージ
ConoHaオブジェクトストレージの基本的な使い方
実際にAPIを使ってオブジェクトストレージを操作してみましょう。ConoHaのコントロールパネルのメニューから「オブジェクトストレージ」を選択し、利用開始の手続きをしてください(図1 ) 。
図1 オブジェクトストレージの利用
APIへの接続にはcurlコマンドを使用します。APIの仕様については、ConoHa APIドキュメント を一緒にご覧ください。
認証
まず、オブジェクトストレージにアクセスするために認証を行う必要があります。
コントロールパネルの「API」のページを開き、ここにあるIdentity ServiceのエンドポイントURLに接続します。そして、APIユーザ名、パスワード、テナント名で認証を行うと、接続トークンが発行されます。このトークンを使用してオブジェクトストレージにアクセスします。
では認証を試してみましょう(APIドキュメントの「トークン発行」のページもご覧ください) 。接続先はIdentity Service Endpointに/tokensをつけたURLで、メソッドはPOST、認証情報はJSON形式(リスト1 )でPOSTデータとして送信します。curlコマンドを使った例を図2 に示します。curlの-dオプションはPOST/PUTリクエストのBodyを指定するもので、先頭に@をつけるとファイルから読み込んだ内容をBodyとして使用します。
リスト1 認証情報(auth.json)
{
"auth": {
"tenantName": "[テナント名]",
"passwordCredentials": {
"username": "[APIユーザ名]",
"password": "[APIパスワード]"
}
}
}
図2 トークンを取得するcurlコマンド
# curl -i -X POST \
-H "Accept: application/json" \
-d @auth.json \
https://identity.tyo1.conoha.io/v2.0/tokens
認証に成功するとトークンを含んだレスポンスが返ります。レスポンス自体とても長いですが、トークンを取るだけならレスポンスの冒頭部分(図3 )にのみ注目すれば良いです。access.token.idがトークンとなります。
図3 レスポンス(トークン部分のみ)
{
"access": {
"token": {
"issued_at": "2015-07-31T08:29:03.761520",
"expires": "2015-08-01T08:29:03Z",
"id": "*****************************", ← トークン
オブジェクトストレージにアクセスする
さてトークンが取得できたので、オブジェクトストレージにアクセスできるようになりました。オブジェクトストレージのエンドポイントURLも、コントロールパネルの「API」のページから確認できます。
コンテナの作成
まずはオブジェクトを格納するコンテナを作成してみましょう。URLで作成するコンテナ名を明示してPUTリクエストを送信します。また、HTTPリクエストヘッダ(X-Auth-Token)でトークンを指定します(図4 ) 。ここでは「sample-container」という名前でコンテナを作成しています。成功するとHTTPステータスコード201 Createdが返ってきます。
図4 コンテナを作成するcurlコマンド
# curl -i -X PUT \
-H "Accept: application/json" \
-H "X-Auth-Token: [トークン]" \
https://object-storage.tyo1.conoha.io/v1/nc_[TenantID]/sample-container
次にコンテナが作成されたことを確認しましょう。これにはエンドポイントURLにGETリクエストを送信します(図5 ) 。JSON形式でコンテナの情報が返ってきます。countはコンテナ内のオブジェクト数、bytesはコンテナに格納されているオブジェクトの合計サイズを表します。まだオブジェクトを格納していないので両方0ですね。
図5 コンテナ一覧を取得するcurlコマンドとレスポンス
# curl -i -X GET \
-H "Accept: application/json" \
-H "X-Auth-Token: [トークン]" \
https://object-storage.tyo1.conoha.io/v1/nc_[TenantID]/
HTTP/1.1 200 OK
Content-Length: 44
(中略)
[{"count": 0, "bytes": 0, "name": "sample-container"}]
オブジェクトのアップロードとダウンロード
次にオブジェクトをコンテナにアップロードしてみましょう。先ほどのsample-containerにsample.txt(適当なテキストファイルを用意してください)をアップロードします。コンテナを作成したときと同じようにPUTリクエストを送信しますが、URLはオブジェクトのURLで、リクエストボディにオブジェクトのデータを指定しているところが異なる部分です(図6 ) 。ダウンロードする場合は、オブジェクトのURLにGETリクエストを送信します(図7 ) 。
図6 オブジェクトをアップロードする
# curl -i -X PUT \
-H "Accept: application/json" \
-H "X-Auth-Token: [トークン]" \
-d @sample.txt \
https://object-storage.tyo1.conoha.io/v1/nc_[TenantID]/sample-container/sample.txt
図7 オブジェクトをダウンロードする
# curl -i -X GET \
-H "Accept: application/json" \
-H "X-Auth-Token: [トークン]" \
https://object-storage.tyo1.conoha.io/v1/nc_[TenantID]/sample-container/sample.txt
ここまでで、オブジェクトストレージの基本的な部分である、コンテナの扱いとオブジェクトのアップロード/ダウンロードを解説しました。RESTfulなAPIの利用により、コンテナやオブジェクトをURLで特定し、処理に応じたHTTPメソッドを選択するという、直感的に扱いやすいしくみになっています。前述の例ではHTTPメソッドとしてGETとPUTの2種類を使用しましたが、実際は次のようにもっと多くのメソッドが利用されます。
HEAD:リソース(コンテナやオブジェクト)のメタデータのみの取得
GET:コンテナ内のオブジェクト一覧の取得、リソースとメタデータの取得
PUT:リソースの作成
POST:メタデータの作成/変更/削除
DELETE:リソースの削除
COPY:オブジェクトの複製
応用的な使い方
オブジェクトストレージには、オブジェクトの単純な出し入れだけでなく、ほかにもいろいろな機能があります。いくつか簡単に紹介しましょう。
メタデータ
メタデータを使うとオブジェクトにさまざまな情報を付加できます。メタデータの操作はPOSTリクエストで行い、コンテナの場合は「X-Container-Meta-」 、オブジェクトの場合は「X-Object-Meta-」で始まるHTTPリクエストヘッダで指定します。
# curl -i -X POST \
-H "X-Auth-Token: [トークン]" \
-H "X-Object-Meta-Author: Mikumo ConoHa \
[コンテナまたはオブジェクトのURL]
コンテナの公開(ACL)
コンテナやオブジェクトへのアクセス許可はACL(Access Control List )によって管理されています。デフォルトでは認証を通っている必要がありますが、それを不要にするとコンテナを公開できます。これによりオブジェクトストレージを一般的なWebサーバのように使い、オブジェクトを配信できます。ACLの設定はHTTPヘッダの「X-Container-Read」と「X-Container-Write」を使います。「 .r:*」はコンテナ内のオブジェクトに対して公開アクセスを許可し、「 .rlistings:*」はオブジェクト一覧の取得を許可します。
# curl -i -X POST \
-H "X-Auth-Token: [トークン]" \
-H "X-Container-Read: .r:*,rlistings:*" \
[コンテナのURL]
有効期限つきオブジェクト
オブジェクトに有効期限を設定できる機能です。有効期限が過ぎたオブジェクトは自動的に削除され、一時的なファイルを作るときに便利です。指定方法は2とおりあり、「 X-Delete-At」はUNIX Epoch形式で有効期限の時刻を指定します。「 X-Delete-After」は有効期限を指定秒数の経過後に指定します。
# curl -i -X POST \
-H "X-Auth-Token: [トークン]" \
-H "X-Container-Read: .r:*,rlistings:*" \
-H "X-Delete-At: 1440029320" \
[オブジェクトのURL]
オブジェクトのバージョン管理
オブジェクトを更新したときに自動的に別のコンテナに履歴を残す機能です。容量無制限であるオブジェクトストレージの特徴を活かした機能といえます。PUTでオブジェクトを更新するたびに、自動的に既存のオブジェクトが別のコンテナにコピーされます。また、DELETEで現行バージョンのオブジェクトを削除すると、自動的に前のバージョンが復元されます。これは「X-Versions-Location」で設定します。値は履歴を残すコンテナ名です。詳しくはOpenStackのドキュメント をご覧ください。
# curl -i -X POST \
-H "X-Auth-Token: [トークン]" \
-H "X-Versions-Location: versions" \
[コンテナのURL] ↑ 履歴を保存するコンテナを指定
まとめ
オブジェクトストレージについての説明と、その特徴をいろいろ見てきました。ConoHaのオブジェクトストレージは単独で使用可能で、VPSと組み合わせてシステムを作ることもできます。また、ここで紹介した機能は一部です。ConoHa APIドキュメントのObject StorageServiceの項にはすべての機能が載っていますので、ぜひ試してみてください。