第 7 章 メタデータ

Swiftでは、アカウント・コンテナ・オブジェクトに対してユーザが自由にメタデータを登録することができる。これらメタデータは、Swiftの動作に影響を与えない。 メタデータは「鍵と値の組」で複数登録可能であるが、いくつかの制限がある。

1. オブジェクトのメタデータ

オブジェクトに対する PUT リクエスト、POST リクエストで設定することが可能です。PUT リクエストによるオブジェクトの作成時に、拡張ヘッダでメタデータを設定することができ、また、既存のオブジェクトに対する POST リクエストによりメタデータのみの設定を行うこともできます。PUT リクエスト・POST リクエスト時、”X-Object-Meta-” から始まる名前の拡張ヘッダ (鍵) に対して、値を設定します。

オブジェクトへのメタデータ登録は、オブジェクトへの書き込み許可があるユーザであれば、誰でも実行可能です。
また、オブジェクトに対し GET リクエスト・HEAD リクエストを送ると、そのレスポンスのヘッダにてメタデータを取り出せます。

2. コンテナのメタデータ

コンテナに対する PUT リクエスト、POST リクエストで設定することが可能です。PUT リクエストによるコンテナの作成時に、拡張ヘッダでメタデータを設定することができ、また、既存のコンテナに対するPUT リクエスト・POST リクエストによりメタデータのみの設定を行うこともできます。PUT リクエスト・POST リクエスト時、”X-Container-Meta-” から始まる名前の拡張ヘッダ (鍵) に対して、値を設定します。

コンテナへのメタデータ登録は、admin 権限を持つユーザのみが実行することができます。
また、コンテナに対し GET リクエスト・HEAD リクエストを送ると、そのレスポンスのヘッダにてメタデータを取り出せます。

3. アカウントのメタデータ

アカウントに対する POST リクエストで設定することが可能です。POST リクエスト時、”X-Account-Meta-” から始まる名前の拡張ヘッダ (鍵) に対して、値を設定します。
アカウントへのメタデータ登録は、admin 権限を持つユーザのみが実行することができます。
また、アカウントに対し GET リクエスト・HEAD リクエストを送ると、そのレスポンスのヘッダにてメタデータを取り出せます。

4. 注意点

アカウントとコンテナへのメタデータ登録時の動きと、オブジェクトへのメタデータの登録時の動きが異なるため、オブジェクトのメタデータを失わないように注意する必要があります。

アカウントとコンテナの場合、一部のメタデータだけの書き換えが可能です。

 

  • 登録しようとするメタデータのキーが存在しなかった場合、「キーと値」を対にして登録する。
  • 登録しようとするメタデータのキーが、既に登録されてい場合、値だけを更新する。

例として、コンテナ grub にメタデータ「X-Container-Meta-Fruit: apple」と「X-Container-Meta-Vegie: carrot」とが設定されている場合を見てみましょう。コンテナ grub に HEAD リクエストを送ることにより、設定されているメタデータを確認できます。

