技術情報

技術情報

OpenStack: Swift 【API 編】

2013年6月20日

技術文書トップへ

第 4 章 オブジェクトストレージ操作

3. オブジェクトサービス

3-1. オブジェクト一覧の取得

オブジェクトを取得します。パラメータ設定により、オブジェクトを取得に条件を付けることができます。

【リクエスト】

【レスポンス】

【バイトレンジ】

データを読み出す範囲を指定することができます。また、ひとつの範囲のみ指定可能で、その範囲指定方法には次のものがあります。

  • Range: bytes=開始オフセット-終了オフセット
    オブジェクトから、指定された範囲のデータを読み出す。
  • Range: bytes=開始オフセット
    "開始オフセット"からオブジェクト終端までのデータを読み出す。
  • Range: bytes=オブジェクト終端からのオフセット
    "オブジェクト終端からのオフセット"から、オブジェクト終端までのデータを読み出す。

【実行例】

コンテナ "src" 配下のオブジェクト "swift-1.3.0/README" を読み出し、"src/swift-1.3.0/README" に対して、GET リクエストを送信します。

  • GET リクエスト
    GET /v1/AUTH_orion-cabinet/src/swift-1.3.0/README HTTP/1.1
    User-Agent: curl/7.21.0 (x86_64-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8ozlib/1.2.3.4 libidn/1.18
    Host: objstore.example.jp
    Accept: */*
    X-Auth-Token: AUTH_tkcbd0b108401245a3acf1b550aa4862bb
    
  • レスポンス
    HTTP/1.1 200 OK
    Last-Modified: Thu, 07 Jul 2011 02:34:43 GMT
    Etag: 6f432df40167a4af05ca593acc6b3e4c
    Content-Length: 515
    Content-Type: application/octet-stream
    Date: Thu, 07 Jul 2011 03:44:39 GMT
    
    Swift
    -----
    
    A distributed object store that was originally developed as the basis for 
    Rackspace's Cloud Files.
    
    To build documentation run `python setup.py build_sphinx`, and then browse to
    /doc/build/html/index.html.
            :
         (以下略)
    

次に、Range ヘッダで読み出す範囲を限定して GET リクエストを送ります。同じオブジェクト README の、24 バイト目から 150 バイト目の範囲を指定します。
レスポンスの Content-Range ヘッダで、515 バイトのオブジェクトの 24 バイト目から 150 バイト目を読み出したことが通知されています。

  • GET リクエスト
    GET /v1/AUTH_orion-cabinet/src/swift-1.3.0/README HTTP/1.1
    User-Agent: curl/7.21.0 (x86_64-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8ozlib/1.2.3.4 libidn/1.18
    Host: objstore.example.jp
    Accept: */*
    X-Auth-Token: AUTH_tkcbd0b108401245a3acf1b550aa4862bb
    Range: bytes=24-150
    
  • レスポンス
    HTTP/1.1 200 OK
    Last-Modified: Thu, 07 Jul 2011 02:34:43 GMT
    Content-Range: bytes 24-150/515
    Etag: 6f432df40167a4af05ca593acc6b3e4c
    Content-Length: 127
    Content-Type: application/octet-stream
    Date: Mon, 25 Jul 2011 01:07:39 GMT
    
    ed object store that was originally developed as the basis for 
    Rackspace's Cloud Files.
    

ページトップ

3-2. オブジェクトの作成・更新

オブジェクトの作成あるいは更新を行います。
リクエストに Etag ヘッダを付けることができます。オブジェクトの MD5 チェックサムを Etag ヘッダに指定すると、Swift はオブジェクトのチェックサムと比較を行い、オブジェクトのデータが破損していないことを確認します。

オブジェクトの作成・更新に成功すると、そのレスポンスには Etag ヘッダが付けられ、Swift 側で行ったオブジェクトの MD5 チェックサムが納められています。レスポンスを受け取った後でも、送信したオブジェクトの MD5 チェックサムと比較することで、データの破損なく Swift に保存されたことを確認することができます。
また、リクエストヘッダに X-Object-Meta- から始まる名前の拡張ヘッダを付けることで、任意のメタデータをオブジェクトに与えることが可能です。
なお、1 つのオブジェクトのサイズは 5GB までのため、5GB を超えるオブジェクトを保存したい場合は、データを分割した上で保存する必要があります。その手順については、「第 5 章 マルチパートオブジェクト」で解説します。

V1.4.8 Essex リリース以降では、オブジェクトの生存期間を指定することができます。X-Delete-At ヘッダに指定した絶対時刻、または X-Delete-After ヘッダに指定した作成時からの相対時間経過時に、オブジェクトが自動的に削除されます。

【リクエスト】

  • オブジェクト名の制限
    オブジェクト名を URL エンコードした時、その長さが 1024 バイトに納まっていなければなりません。

【レスポンス】

【オブジェクトバージョニング】

オブジェクトバージョニング機能が有効になったコンテナ配下のオブジェクトを PUT で上書きすると、上書きされる古いオブジェクトはコンテナ作成時に、 X-Versions-Location で指定したコンテナ配下に退避されます。

  • 古いオブジェクトの名前は、<元のオブジェクト名の長さ> <元のオブジェクト名> / <タイムスタンプ> という名前に変換されます。
  • X-Versions-Location で指定したコンテナ配下を直接参照することにより、古いオブジェクトを取り出すことができます。
  • オブジェクトの削除 (DELETE) 操作を行うと、最新バージョンのオブジェクトのみが削除され、X-Versions-Location で指定したコンテナ配下にある旧バージョンのオブジェクトのうち最も新しいオブジェクトが、通常のコンテナ配下に戻されます。

【実行例】

  • PUT リクエスト
    PUT /v1/AUTH_orion-cabinet/src/swift-1.3.0.taz HTTP/1.1
    User-Agent: curl/7.21.0 (x86_64-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
    Host: objstore.example.jp
    Accept: */*
    X-Auth-Token: AUTH_tk3b0094c49a90435b9f86f580cb39e363
    Content-Length: 397030
    
  • レスポンス
    HTTP/1.1 201 Created
    Content-Length: 118
    Content-Type: text/html; charset=UTF-8
    Etag: 97e0b18bb44fbd8b2ea38b06e166a0fd
    Last-Modified: Thu, 07 Jul 2011 07:47:44 GMT
    Date: Thu, 07 Jul 2011 07:47:44 GMT
    
    <html>
     <head>>
      <title>201 Created</title>
     </head>
     <body>
      <h1>201 Created</h1>
      <br /><br />
    
     </body>
    </html>
    

ページトップ

3-3. オブジェクトのコピー

オブジェクトのコピー処理は、同一アカウント内でのみ可能です。アカウントをまたいでのオブジェクトのコピーはできません。
Swift にはオブジェクト名の変更や別のコンテナへの移動を行うメソッドはありませんが、オブジェクトをコピーしてから元のオブジェクトを削除することで実現できます。

【リクエスト】

オブジェクトのコピーのリクエスト方法には2 種類あり、どちらを利用しても動作は同じです。

  • PUT メソッドを使う

  • COPY メソッドを使う

【レスポンス】

【実行例: PUT による方法】

コピー元となるオブジェクトを「X-Copy-From: src/swift-1.3.0.taz」にて指定し、コピー先のオブジェクト "tmp/swift-1.3.0.taz"に対して PUT リクエストを送ります。

  • PUT リクエスト
    PUT /v1/AUTH_orion-cabinet/tmp/swift-1.3.0.taz HTTP/1.1
    User-Agent: curl/7.21.0 (x86_64-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
    Host: objstore.example.jp
    Accept: */*
    X-Auth-Token: AUTH_tk3b0094c49a90435b9f86f580cb39e363
    X-Copy-From: src/swift-1.3.0.taz
    Content-Length: 0
    
  • レスポンス
    HTTP/1.1 201 Created
    Content-Length: 118
    Content-Type: text/html; charset=UTF-8
    Etag: 97e0b18bb44fbd8b2ea38b06e166a0fd
    X-Copied-From: src/swift-1.3.0.taz
    Last-Modified: Fri, 08 Jul 2011 03:36:51 GMT
    Date: Fri, 08 Jul 2011 03:36:51 GMT
    
    <html>
     <head>
      <title>201 Created</title>
     </head>
     <body>
      <h1>201 Created</h1>
      <br /><br />
    
     </body>
    </html>
    

【実行例: COPYによる方法】

コピー先を「Destination: tmp/swift-1.3.0.taz」にて指定し、コピー元のオブジェクト "src/swift-1.3.0.taz" に対してCOPYリクエストを送ります。

  • COPY リクエスト
    COPY /v1/AUTH_orion-cabinet/src/swift-1.3.0.taz HTTP/1.1
    User-Agent: curl/7.21.0 (x86_64-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
    Host: objstore.example.jp
    Accept: */*
    X-Auth-Token: AUTH_tk3b0094c49a90435b9f86f580cb39e363
    Destination: tmp/swift-1.3.0.taz
    
  • レスポンス
    HTTP/1.1 201 Created
    Content-Length: 118
    Content-Type: text/html; charset=UTF-8
    Etag: 97e0b18bb44fbd8b2ea38b06e166a0fd
    X-Copied-From: src/swift-1.3.0.taz
    Last-Modified: Fri, 08 Jul 2011 03:40:09 GMT
    Date: Fri, 08 Jul 2011 03:40:09 GMT
    
    <html>
     <head>
      <title>201 Created</title>
     </head>
     <body>
      <h1>201 Created</h1>
      <br /><br />
    
     </body>
    </html>
    
ページトップ