Articles Comments

ちからの備忘録的日記 » cloud » OpenStack Swift S3互換API(Swift3) を試してみる

OpenStack Swift S3互換API(Swift3) を試してみる




Swift S3互換APIとは

Misc — Swift v1.3.0 documentation#Swift3」から引用。

S3 REST API を Swift でエミュレーションするAPIとのことです。現状サポートしているAPIは、以下の通り。

  • GET Service
  • DELETE Bucket
  • GET Bucket (List Objects)
  • PUT Bucket
  • DELETE Object
  • GET Object
  • HEAD Object
  • PUT Object
  • PUT Object (Copy)

おそらくアカウント、ユーザの考え方が Swift と S3 では異なるので、いろいろ制限事項があるようです。たとえば、ユーザ跨ぎのオブジェクトコピーはいけるが、アカウント跨ぎでのオブジェクトコピーができないなど。

Swift S3互換API を使うために必要な設定

Misc — Swift v1.3.0 documentation#Swift3には変更の必要性の記載はあるが、変更方法が記載されていません。。。

Question #154332 : Questions : OpenStack Object Storage (swift)」の情報を元に記載します。

proxy-server.conf の変更

[pipeline:main]
# 順番が重要です。必ず以下のように記載してください。
pipeline = healthcheck cache swift3 swauth proxy-server

# こちらは単純に追加
[filter:swift3]
use = egg:swift#swift3

設定を変更したら、proxy-server を再起動して変更を反映させます。

$ swift-init proxy restart

以上で、S3 互換API を使うためのサーバ側の設定は完了です。

さっそくS3クライアントからつないでみる

s3curl が一番手軽ですので、これで試してみます。

s3curl インストール・設定

# wget http://s3.amazonaws.com/doc/s3-example-code/s3-curl.zip
# unzip s3-curl.zip
# cd s3-curl
# chmod +x s3curl.pl

自分の swift 用に s3curl.pl の endpoints を編集します。

■ 修正前

 28 # begin customizing here
 29 my @endpoints = ( 's3.amazonaws.com',
 30                   's3-us-west-1.amazonaws.com',
 31                   's3-eu-west-1.amazonaws.com',
 32                   's3-ap-southeast-1.amazonaws.com',
 33                   's3-ap-northeast-1.amazonaws.com' );

■ 修正後

 28 # begin customizing here
 29 #my @endpoints = ( 's3.amazonaws.com',
 30 #                  's3-us-west-1.amazonaws.com',
 31 #                  's3-eu-west-1.amazonaws.com',
 32 #                  's3-ap-southeast-1.amazonaws.com',
 33 #                  's3-ap-northeast-1.amazonaws.com' );
 34 my @endpoints = ( '10.200.11.139' );

次の変更は必要な人だけ実施しましょう。s3curl は、コマンドオプションにID,KEYを渡せますが、警告&スリープが入ります。ちょっとうざいので、これを削除します。

■ 修正前

