Amazon Glacierのメモ

来週月曜はこのサイトにアクセスできないかもしれません。

写真類のバックアップ先をGlacierに変えようと思って少し使ってみている。Tokyoリージョン(ap-northeast-1)でも使えるのはでかい。

Glacierは1GBにつき月1円という低価格のストレージ。S3の1/10くらい。Tokyoだと2割増で1.2円くらいだが、とにかく安い。写真データ自体は100GB程度だが、最近は普通に低価格のVPSを借りても100GBくらいのストレージをくれるが、たいてい月1000円くらい固定でかかる。VPSの場合はサーバ向けだから、使っても使わなくてもかかる。これが100円くらいになって、しかもAWSだから当然、大小無限にスケールして使っているぶんだけしかかからない。

しかし、Glacierの扱いはテープのように厄介だ。読みだすのに数時間かかったりする。ただアップロード自体は充分に速い。アップロードが完了してからアーカイブという状態になるまでに数時間。そしてアーカイブをダウンロードする場合は、ダウンロード可能な状態にステージングする必要があり、これも数時間。そこから24時間以内にダウンロードすればリストアできる、というしくみ。我々の職場ではこういうのを見ると、どうしてもサービスの実現方法を想像して楽しむわけだが、現在最も有力な仮説は「Amazonの倉庫で高校生のバイトがテープを持って走り回っている」というもの。けっこう本気でそう思ってますが…なんというか、夢が広がりますね。

  • archive…ファイルという意味。リクエスト課金があるので、複数のファイルを1個のアーカイブにまとめたほうが安上がりになる。アーカイブは分割アップロード/ダウンロードができて、並列に動かしたほうがスループットが出る模様
    • アーカイブにクライアント側が名前をつけることはできなくて、アップロードしたときに帰ってくるIDをユーザが保管していなければならない
    • IDは138バイトの文字列で、ところどころ読めたり区切り文字があったりする
  • vault…貯蔵庫という意味の単語で、バックアップ屋さんはよくこの単語を使うのだが、アーカイブを複数入れられるハコ。vault自体はアカウントにつき1000個までしか作れない。例えば「写真」「ドキュメント」とかそういう単位で分類するときに使えばいいだろう
    • vaultは中のarchiveを全て削除してからでなければ削除できない
    • vaultの属性として、Amazon SNSという通知サービスに変更を登録できる。Amazon SNSからはメールとかで通知が来るように設定できる。メールの内容にJSON形式のデータとunsubscribeの案内をするフッタが入っている
  • inventory…目録という意味の単語で、vaultに含まれるarchiveのリストが得られるようだ。archiveにユーザがメタデータをつけられるのかな?(ここらへんはよく調べていない)
    • インベントリを得るのにも数時間かかる。アーカイブをアップロードしてからインベントリに反映されるまでが数時間。

Amazon公式のツールもあるようだが、glacier-cliというPythonで書かれたプログラムがあって、それを使う人が多いようだ。mt-aws-glacierというPerlで書かれたプログラムもある。

AWSの流儀に従って、機能を使うときはIAMのユーザ管理からaccess key/secret access keyを払い出してもらって、それを使う。

glacier-cliについて

  • botoというPythonからAWSのAPIを叩くライブラリのGlacier対応ブランチを利用。access key/secret access keyは環境変数で設定する。regionはコマンドラインから指定する
  • usage: glacier.py [-h] [–region REGION] {vault,job,archive} …
  • vault createでvaultの作成、vaultの削除はGlacierのコンソールでブラウザからやってください
  • archive upload [–name NAME] vault fileでアップロード。名前がつけられるようなインタフェースだが、名前とIDの対応は~/.cache/glacier-cli/dbというSQLiteのDBで管理している。
# sqlite3 ~/.cache/glacier-cli/db
SQLite version 3.6.20
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .schema
CREATE TABLE archive (
        id VARCHAR NOT NULL,
        name VARCHAR,
        vault VARCHAR NOT NULL,
        "key" VARCHAR NOT NULL,
        last_seen_upstream INTEGER,
        created_here INTEGER,
        deleted_here INTEGER,
        PRIMARY KEY (id)
);

  • idがAWSがつけたID、nameがユーザがつけた名前。nameのほうをダウンロードの時に指定できる。省略するとファイル名がnameになる。IDを直接指定してダウンロードをするオプションはないようだった。
  • vault syncでAWS側からインベントリ情報を取ってきてローカルのDBに反映させる
  • archive list vault-nameでアーカイブのリストが得られる。これはAWS側では数時間かかる処理で、glacier-cliはローカルのDBを参照しているだけ
  • archive retrieve vault-name archive-name…でリストア。nameと同じファイルにダウンロードされるが、-o FILENAMEでリストア先を指定することもできる。もちろん、ダウンロード開始までに数時間かかるわけで、ジョブの状態になる。
  • job listでジョブのリストを表示。