HEAD /v1/AUTH_orion-cabinet/grub HTTP/1.1
User-Agent: curl/7.19.7 (i486-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
Host: objstore.example.jp
Accept: */*
X-Auth-Token: AUTH_tk52b871ea91cc4fe9a78c130029545bcd
HTTP/1.1 204 No Content
X-Container-Object-Count: 1
X-Container-Meta-Vegie: carrot
X-Container-Bytes-Used: 4
X-Container-Meta-Fruit: apple
Content-Length: 0
Date: Sun, 24 Jul 2011 03:38:11 GMT

ここで、コンテナ grub のメタデータとして、「X-Container-Meta-Vegie: cabbage」と「X-Container-Meta-Grain: wheat」 を設定してみましょう。

POST /v1/AUTH_orion-cabinet/grub HTTP/1.1
User-Agent: curl/7.19.7 (i486-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
Host: objstore.example.jp
Accept: */*
X-Auth-Token: AUTH_tk52b871ea91cc4fe9a78c130029545bcd
X-Container-Meta-Vegie: cabbage
X-Container-Meta-Grain: wheat
HTTP/1.1 204 No Content
Content-Length: 0
Content-Type: text/html; charset=UTF-8
Date: Sun, 24 Jul 2011 05:10:42 GMT

コンテナ grub のメタデータがどのように変更されたか、HEAD リクエストを用いて確認します。「X-Container-Meta-Fruit:」の設定は保存され、「X-Container-Meta-Vegie:」の値は carrot から cabbage に書き換えられ、「X-Container-Meta-Grain: wheat」が新規に追加されていることが分かります。

HEAD /v1/AUTH_orion-cabinet/grub HTTP/1.1
User-Agent: curl/7.19.7 (i486-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
Host: objstore.example.jp
Accept: */*
X-Auth-Token: AUTH_tk52b871ea91cc4fe9a78c130029545bcd
HTTP/1.1 204 No Content
X-Container-Object-Count: 1
X-Container-Meta-Vegie: cabbage
X-Container-Meta-Grain: wheat
X-Container-Bytes-Used: 4
X-Container-Meta-Fruit: apple
Content-Length: 0
Date: Sun, 24 Jul 2011 05:12:28 GMT

5. オブジェクトの場合

登録されているメタデータを全て削除したうえで、新しいメタデータが登録されます。必要があれば、まず HEAD リクエストで現在登録されているメタデータを取り出し、これから登録しようとしているメタデータとマージした上で、POST リクエストでメタデータを登録する方がよいでしょう。 オブジェクト food にメタデータ「X-Object-Meta-Fruit: orange」と「X-Object-Meta-Vegie: celery」とが設定されている場合を例に挙げると、オブジェクト food に HEAD リクエストを送ることにより、設定されているメタデータを確認できます。

HEAD /v1/AUTH_orion-cabinet/grub/food HTTP/1.1
User-Agent: curl/7.19.7 (i486-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
Host: objstore.example.jp
Accept: */*
X-Auth-Token: AUTH_tk52b871ea91cc4fe9a78c130029545bcd
HTTP/1.1 200 OK
Last-Modified: Sun, 24 Jul 2011 03:57:42 GMT
Etag: 81dc9bdb52d04dc20036dbd8313ed055
X-Object-Meta-Fruit: orange
X-Object-Meta-Vegie: celery
Content-Length: 4
Content-Type: application/x-www-form-urlencoded
Date: Sun, 24 Jul 2011 03:57:42 GMT

ここで、オブジェクト food のメタデータとして、「X-Object-Meta-Vegie: mushroom」と「X-Object-Meta-Grain: rice」を設定してみましょう。

POST /v1/AUTH_orion-cabinet/grub/food HTTP/1.1
User-Agent: curl/7.19.7 (i486-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
Host: objstore.example.jp
Accept: */*
X-Auth-Token: AUTH_tk52b871ea91cc4fe9a78c130029545bcd
X-Object-Meta-Vegie: mushroom
X-Object-Meta-Grain: rice
HTTP/1.1 202 Accepted
Content-Length: 159
Content-Type: text/html; charset=UTF-8
Date: Sun, 24 Jul 2011 03:59:50 GMT
<html>
<head>
<title>202 Accepted</title>
</head>
<body>
<h1>202 Accepted</h1>
The request is accepted for processing.
</body>

オブジェクト food のメタデータがどのように変更されたか、HEAD リクエストを用いて確認します。
「X-Object-Meta-Vegie: mushroom」と「X-Object-Meta-Grain: rice」は設定されていますが、メタデータ「X-Object-Meta-Fruit:」の設定が破棄されていることが確認できます。

HEAD /v1/AUTH_orion-cabinet/grub/food HTTP/1.1
User-Agent: curl/7.19.7 (i486-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
Host: objstore.example.jp
Accept: */*
X-Auth-Token: AUTH_tk52b871ea91cc4fe9a78c130029545bcd
HTTP/1.1 200 OK
X-Object-Meta-Grain: rice
Last-Modified: Sun, 24 Jul 2011 03:59:50 GMT
Etag: 81dc9bdb52d04dc20036dbd8313ed055
X-Object-Meta-Vegie: mushroom
Content-Length: 4
Content-Type: application/x-www-form-urlencoded
Date: Sun, 24 Jul 2011 03:59:50 GMT

本記事でSwift【API 編】は最終回となります。