サーバのデータバックアップをAmazon S3に置く

以前は自宅サーバからさくらのVPSのバックアップをrsyncなどで取得していたんだけど、自宅サーバをRaspberry Piに置き換えた機会に自宅サーバの事業仕分けを行った結果、バックアップはさくらのVPSから直接Amazon S3に置くことにした。

Amazon S3を使う

AWSを使うにはAmazonのアカウントが必要になるけど、もともと商品検索API(Product Advertising API)でアカウントを持っていた。

Amazon S3では Bucket という単位でストレージを管理する。BucketはS3 Management Consoleから生成、管理できる。

Bucketを作る際のポイントとしては、

  • Bucket Name全ユーザで一意 である必要がある
  • Bucketにあるファイルを独自ドメインで公開したい場合は、 Bucket Nameをホスト名を一致させる必要がある
    • 例えば、static.example.com というホスト名で運用したい場合、Bucket Nameを static.example.com にする
  • RegionTokyo にする

といったあたりか。今回のバックアップデータ置き場としてはHTTPで公開しないのでBucket Nameは com-example-backup のようにドメインを逆向きにして使った。

Chefでs3cmdをセットアップ

Amazon S3へのバックアップ方法を調べると、s3syncやs3cmdといったツールを使う記事が見つかる。結局、どっちがメジャーなのかよくわからなかったんだけどDebianだと apt-get install s3cmd で入るので s3cmd を使うことにした。というかChefのレシピ書いた。

s3cmdはまず s3cmd --configure~/.s3cfg に構成ファイルを作って使うので、その代わりとしてChefのtemplateリソースでファイルを配置するようにした。このテンプレートは1.1.0-beta3のs3cmd --configureでできたファイルを元にした。具体的にはキーの所を変数を参照するようにして、locationをap-northeast-1に変更した。

templates/default/s3cmd/s3cfg.erb
[default]
access_key = <%= node[:aws][:access_key] %>
bucket_location = ap-northeast-1
cloudfront_host = cloudfront.amazonaws.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 = s3-ap-northeast-1.amazonaws.com
host_bucket = %(bucket)s.s3-ap-northeast-1.amazonaws.com
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 = <%= node[:aws][:secret_key] %>
send_chunk = 4096
simpledb_host = sdb.amazonaws.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
recipes/s3cmd.rb
package 's3cmd'

template "/home/#{node[:aws][:user]}/.s3cfg" do
  source "s3cmd/s3cfg.erb"
  mode 0600
  owner node[:aws][:user]
  group node[:aws][:user]
end

Debian(Vagrant)上で動作確認済み。

attributes/default.rb
default[:aws][:user] = ''
default[:aws][:access_key] = ''
default[:aws][:secret_key] = ''

あたりを設定してください。

バックアップ

s3cmd ls でBucket一覧が取れる。

s3cmd putscpのようなものだと思う。rsyncのようなs3cmd syncもあるようだ。

ファイルを置くには以下のようにコマンドを実行する。

s3cmd put <file> s3://<bucket-name>[/<prefix>]

とりあえず動いた。S3の料金体系は便利な計算ページがあるんだけど、それでもよくわからない。Amazon S3はそんなに高くはなさそうだけど通信量で計算されるので週一くらいの間隔でcron回してバックアップしようかと思う。

まぁさくらのVPS自体もさくらインターネット側でバックアップしてくれてると思うしね。