*

API による Swift の操作 ~ Swiftによるオブジェクトストレージシステムの構築(5)

公開日: 最終更新日:2014/07/23  |  By  |  Object Storage, OpenStack, Swift

by Yamagata 2013.2.25
(Swift関連の記事の一覧はこちらをご覧ください)

前回 CLI を使って実際にデータの格納などを行う方法を説明しました。
今回は Swift の API について紹介したいと思います。
大抵の処理はCLI を使えば事足りますが、APIを完全に網羅しているわけではないですし、Webアプリケーションなどで操作する場合はAPIを直接利用したほうが使い勝手は良いのではないかと思います。

この記事では curl コマンドを使って直接 API を叩く方法を確認したいと思います。

1. API の概要

Swift の API を使うには以下のような処理を行います。

  1. 認証システムにアクセスして認証トークンを取得する
  2. 取得した トークンを使って Swift の API を呼び出す

1. で一度トークンを取得すれば トークンが有効の間は2. の API 呼び出しを繰り返し行うことができます。
認証トークンには有効期限あります。
今回利用している TempAuth では有効期限はデフォルトで1日(86400秒) です。
以下のように proxy-server.conf の設定を変更し proxy-server を再起動することで有効期限の変更が可能です。
> vi /etc/swift/proxy-server.conf….[filter:tempauth]

token_life = 60

> /etc/init.d/swift-proxy restart

上記の例では 60秒にしています。
なお TempAuth では認証トークンを memcached 上に保存しているため memcached を再起動するとトークンが無効になります。

2. 認証トークンの取得処理

認証トークンを取得する場合 http://localhost:8080/auth/v1.0 にリクエストを投げます。
ユーザ情報(アカウント:ユーザ)、キー情報は HTTP のヘッダにより渡します。
ユーザ情報は X-Auth-User, キー情報はX-Auth-Key ヘッダで渡します。