118 if ($cmdLineSecretKey) {
119     printCmdlineSecretWarning();
120     sleep 5;
121
122     $secretKey = $cmdLineSecretKey;

■ 修正後

118 if ($cmdLineSecretKey) {
119     #printCmdlineSecretWarning();
120     #sleep 5;
121
122     $secretKey = $cmdLineSecretKey;

s3curl を使ってみる

とりあえず、自分のバケットを確認してみます。
s3curl の使い方については、「s3curl – Eucalyptus」を参考にしました。

$ ./s3curl.pl --id test:tester --key testing -- -s -v https://10.200.11.139:8080/ -k  | xmlindent
* About to connect() to 10.200.11.139 port 8080 (#0)
*   Trying 10.200.11.139... connected
* Connected to 10.200.11.139 (10.200.11.139) port 8080 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using AES256-SHA
* Server certificate:
*        subject: C=AU; ST=Some-State; O=Internet Widgits Pty Ltd
*        start date: 2011-06-16 03:43:21 GMT
*        expire date: 2012-06-15 03:43:21 GMT
* SSL: unable to obtain common name from peer certificate
> GET / 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: 10.200.11.139:8080
> Accept: */*
> Date: 木, 15  9月 2011 02:35:47 +0000
> Authorization: AWS test:tester:QuPcdYFn3eTezY9dcnICVuAz40A=
>
< HTTP/1.1 200 OK
< Content-Type: text/xml; charset=UTF-8
< Content-Length: 153
< Date: Thu, 15 Sep 2011 02:35:48 GMT
<
* Connection #0 to host 10.200.11.139 left intact
* Closing connection #0
* SSLv3, TLS alert, Client hello (1):
<?xml version="1.0" encoding="UTF-8"?>
<ListAllMyBucketsResult xmlns="http://doc.s3.amazonaws.com/2006-03-01">
    <Buckets>
        <Bucket>
        </Bucket>
    </Buckets>
</ListAllMyBucketsResult>

とくにバケットを準備していないので、バケットがありません。面白くないので、testBucket を作成してみます。

./s3curl.pl --id test:tester --key testing --put /dev/null -- -s -v https://10.200.11.139:8080/testBucket -k  | xmlindent
* About to connect() to 10.200.11.139 port 8080 (#0)
*   Trying 10.200.11.139... connected
* Connected to 10.200.11.139 (10.200.11.139) port 8080 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using AES256-SHA
* Server certificate:
*        subject: C=AU; ST=Some-State; O=Internet Widgits Pty Ltd
*        start date: 2011-06-16 03:43:21 GMT
*        expire date: 2012-06-15 03:43:21 GMT
* SSL: unable to obtain common name from peer certificate
> PUT /testBucket 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: 10.200.11.139:8080
> Accept: */*
> Date: 木, 15  9月 2011 02:48:47 +0000
> Authorization: AWS test:tester:2eMvcGi16mCOthra0nMSSDLPsE4=
> Content-Length: 0
> Expect: 100-continue
>
< HTTP/1.1 200 OK
< Content-Type: text/html; charset=UTF-8
< Content-Length: 0
< Location: https://10.200.11.139:8080/v1/AUTH_0b3bf0b9-28be-410a-b57b-53b80e13e562/testBucket
< Date: Thu, 15 Sep 2011 02:48:51 GMT
<
* Connection #0 to host 10.200.11.139 left intact
* Closing connection #0
* SSLv3, TLS alert, Client hello (1):
&#91;/xml&#93;

testBuket が作成されたことを確認します。

&#91;xml&#93;
./s3curl.pl --id test:tester --key testing -- -s -v https://10.200.11.139:8080/ -k  | xmlindent
* About to connect() to 10.200.11.139 port 8080 (#0)
*   Trying 10.200.11.139... connected
* Connected to 10.200.11.139 (10.200.11.139) port 8080 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using AES256-SHA
* Server certificate:
*        subject: C=AU; ST=Some-State; O=Internet Widgits Pty Ltd
*        start date: 2011-06-16 03:43:21 GMT
*        expire date: 2012-06-15 03:43:21 GMT
* SSL: unable to obtain common name from peer certificate
> GET / 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: 10.200.11.139:8080
> Accept: */*
> Date: 木, 15  9月 2011 02:50:25 +0000
> Authorization: AWS test:tester:PPcrSj+4VoYMBQQljaNuAIqCTd4=
>
< HTTP/1.1 200 OK
< Content-Type: text/xml; charset=UTF-8
< Content-Length: 246
< Date: Thu, 15 Sep 2011 02:50:25 GMT
<
* Connection #0 to host 10.200.11.139 left intact
* Closing connection #0
* SSLv3, TLS alert, Client hello (1):
<?xml version="1.0" encoding="UTF-8"?>
<ListAllMyBucketsResult xmlns="http://doc.s3.amazonaws.com/2006-03-01">
    <Buckets>
        <Bucket>
            <Name>testBucket</Name><CreationDate>2009-02-03T16:45:09.000Z</CreationDate>
        </Bucket>
    </Buckets>
</ListAllMyBucketsResult>

testBucket が作成されたことが確認できました。作成日付がおかしい(2年前・・・)のはみなかったことにしますw。QAのページに表示されていたときの作成日付と同じなので、おそらくハードコーディングなのでしょう。

まとめ

ざっと s3 互換 api を使ってみた感想ですが、基本機能はなんとなく動くが仕事では使えない出来だと思います。今回試したバージョンが Cactus ですので、Diablo になってもっとちゃんと実装されていれば別ですが、まだ厳しそうです。

Related Posts Plugin for WordPress, Blogger...

Filed under: cloud · Tags: , , , ,

Leave a Reply

*