Amazon S3をバックアップ先として使ってみる

Amazon S3 申し込み

基本情報取得
  • 右上の「Your Web Services Account」にマウスを合わせるとポップアップ
  • View Access Key Identifiersを選択
  • 二種類の情報が得られる
  • X.509 Certも入手できるのでHTTPSとかはこれを使うのがよい

secret Access Keyは再生成することもできる

構成要素
  • Objects:
    • データ自体
  • Buckets:
    • objectを格納する箱。bucket入れ子にできない
    • bucketの名前はAmazon S3の中で一意。誰かがdbとか取ったら他の人は使えない
    • 一つのbucketに入れるObjectの数に制限はない
    • 一人の開発者が作れるbucket数は100まで
  • Keys:
    • Objectの識別子。そのobjectを格納しているbucketの中で一意
ディレクトリ?

buckets内はフラット構造になっているため、ディレクトリ構造はない、みたい。

しかし、多くのソフトウェアではKeyに"/"を区切り文字に使うことで、擬似的にディレクトリ構造を実現している。

ただし、調べた中ではJungleDiskは"."で区切ったり、先頭に数字を付けるなど、独自の構文を使っているみたいだ。(だから互換性が低いとも言える)

ACL (Access Control List)
  • private
  • public-read
  • public-read-write
  • authenticated-read

の4つ。

ForkLiftでは後からの変更が可能。s3sync.rbは後からの変更は今のところできない。ファイルを送るときにできるのも、publicにすることだけ。(適当にコードをいじればたぶん可能)

Amazon S3 実際に使ってみる

s3sync.rb (http://s3sync.net/wiki)
  • S3に再帰的にアップロードする

s3sync.rb -v -r /path/to/data bucketname:data/

  • S3から再帰的にダウンロードする

s3sync.rb -v -r bucketname:data/ /path/to/data

bucketname:/backup/ としないこと。ForkLiftでみると落ちるようになる。

s3config.yml

s3config.ymlというファイル(sampleも付いている)にAccess KeyとSecret Keyを書いておけば、s3syncもs3cmdも自動的にこのファイルから読み込んでくれるので便利。

s3cmdのput/getの引数の順番

s3cmd.rbは、put/getの両方とも同じ引数の順番なことに注意。必ず最初にS3のbucketnameが来る。

  • s3cmd.rb get BucketName:TheFileOnS3.txt ALocalFile.txt
  • s3cmd.rb put BucketName:TheFileOnS3.txt ALocalFile.txt

1.0GBのディレクトリを丸ごと転送してみた。

かかった時間はだいたい1時間半。

28.71s user 24.42s system 1% cpu 1:21:25.59 total

1.4Gのディレクトリで

37.61s user 32.42s system 0% cpu 2:24:21.43 total

まあ、こんなのたいして参考にはならないけどいちおう。しかし遅いなぁ。

ForkLift (http://www.binarynights.com/)

15-day trialを使用。(買うと$29.95)

  • 1. メニューの "Go" から Amazon S3を選択
  • 2. Access Key と Secret Access Key を入力
  • 3. Windowに現れる

トップでフォルダを作成することでbucketが作れるみたいだ。

ただし、s3sync.rbで bucketname:/hoge/ というように、/を先頭に付けたディレクトリを作ってしまうとForkLiftごと落ちてしまう。

Access Controlを変える

  • ファイルを選択し、GetInfoを選ぶ
  • 一番下に「Access Control」があるのでAccess Policyを選ぶ
JungleDisk (http://www.jungledisk.com/)
  • Access KeyとSecret Acess Keyの二つを入力
  • EncyptSettingで暗号化しない(Do not encrypt files)を選択
    • あとで別のs3syncとかからいじれるように
  • Bucket Nameは"pictures"にする
    • できたみたい。別にBucket Nameは共通じゃないのかな?
    • と思ったら、 9323ed955AAAAA6057dea858-pictures みたいなのができた
    • 内部構成も JungleDisk 独自形式がいっぱいみたいだ。
  • mountされる
    • /Volumes/JungleDisk
    • /Volumes/JungleDiskBetaUncompressed

普通にcp -r とかいけた感じ。

注意:

どうもJungleDiskは、他のツールとは違って、独自の形式で中身を作るみたい。従って、

  • JungleDiskで作ったbucketは頭に固有IDっぽいのが付く
    • 付くが、junglediskを経由しているとその部分は見えない
  • ForkLiftで作ったbucketはJungleDiskでは見えない
    • s3sync.rbでは見えた

JungleDiskだけで完結させるのならば構わないだろうが、他のツールと一緒にとなるとJungleDiskは避けた方がよさそうだ。

rsh3ll (http://rubyforge.org/projects/rsh3ll/)

対話型なんだけど、host、user、passコマンドを使って設定して、listbucketsを行っても、listを行ってもなにも出ない。むふー。

お金はどれぐらいかかるの?

今回の転送コスト。

  • 転送容量: 3.409GB
  • 転送コスト: $0.35 ($0.10 per GB)
    • out: $0.01 (0.014GB)
  • PUT or LIST request: $0.08 (7502 Requests)
  • GET: $0.01 (39 Requests)
  • 合計: $0.45

$0.45ってことは、119円換算で53円。安い…。

今回は写真を貯めておくために使おうと思っているので、転送コストはあんまり考えないとし、今回の転送では0.4GBぐらいテストで無駄なのを送ってしまっているが、まあざっくり保持容量を4Gとして、

4GB * $0.15 per GB-Month = $0.6 = 71.4円/month

仮にあと10GB増えたとして、

14GB * $0.15 = $2.1 = 250円/month

これなら全然問題ないね。

今後の展開

ZFSのスナップショットをamazon S3で保持することで、ネットワーク上にバックアップを保持することが容易に出来るのではないかと考える。

と思ったら、すでにそういう人がいた。まあ当たり前か

基本的に

  • 1. スナップショットを取る
  • 2. 圧縮してファイルにする
  • 3. Amazon S3に送る

だけでよい。