a/d 2013-06-02T18:25:07.052Z vault1       id:Dxxxxxxxxxxxxxxxxxxx(略)
i/d 2013-06-03T10:22:52.691Z vault1
a/d 2013-06-03T12:31:31.545Z vault2       README.md

  • aがアーカイブ、iがインベントリかな。dが完了したという意味のようだ。
  • archive deleteでアーカイブの削除。一括削除はできないみたい?

まあ普通に使えます。DBでファイル名とアーカイブIDの対応付けをやっていて、DBの再構築もできるようだから、DBを必死に守るという必要もなさそうに作ってあるようだ。つまりこれって、アーカイブのメタデータ(x-amz-archive-description)にファイル名をエンコードして含ませているということなのかな?

glacier-cliは標準入力からデータを放り込む方法はないようだし、複数のファイルをまとめて1つのアーカイブに入れるという機能をつけるのもちょっと難しそうだ。Pythonなので中を見てやればいいって話なんだろうけど。

mt-aws-glacierについて

  • perl-JSON-XSが必要で、botoを要求するglacier-cliよりは楽
  • mtglacier helpでヘルプが表示される
  • DBではなくテキストファイルで名前とIDの対応付けを管理する。このファイルをjournalと呼んでいる
  • access key/secret access key/region等を設定ファイルに書ける。glacier-cliは指定を忘れるとデフォルトでオレゴンかなんかで作ろうとしてしまうので…
key=your_key
secret=your_secret_key
# regeon: Tokyo=ap-northeast-1
region=ap-northeast-1
protocol=http

  • 設定ファイルでvaultやjournalの指定をしてもいい
  • –config fileでこの設定ファイルを読みこんでくれる
  • サブコマンドがいくつか。
  • syncはローカルのディレクトリツリーとGlacierの内容を同期する。これは便利。比較はjournalファイルに書かれたファイルのSHA256値やタイムスタンプの情報と比較しているようだ
  • purge-vaultはarchiveを全て削除してvaultを削除する。journalに情報があるarchiveを全て削除という意味
  • restoreがダウンロード準備のジョブ投入
  • restore-completedが準備できたアーカイブをダウンロードする
  • Glacier側のIDを指定する方法はないみたい(?)
  • check-local-hashはsyncのdry-runみたいなもの
  • retrieve-inventoryはインベントリ情報の参照ジョブの投入
  • download-inventoryがインベントリ情報をjournal形式に変換して書きだす。glacier-cliのsyncサブコマンドと同じようなもの
  • create-vault/delete-vaultはvaultの作成と削除
  • upload-fileはアーカイブのアップロード。いろいろ必須オプションがある。サイズを指定させられたりする。
  • upload-fileは標準入力を受け付けるので、例えばtarでまとめてアップロード、みたいなこともできる
  • tar cf – dirname | mtglacier upload-file –config /path/to/config-file –journal /path/to/journal-file –vault vault-name –stdin –set-rel-filename name-of.tar –check-max-file-size szMB

ファイル名情報はglacier-cliとmt-aws-glacier間で互換性がない。glacier-cliでアップしたものをmt-aws-glacierでdownload-inventoryでメタデータを持ってきても正しいファイル名にならないし、逆にmt-aws-glacierでアップしたものをglacier-cli syncでメタデータを持ってきても、ファイル名を復元できない。

標準入力から持っていけるのはmt-aws-glacierが良い。投入したジョブのリストを見る機能はglacier-cliにしかない。ジョブが完了するまでポーリングする機能はどちらにもあるみたい。ファイル名情報の互換性がないので、どちらかを選んだら使い続けることになる。まあ自分でDB←→journalの変換を書けばいいのかもしれないが。

コメントを残す

メールアドレスが公開されることはありません。