IIJ GIOストレージサービス FV/Sでs3cmdを使えるようにしたら幸せになれた

IIJGIOさん@のご好意で、IIJ GIOストレージサービス FV/S*1を試用させていただいた。
パフォーマンスの話や活用方法などは、3月に改めてまとめる予定。

一点、検証中に必要に迫られてs3cmdを使えるようにしてみたので、そこだけ先行してまとめておく。
s3cmd*2とは、Amazon S3*3を、コマンドラインで操作できる便利ツールである。
Ruby版とかPython版とかいろいろあるっぽい。上記はPythonで動くやつ。

IIJ GIOストレージサービス FV/Sは、Amazon S3相当のREST APIインターフェースを持つストレージサービスであるが、Amazon S3特有のURLやヘッダが決め打ちで埋め込まれてるs3cmdは、そのままではIIJ GIOストレージサービス FV/Sでは使えない。

まずアクセス先が違ったらどうもならないので、~/.s3cfg を書き換える。

[default]
access_key = 契約時に発行されるアクセスキー
bucket_location = US
cloudfront_host = gss.iijgio.com
default_mime_type = binary/octet-stream
delete_removed = False
dry_run = False
enable_multipart = True
encoding = UTF-8
encrypt = False
follow_symlinks = False
force = False
get_continue = False
gpg_command = /usr/bin/gpg
gpg_decrypt = %(gpg_command)s -d --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
gpg_encrypt = %(gpg_command)s -c --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
gpg_passphrase =
guess_mime_type = True
host_base = gss.iijgio.com
host_bucket = %(bucket)s.gss.iijgio.com
service_path =
human_readable_sizes = False
invalidate_on_cf = False
list_md5 = False
log_target_prefix =
mime_type =
multipart_chunk_size_mb = 15
preserve_attrs = True
progress_meter = True
proxy_host =
proxy_port = 0
recursive = False
recv_chunk = 4096
reduced_redundancy = False
secret_key = 契約時に発行されるシークレットキー
send_chunk = 4096
simpledb_host = gss.iijgio.com
skip_existing = False
socket_timeout = 300
urlencoding_mode = normal
use_https = True
verbosity = WARNING
website_endpoint = http://%(bucket)s.s3-website-%(location)s.amazonaws.com/
website_error =
website_index = index.html

website_* は今回使わないと思ったのでノータッチ。

しかし、上記修正でbucketのリストを取得してみると、エラーで取得できない。

$ s3cmd ls
ERROR: S3 error: 403 (AccessDenied): Authentication requires a valid Date or x-iijgio-date header

有効な日付か、x-iijgio-date ヘッダーを送りなさい、とのことらしい。
(s3cmd ls --debug にするとサーバとのやり取りがわかりやすい)
契約時に頂けるAPIリファレンスには、このあたりのルールは詳しく記載してある。

Amazon S3ではヘッダは x-amz-* となっているようなので、s3cmdのソースに含まれる x-amz- を x-iijgio- にさっくり置換する。
s3cmd
S3/S3.py
S3/CloudFront.py
に埋まっていた。

前述のdateヘッダーはここらへんにある。時刻重要なのできちんとntpなどで合わせておく。

--- s3cmd_original/s3cmd/S3/S3.py       2013-01-23 13:49:38.332647080 +0900
+++ s3cmd/S3/S3.py      2013-01-22 12:10:37.313116187 +0900
@@ -70,7 +70,7 @@
     def update_timestamp(self):
         if self.headers.has_key("date"):
             del(self.headers["date"])
-        self.headers["x-amz-date"] = time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime())
+        self.headers["x-iijgio-date"] = time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime())

その他 Authorizationヘッダ作成部分に "AWS" が埋まっている箇所を、APIリファレンスに添って "IIJGIO" に変更。
修正が終わったらs3cmdを作りなおす。

すると

$ s3cmd ls --debug
(略)
DEBUG: Sending request method_string='GET', uri='/', headers={'content-length': '0', 'Authorization': 'IIJGIO ほげほげ', 'x-iijgio-date': 'Wed, 23 Jan 2013 16:10:46 +0000'}, body=(0 bytes)
DEBUG: Response: {'status': 200, 'headers': {'x-iijgio-id-2': 'ふがふが', 'date': 'Wed, 23 Jan 2013 16:10:46 GMT', 'content-length': '440', 'x-iijgio-request-id': 'へろへろ', 'content-type': 'application/xml'}, 'reason': 'OK', 'data': '(略)'}

と幸せになれる。

s3cmd sync --debug --delete-removed ./hoge(空のディレクトリ) s3://piyo/fuga

bucketを掃除したり

s3cmd sync --debug s3://piyo/fuga ./hoge

bucketの中身をごっそり./hogeに持ってきたりできるので、検証時にとても楽ちん。

IIJ GIOストレージサービス FV/Sは、GB単価は他社に比べて高めで、容量を事前に契約するので容量のスケールがしにくい(契約容量以上は書き込めない)けれど、トラフィックには課金されないし契約内容で費用が固定されるので見積もり取得→予算化しやすいし、今回試した環境では国内の他社のサービスに比べてだいぶ高速だったので、特定の用途にはとても使いやすいサービスなのじゃないかという印象を持った。