upload は簡単だけど、 download は難しい、というのは、氷河っぽいところに物置いとけば勝手に氷漬けになるけど、それを解凍するのは大変ってことで Glacier の名前の通りだからいいのかな
ま、それはともかく結局 boto.glacier を使うことにしたので自分用にメモ。ドキュメントを翻訳すればいいんじゃないか疑惑もあるけど、これを書いてる時点で、ドキュメントは v2.5.2 なのに対しソフトは v2.6.0 なので、ソースを見たほうが正確だった(ありがち)ので…
- /etc/boto.cfg
- ~/.boto
みんな大好き .ini 形式の boto 設定ファイル。ここにまとまってるので読んで試すといいさ
- boto.glacier.connect_to_region(region_name, **kw_params)
region_name で指定したリージョンに接続して boto.glacier.layer2 を返してくれるみたい
- boto.glacier.layer2.get_vault(name)
name な vault を取得する。指定した名前の vault がない場合は boto.glacier.exceptions.UnexpectedHTTPResponseError が発生するみたい
- boto.glacier.layer2.create_vault(name)
name で指定した vault を作る。ということで
from boto.glacier.exceptions import UnexpectedHTTPResponseError try: vault = conn.get_vault("fuga") except UnexpectedHTTPResponseError: vault = conn.create_vault("fuga")
とかやるとなんにしろ fuga って名前の vault が拾えてそれっぽい?
- boto.glacier.vault.concurrent_create_archive_from_file(filename)
- boto.glacier.vault.create_archive_from_file(filename=None, file_obj=None, description=None)
- boto.glacier.vault.upload_archive(filename)
この三つは違いがよくわかんないんだけど、名前や解説からすると最初のは分割アップロードで速い、二番目は file-like object からもアップロードできる、最後のは普通にアップロードするけど 100MB 以上だったら分割アップロードするぜ、的な動作をするようです。 Glacier に高速アップロードをするニーズはなかったので、最後のを使うことにしたのデス
- boto.glacier.vault.retrieve_inventory()
vault 内にある archive 一覧を取得する job を作成する。archive_id を忘れた時に便利というか archive を全部削除しないと vault を消せないんだけど、テストで動かしたから archive id なんか残してねーよ、って時に便利(?)というか、それぐらいしか使い道なくない? list_job() とこれの違いが分らずこれを何度も実行して list_jobs() で大量の job が返ってくるハメになってしまった…。ちなみに実行してから成功/失敗というレベルの結果がわかるまできっちり 4 時間かかるですよ。
- boto.glacier.vault.list_jobs()
vault内にある job 一覧を取得する。jobs = vault.list_jobs() とかやって取得して loop させて頑張る感じ?
retrieve_inventory() を実行してから 4 時間後以降に
jobs = vault.list_jobs(completed=True) for job in jobs: if isinstance(job,boto.glacier.job.Job): if job.action == 'InventoryRetrieval': o = job.get_output() for archivelist in o['ArchiveList']: print archivelist['ArchiveId']
とかやると vault の中にあるアーカイブ ID が拾えて嬉しいかもしれない。
- boto.glacier.job.Job.get_output()
ファイルをダウンロードしてオブジェクトとして返す、っぽいんだけど現時点ではドキュメントに記載されていない boto.glacier.job.Job.download_to_file(filename) を使った方が多分幸せ。
- boto.glacier.job.Job.download_to_file(filename)
みたまんま。現時点では戻り値がないのでちょっと怖いかもしれないけど、 Glacier へのアップロードが成功した時点でファイルの整合性は保証されてる(というか整合性がとれないと失敗扱いになる)ので、取得したファイルが変だったらリトライすればいいんじゃないか的な発想でひとつ。
とまぁ、これだけわかれば Glacier に保存したり戻したりするプログラムが書けるんじゃないかなー?