読者です 読者をやめる 読者になる 読者になる

S3Sync.rbでS3にファイルをバックアップする

震災の影響で突発的な停電の可能性もありAmazon S3へのバックアップ環境を構築しました。S3にローカルファイルをアップロードするプログラムはいくつかありますが、オープンソースのもの中心にいくつか試してみた限りは以下がよさそうです。

s3sync.rbは、S3に対してrsyncのような使い方のできるRubyスクリプトです。s3fsはS3をファイルシステムとしてマウントするプログラムで、ローカルとの同期をとるためであればrsyncとあわせて使うことになると思います。s3fsの方がS3を意識せずプログラムからは透過的にアクセスできるのがメリットですが、、今回はWindows環境でも使えるs3sync.rbを使いました。
最後のCyberduckはS3にも対応したFTPクライアントでフォルダの同期機能もあります。WindowsでGUIから操作したい場合にはこれがよさそうです。

セットアップ

S3のアカウントの作成やアクセスキーIDの取得については省略します。s3sync.rbの使い方ですが、まずRubyがインストールされていない場合にはインストールします。以下はUbuntuの手順ですが、Windowsでも使えます。

$sudo apt-get install ruby

S3Sync.rbをダウンロードして/usr/local/shareに展開します。

$wget http://s3.amazonaws.com/ServEdge_pub/s3sync/s3sync.tar.gz
$tar zxf 3sync.tar.gz
$sudo mv s3sync /usr/local/share

READMEにあるとおり、s3sync.rbでは以下のいずれかの方法で、アクセスキーID等を指定する必要があります。

  1. 環境変数
  2. $S3CONF/s3config.yml
  3. $HOME/.s3conf/s3config.yml
  4. /etc/s3conf/s3config.yml

今回は/etc/s3conf/s3config.ymlで設定します。

$mkdir /etc/s3conf
$cp /usr/local/share/s3sync/s3config.yml.example /etc/s3sync/s3config.yml

s3config.ymlの内容を変更します。

aws_access_key_id: 11111111111111111111111
aws_secret_access_key: 222222222222222222222
# USリージョン以外で必要
aws_calling_format: SUBDOMAIN
# 以下はymlではなぜか反映されなかったので環境変数で指定
# s3sync_native_charset: UTF-8

Ubuntuの場合には、s3sync_native_charsetを指定しないと文字化けします。デフォルトはISO-8859-1のようです。

アップロード

s3sync.rb -r --delete -v /home/foo/ bucket名:backup --exclude="trashbox"

このコマンドでは、/home/fooにあるファイルを再帰的に、指定したbucketのbackupというフォルダにアップロードし、ローカルに存在しないファイルは削除します。excludeにはアップロード対象外のファイルを正規表現で指定します。

データ量が多いと初回アップロードにかなり時間がかかります。50GBくらいで数時間待っても終わりません。。ローカルでもバックアップは取っているので、cronで週一回同期させようかと思います。

また、バックアップのような用途だとストレージの冗長性はそれほど必要ないので、料金がお安いReduced Redundancy Storageを使いたいところです。これもいずれ試してみようと思います。 99.999999999%→99.99%で価格は$0.150/GB→$0.100/GBになります。

注意

アップロード対象の指定でfooの後のスラッシュを省略するとfooフォルダもS3に作成されます。移動やリネームはAWSコンソールやCuberduckのようなソフトでは可能ですが、実際の動作は削除してから再アップロードになり、時間や費用の無駄になるので慎重に行った方がよいです。まずは"-n"(--dry-run)オプションをつけてアップロードされるファイルを確認することをお勧めします。

Windowsで実行する場合ですが、アップロード対象の指定のパス区切りに"\"ではなく"/"を使う必要があります。"\"を使うとアップロード自体は可能ですが、"\"がパスの区切りと認識されず、アップロード先のフォルダ名に"\"が含まれてしまいます。

??

s3sync.rbからアップロードしたデータをAWSのコンソールで見ると、フォルダ名と同じ名前の空のファイルが作成されているように見えます。Cyberduckでは見えません。また、コンソールから作成したフォルダはs3sync.rbや同梱されているs3cmd.rbからは参照できませんでした。。