Articles Comments

ちからの備忘録的日記 » cloud » OpenStack Swift で StaticWeb 機能を試してみました。使わないけど。

OpenStack Swift で StaticWeb 機能を試してみました。使わないけど。




Swift 1.3 から追加された機能である StaticWeb を試してみることにしました。

StaticWeb 機能とは

Swift Cactus のリリースノートより。

You now have the option to serve static website content directly from an Object Storage (Swift) installation using container listings in index.html displays. Swift will automatically translate requests to possible /index.html resolutions, where the index.html display is configurable per container. Where an index.html file does not exist, you have the option to provide object listings that are within the container instead of the index.html. This mode is normally only active for anonymous requests. If you want to use it with authenticated requests, set the X-Web-Mode:true“ header on the request.

簡単に言うと、Swift 上で静的なWebサイトをつくるための機能です。Amazon S3 の以下の機能を実現するために実装された感じですね。

【AWS発表】 Amazon S3で静的なWebサイトの運用が可能に – Amazon Web Services ブログ

StaticWeb 設定・確認

さっそく、「Misc/StaticWeb — Swift v1.4.2-dev documentation」に従って作業を進めていきます。


■ アクセス権限設定(誰でも読めるように)

nemf@ubuntu:~$ st -A http://127.0.0.1:8080/auth/v1.0 -U test:tester -K testing  post -r '.r:*' web
nemf@ubuntu:~$ sh head web
* About to connect() to 127.0.0.1 port 8080 (#0)
*   Trying 127.0.0.1... connected
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> HEAD /v1/AUTH_ca833f08-9319-4692-8752-99bdaf2da74a/web HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
> Host: 127.0.0.1:8080
> Accept: */*
> X-Storage-Token: AUTH_tk54e8a93f10fd4a60bb1f3fb14947ba93
>
< HTTP/1.1 204 No Content
< X-Container-Object-Count: 0
< X-Container-Read: .r:*
< X-Container-Bytes-Used: 0
< Content-Length: 0
< Date: Fri, 24 Jun 2011 01:59:20 GMT
<
* Connection #0 to host 127.0.0.1 left intact
* Closing connection #0
[/shell]

[shell]
■ インデックスの設定( apache でいうところの DirectoryIndex )

nemf@ubuntu:~$ st -A http://127.0.0.1:8080/auth/v1.0 -U test:tester -K testing post -m 'web-index:index.html' web
nemf@ubuntu:~$ sh head web
* About to connect() to 127.0.0.1 port 8080 (#0)
*   Trying 127.0.0.1... connected
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> HEAD /v1/AUTH_ca833f08-9319-4692-8752-99bdaf2da74a/web HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
> Host: 127.0.0.1:8080
> Accept: */*
> X-Storage-Token: AUTH_tk54e8a93f10fd4a60bb1f3fb14947ba93
>
< HTTP/1.1 204 No Content
< X-Container-Object-Count: 0
< X-Container-Read: .r:*
< X-Container-Bytes-Used: 0
< X-Container-Meta-Web-Index: index.html
< Content-Length: 0
< Date: Fri, 24 Jun 2011 02:01:07 GMT
[/shell]

[shell]
■ リスト表示の設定 ( DirctoryListing の設定 )

nemf@ubuntu:~$ st -A http://127.0.0.1:8080/auth/v1.0 -U test:tester -K testing post -m 'web-listings: true' web
nemf@ubuntu:~$ sh head web
* About to connect() to 127.0.0.1 port 8080 (#0)
*   Trying 127.0.0.1... connected
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> HEAD /v1/AUTH_ca833f08-9319-4692-8752-99bdaf2da74a/web HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
> Host: 127.0.0.1:8080
> Accept: */*
> X-Storage-Token: AUTH_tk54e8a93f10fd4a60bb1f3fb14947ba93
>
< HTTP/1.1 204 No Content
< X-Container-Meta-Web-Listings: true
< X-Container-Object-Count: 0
< X-Container-Read: .r:*
< X-Container-Bytes-Used: 0
< X-Container-Meta-Web-Index: index.html
< Content-Length: 0
< Date: Fri, 24 Jun 2011 02:01:38 GMT
[/shell]

[shell]
■ エラーページの設定 ( ErrorDocument の設定 )

nemf@ubuntu:~$ st -A http://127.0.0.1:8080/auth/v1.0 -U test:tester -K testing post -m 'web-error:error.html' web
nemf@ubuntu:~$ sh head web
* About to connect() to 127.0.0.1 port 8080 (#0)
*   Trying 127.0.0.1... connected
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> HEAD /v1/AUTH_ca833f08-9319-4692-8752-99bdaf2da74a/web HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
> Host: 127.0.0.1:8080
> Accept: */*
> X-Storage-Token: AUTH_tk54e8a93f10fd4a60bb1f3fb14947ba93
>
< HTTP/1.1 204 No Content
< X-Container-Meta-Web-Listings: true
< X-Container-Object-Count: 0
< X-Container-Meta-Web-Error: error.html
< X-Container-Read: .r:*
< X-Container-Bytes-Used: 0
< X-Container-Meta-Web-Index: index.html
< Content-Length: 0
< Date: Fri, 24 Jun 2011 02:02:37 GMT
[/shell]

[shell]
■ コンテンツの準備

nemf@ubuntu:~$ echo hello world > index.html
nemf@ubuntu:~$ echo error > error.html
■ コンテンツアップロード

nemf@ubuntu:~$ st -A http://127.0.0.1:8080/auth/v1.0 -U test:tester -K testing upload web index.html
index.html
nemf@ubuntu:~$ st -A http://127.0.0.1:8080/auth/v1.0 -U test:tester -K testing upload web error.html
error.html
■ コンテンツ確認

nemf@ubuntu:~$ curl http://localhost:8080/v1/AUTH_ca833f08-9319-4692-8752-99bdaf2da74a/web
<html>
 <head>
  <title>301 Moved Permanently</title>
 </head>
 <body>
  <h1>301 Moved Permanently</h1>
  The resource has been moved to <a href="http://localhost:8080/v1/AUTH_ca833f08-9319-4692-8752-99bdaf2da74a/web/">http://localhost:8080/v1/AUTH_ca833f08-9319-4692-8752-99bdaf2da74a/web/</a>;
you should be redirected automatically.


 </body>
</html>

URLの最後に、’/’ をつける必要があるみたいですね。気を取り直して、再度チャレンジ。

nemf@ubuntu:~$ curl http://localhost:8080/v1/AUTH_ca833f08-9319-4692-8752-99bdaf2da74a/web/
hello world

うまく表示されました。 インデックスの設定がちゃんと有効になっていますね。念のため、絶対パスで指定してアクセスしてみる。

nemf@ubuntu:~$ curl http://localhost:8080/v1/AUTH_ca833f08-9319-4692-8752-99bdaf2da74a/web/index.html
hello world

問題ありませんね。

index.html を削除してみて、ディレクトリのリスト表示が有効になっているか確認

nemf@ubuntu:~$ st -A http://127.0.0.1:8080/auth/v1.0 -U test:tester -K testing delete web index.html
index.html

nemf@ubuntu:~$ curl http://localhost:8080/v1/AUTH_ca833f08-9319-4692-8752-99bdaf2da74a/web/
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <title>Listing of /v1/AUTH_ca833f08-9319-4692-8752-99bdaf2da74a/web/</title>
  <style type="text/css">
   h1 {font-size: 1em; font-weight: bold;}
   th {text-align: left; padding: 0px 1em 0px 1em;}
   td {padding: 0px 1em 0px 1em;}
   a {text-decoration: none;}
  </style>
 </head>
 <body>
  <h1 id="title">Listing of /v1/AUTH_ca833f08-9319-4692-8752-99bdaf2da74a/web/</h1>
  <table id="listing">
   <tr id="heading">
    <th class="colname">Name</th>
    <th class="colsize">Size</th>
    <th class="coldate">Date</th>
   </tr>
   <tr class="item type-text type-html">
    <td class="colname"><a href="error.html">error.html</a></td>
    <td class="colsize">6</td>
    <td class="coldate">2011-06-24 02:04:12</td>
   </tr>
  </table>
 </body>
</html>

ちょっとわかりにくいと思いますので、スクリーンショットも参考までに。

今度は、存在しないコンテンツへのアクセス。 error.html の内容が表示されることを期待してみる。

nemf@ubuntu:~$ curl http://localhost:8080/v1/AUTH_ca833f08-9319-4692-8752-99bdaf2da74a/web/ll
<html>
 <head>
  <title>404 Not Found</title>
 </head>
 <body>
  <h1>404 Not Found</h1>
  The resource could not be found.<br /><br />
</body>
</html>

ありゃりゃ。じゃ、error.html を直接確認してみる。

nemf@ubuntu:~$ curl http://localhost:8080/v1/AUTH_ca833f08-9319-4692-8752-99bdaf2da74a/web/error.html
error

これは問題ないですね。ということで、ドキュメントを見直してみる。

X-Container-Meta-Web-Error

If X-Container-Meta-Web-Error is set, any errors (currently just 401 Unauthorized and 404 Not Found) will instead serve the …/ object. For instance, setting X-Container-Meta-Web-Error: error.html will serve …/404error.html for requests for paths not found.

$ st -A http://127.0.0.1:8080/auth/v1.0 -U test:tester -K testing post -m 'web-error:error.html' web

上記は、suffix を error として設定しているだけでしたね。ということで実際は、エラーコード+error.html というオブジェクトをアップロードする必要があるということですね。

ということで早速修正してアップしてみます。

■ 404 用のコンテンツをアップロード

 nemf@ubuntu:~$ st -A http://127.0.0.1:8080/auth/v1.0 -U test:tester -K testing upload web 404error.html
404error.html

■ 存在しないコンテンツへアクセス

nemf@ubuntu:~$ curl http://localhost:8080/v1/AUTH_ca833f08-9319-4692-8752-99bdaf2da74a/web/hoge
error

お、ちゃんと動きました。今のところ、対応しているエラーコードは、401, 404 だけとのことです。

まとめ

今回は、Swift 1.3 staticweb を試してみました。意外と簡単でしたので、お試しを。

個人的には特に使わない機能ですがw。

参考

Misc/StaticWeb — Swift v1.4.2-dev documentation

Related Posts Plugin for WordPress, Blogger...

Filed under: cloud · Tags: , , ,

Leave a Reply

*