> curl -v -H ‘X-Auth-User: test:tester’ -H ‘X-Auth-Key: testing’  http://localhost:8080/auth/v1.0
> GET /auth/v1.0 HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: localhost:8080
> Accept: */*
> X-Auth-User: test:tester
> X-Auth-Key: testing
>
< HTTP/1.1 200 OK
< X-Storage-Url: http://192.168.0.127:8080/v1/AUTH_test
< X-Storage-Token: AUTH_tk949f5c7c4e7c438ea040b1483b3b9e06
< X-Auth-Token: AUTH_tk949f5c7c4e7c438ea040b1483b3b9e06
< Content-Length: 0
< Date: Fri, 22 Feb 2013 03:32:59 GMT

HTTPレスポンスとして “200 OK” が返り、HTTPのレスポンスヘッダ X-Storage-Url にSwiftの API 呼び出し用URLが、 X-Auth-Token に認証トークンが記述されています。
以上で Swift API を呼び出すのに必要な情報が取得できました。

3. Swift API

3.1 APIの概要

Swift の API は http://api.openstack.org/api-ref.html の Object Storage の項に一覧があります。
以下にアカウント、コンテナ、オブジェクトごとのAPIの一覧を示します。各APIのパラメータ等の詳細は上記URLより確認してください。
[ アカウントに対する操作]
  1. GET   v1/{account}  … コンテナの一覧を名前順で取得する
  2. HEAD v1/{account}  … アカウントの保有するコンテナ数、バイト数、メタデータを表示する
  3. POST v1/{account} … X-Account-Meta-* ヘッダを指定することでアカウントレベルのメタデータを作成更新する。


[コンテナに対する操作]
  1. GET v1/{account}/{container} … コンテナが保有するオブジェクトの一覧を取得する
  2. PUT v1/{account}/{container} … コンテナを作成する
  3. DELETE v1/{account}/{container} …空のコンテナを削除する
  4. HEAD v1/{account}/{container} … コンテナ配下のオブジェクト数、バイト数、メタデータを取得する
  5. POST v1/{account}/{container} … X-Container-Meta-* ヘッダを指定することでコンテナレベルのメタデータの作成、更新をする。


[オブジェクトに対する操作]
  1. GET v1/{account}/{container}/{object} … オブジェクトをダウンロードする
  2. PUT v1/{account}/{container}/{object} … オブジェクトおよびそのメタデータをアップロード、更新する
  3. DELETE v1/{account}/{container}/{object} …オブジェクトを削除する。次のCOPYコマンドを組み合わせて、COPY後にDELETE を実行することでオブジェクトの移動が実現できる
  4. COPY  v1/{account}/{container}/{object} … 既存のオブジェクトを別の名前でコピーする。
  5. HEAD v1/{account}/{container}/{object} … オブジェクトのメタデータおよび標準的なHTTPヘッダを取得する。
  6. POST v1/{account}/{container}/{object} … X-Object-Meta-* ヘッダを指定することでコンテナレベルのメタデータの作成、更新をする。また X-Delete-At or X-Delete-After を指定することでオブジェクトの有効期限を指定する。
以下でいくつかのAPI を取り上げてみたいと思います。

3.2 “GET v1/{account}” コンテナ一覧の取得  

“GET v1/{account}” はアカウントが保有するコンテナの一覧を表示する API です。
curl を実行するとき上記で取得したトークン情報を、URLは X-Storage-Url で取得したものを使います。

>curl -v -H ‘X-Auth-Token: AUTH_…’  http://localhost:8080/v1/AUTH_test< HTTP/1.1 200 OK
< X-Account-Object-Count: 10
< X-Timestamp: 1358492197.05102
< X-Account-Meta-Key2: fugafuga
< X-Account-Bytes-Used: 10240000
< X-Account-Container-Count: 5
< Accept-Ranges: bytes
< Content-Length: 49
< Content-Type: text/plain; charset=utf-8
< Date: Fri, 22 Feb 2013 03:47:03 GMT
<
folder1
folder2
folder3
folder4
folder6_segments

上記のようにコンテナの一覧が取得されます。
また レスポンスヘッダをみると、このアカウントに設定されたメタデータ(X-Account-Meta-Key2) や、このアカウントが保有している全オブジェクトのサイズ(X-Account-Bytes-Used), 同じくコンテナ数(X-Account-Container-Count) が表示されていることが分かります。
コンテナ一覧のAPIにはパラメータがいくつか設定できますがここでは format パラメータを確認したいと思います。
上記の例のように format を何も指定していない場合、コンテナの一覧は1行1コンテナのテキスト形式で表示されます。一方 format=json を指定すると JSON形式で format=xml を指定すると XML形式で結果を返します。
[format=json を指定した場合]

> curl -v -H ‘X-Auth-Token: AUTH_…’  http://localhost:8080/v1/AUTH_test?format=json 

[
{"count": 0, "bytes": 0, "name": "folder1"},
{"count": 0, "bytes": 0, "name": "folder2"},
{"count": 0, "bytes": 0, "name": "folder3"},
{"count": 0, "bytes": 0, "name": "folder4"},
{"count": 10, "bytes": 10240000, "name": "folder6_segments"}
]

[format=xml を指定した場合]

> curl -v -H ‘X-Auth-Token: AUTH_…’  http://localhost:8080/v1/AUTH_test?format=xml
<?xml version=”1.0″ encoding=”UTF-8″?>
<account name=”AUTH_test”>
<container><name>folder1</name><count>0</count><bytes>0</bytes></container>
<container><name>folder2</name><count>0</count><bytes>0</bytes></container>
<container><name>folder3</name><count>0</count><bytes>0</bytes></container>
<container><name>folder4</name><count>0</count><bytes>0</bytes></container>
<container><name>folder6_segments</name><count>10</count><bytes>10240000</bytes></container>
</account>

format を指定した場合、JSON,XML それぞれの形式で表示するだけでなく、各コンテナが保有するオブジェクト数(count)やバイト数(bytes) などの負荷情報も返されます。
プログラムで処理をする場合はformatを指定して処理したほうが便利だと思います。

3.3 “PUT v1/{account}/{container}/{object}” オブジェクトのアップロード

次にオブジェクトのアップロードを確認します。

>curl -v -X PUT -T ./data10m.dat -H ‘X-Auth-Token: AUTH_…..’ http://localhost:8080/v1/AUTH_test/folder1/file1< HTTP/1.1 201 Created
< Content-Length: 118
< Content-Type: text/html; charset=UTF-8
< Etag: d100153e1ddf490164c88e6033ef0023
< Last-Modified: Mon, 25 Feb 2013 02:20:34 GMT
< Date: Mon, 25 Feb 2013 02:20:34 GMT
<
<html>
<head>
<title>201 Created</title>
</head>
<body>
<h1>201 Created</h1>
<br /><br />

</body>
</html>

上記のように 指定された コンテナ/オブジェクトに対して PUT リクエストを送ることでファイルをアップロードすることができます。ここでは curl コマンドの -Tオプションでアップロードするファイル ./data10m.dat を指定してコンテナ folder1 の file1 というオブジェクト名としてアップロードしています。

3.4 “GET v1/{account}/{container}/{object}” オブジェクトのダウンロード

上記でアップロードされたファイルをダウンロードしてみます。

>curl -v -X GET -o file1 -H ‘X-Auth-Token: AUTH_…’  http://localhost:8080/v1/AUTH_test/folder1/file1
< HTTP/1.1 200 OK
< Last-Modified: Mon, 25 Feb 2013 02:20:34 GMT
< Etag: d100153e1ddf490164c88e6033ef0023
< X-Timestamp: 1361758834.59536
< Accept-Ranges: bytes
< Content-Length: 10240000
< Content-Type: application/octet-stream
< Date: Mon, 25 Feb 2013 02:28:15 GMT

上記のように GETリクエストにより指定されたオブジェクトをダウンロードすることができます。
ここでは curl の -o オプションで file1 という名前でオブジェクトをダウンロードしています。
3.3 でアップロードした data10m.dat と同一データとなっているか確認してみます。

> md5sum data10m.dat file1
d100153e1ddf490164c88e6033ef0023 data10m.dat
d100153e1ddf490164c88e6033ef0023 file1

上記のように file1 としてダウンロードしたファイルと元のファイルのmd5値を比較すると同一のものであることが分かります。
また HTTP レスポンスの Etagヘッダにも md5 値が設定されていますので、ダウンロードしたファイルが正しくダウンロードされたか確認することができます。

以上のように curl を使うことで API の動作を確認することができます。
実際にSwift を使ったシステムを構築する際は curl を使い API の動作を確認しながら行うと開発しやすいのではないかと思います。

関連記事

summittokyo

OpenStack Summit Tokyoのセッションへの投票をお願いします。

OpenStack Summit Tokyo のセッションへの投票が行われています。 弊研究所でも

記事を読む

dhcloudbuilding-121017105917-phpapp02.pdf-EF-BC-881_29-E3-83-98-E3-82-9A-E3-83-BC-E3-82-B7-E3-82-99-EF-BC-89

OpenStack Summit in San Diego 3日目

ビットアイル総研の長谷川です。今日は、Summit の3日目です。本日行われたセッションのなかから興

記事を読む

affinity_swift-get-node

Swift のグローバルクラスタ(2) affinity の設定

Swift のグローバルクラスタ(2) affinity 山縣です。Havana 版(1.10.0)

記事を読む

検証構成

RDOを使用したOpenStack Juno環境の構築

ビットアイル総合研究所 田波です。 今回はRDOを使用してOpenStack Juno環境を構築し

記事を読む

day2_3

OpenStack Upstream Training in Paris 参加報告

by Ikuo Kumagai (@kumagai19o) Bonjuor. またご無沙汰して

記事を読む

image

OpenStack Summit Portland Quick レポート

by hasegawa 2013.04.172013年4月15日〜18日にかけて米国のオレゴン州ポー

記事を読む

summit_top

OpenStack Summit Vancouver Summary

5/18~5/22に開催されたOpenStack Summit Vancouver に参加してきまし

記事を読む

no image

OpenStack DBaas (Trove) を動かした話

本記事はOpenStack Advent Calendar 2015 12/17 のエントリー記事で

記事を読む

oss_on_slshowcase

CentOS 6 から7へのアップグレード

この記事は OSS on SoftLayer Showcase  の OpenStack Juno

記事を読む

no image

Grizzlyの新機能(1) ~ Swiftによるオブジェクトストレージシステムの構築(8)

by You Yamagata 2013.04.24(Swift関連の記事の一覧はこちらをご覧くださ

記事を読む

no image

ビットアイル総合研究所は、クラウド技術に関する調査&研究を通して、社会と会社に寄与していくことを目的に、ビットアイル・エクイニクスの企業内研究所として2011年8月に設立されました。

openstack-figure1-2x
COHO DataStream のCinder連携

OpenStack Cinder のストレージバックエンドとしてはCe

blog-ocata
Jujuで Ocataを含む様々なバージョンのOpenStack をデプロイする方法

祝OpenStack Ocata リリース!! ということで、早速デプ

newton
Juju Manual Cloud で OpenStack 環境構築

本当にご無沙汰しております。 この投稿はOpenStack Adve

top
HACK! THE Juju/MAAS

6/8~6/10まで幕張メッセで開催されたInterop 2016。皆

dpdk
OpenStack OVS VXLAN ネットワークの高速化

少し前の話になりますが、3月2日に開催された 日本仮想化技術株式会社様

→もっと見る

PAGE TOP ↑