Amazon EC2/S3を使ってみた - 8.EC2とS3のデータを同期させる(S3Syncを使う)

by Christopher Chan


Amazon EC2のインスタンスは一度シャットダウンしてしまうと、そのインスタンスで保持していたディスクの内容は全て消滅してしまいます。

そこで「Amazon EC2/S3を使ってみた - 3.EC2起動後〜AMI作成」では、自分でカスタマイズ&利用したインスタンスのイメージを、バックエンドのストレージであるAmazon S3に保存する方法を紹介しました。


しかし、これはOSのイメージをまるごとフルバックアップする方法に近いため、定期的に行うバックアップとしては非効率的な方法です。
定期的に行うべきなのは、サービスなどで日々更新されるような特定のデータやログなど、必要なデータをピンポイントでバックアップすることが効率的です。


そこで、今回は"S3Sync"を使ってみます。


この"S3Sync"は、(EC2に限らず)あるサーバからAmazon S3のストレージを操作するツールで、"rsync"のように特定のディレクトリとAmazon S3のストレージの任意の領域(ディレクトリ)を比較して、データを同期させることが可能となります。

インストールする

以下のような感じでインストールすればOKです。
尚、別途Rubyが必要となりますので、インストールしていない場合は、インストールしてください。
また、HTTPS接続の場合は、OpenSSLも必要となります。(詳細は、参考の項にあるリンク先からご確認ください)

$ wget http://s3.amazonaws.com/ServEdge_pub/s3sync/s3sync.tar.gz
$ tar zxvf s3sync.tar.gz
$ sudo cp -pr s3sync/ /usr/local/

↑はダウンロード ⇒ 解凍 ⇒ 配置といったところです。
配置場所は任意ですので、必要に応じて変更してください。
上記例では、"/usr/local/s3sync"に配置することとしました。

環境変数を設定する

"Access Key ID"と"Secret Access Key"を以下のように環境変数として設定します。

$ export AWS_ACCESS_KEY_ID='XXXXXXXXXXXXXXXXXXXX'
$ export AWS_SECRET_ACCESS_KEY='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

このように最低限、上記2つの環境変数を設定するとS3Sync.rbが実行可能となります。


尚、環境変数ではなく付属している"s3config.yml.example"を参考にして、設定ファイル(/etc/s3conf/s3config.yml)に記載しておくのも良いかと思います。
また、頻繁に利用される場合は、S3Syncの配置先にパスを通しておくと、に使いやすくなると思います。

ディレクトリ内のデータを再帰的にS3へアップロードする

同期させたい元データのあるディレクトリを"/path/to/data"、同期先のS3のバケット名を"bucketname"、そのバケット内の同期先となるディレクトリを"data"とすると、S3の同期先にアップロードするコマンドは以下となります。

$ ruby s3sync.rb -r /path/to/data bucketname:data/

ディレクトリ内のデータを再帰的にS3からダウンロードする

ダウンロードする場合は、アップロード同様に以下のコマンドとなります。
基本的に、引数の指定順序を逆にするだけで、rsyncと同じような感じですね。

$ ruby s3sync.rb -r bucketname:data/ /path/to/data

同期だけではなく、S3に保存しているデータを操作する

"S3Sync"に付属している「s3cmd.rb」を使うと、S3のデータを簡単に操作することが可能となります。
以下にヘルプコマンドの出力を貼り付けておきます。

$ ruby s3cmd.rb -h
s3cmd.rb [options] <command> [arg(s)]           version 1.2.6
  --help    -h        --verbose     -v     --dryrun    -n
  --ssl     -s        --debug       -d     --progress
  --expires-in=( <# of seconds> | [#d|#h|#m|#s] )

Commands:
s3cmd.rb  listbuckets  [headers]
s3cmd.rb  createbucket  <bucket>  [constraint (i.e. EU)]
s3cmd.rb  deletebucket  <bucket>  [headers]
s3cmd.rb  list  <bucket>[:prefix]  [max/page]  [delimiter]  [headers]
s3cmd.rb  location  <bucket> [headers]
s3cmd.rb  delete  <bucket>:key  [headers]
s3cmd.rb  deleteall  <bucket>[:prefix]  [headers]
s3cmd.rb  get|put  <bucket>:key  <file>  [headers]

基本的には、サブコマンド名が見たままの意味なので、直感的に扱えると思います。
私が良く使うのは、"list"とか"delete"、"deleteall"あたりですね。


例えば、、、

$ ruby s3cmd.rb list bucketname:data/

を実行すると、S3の"bucketname"バケットの"data"ディレクトリ内の、ディレクトリ・ファイル名の一覧がずらりと表示されます。

$ ruby s3cmd.rb delete bucketname:data/hoge.txt

を実行すると、S3の"bucketname"バケットの"data"ディレクトリ内の"hoge.txt"ファイルを削除します。

$ ruby s3cmd.rb deleteall bucketname:data/

を実行すると、S3の"bucketname"バケットの"data"ディレクトリ内の、ディレクトリ・ファイルを全て削除します。一気に複数のリソースを削除するコマンドなので、実行時に削除対象をよく確認するように注意してください。

参考

今回、"S3Sync"の使い方を少し紹介しましたが、詳細についてはS3Sync.net公式のREADME等をご参照ください。




まとめ

クラウドAMAZON EC2/S3のすべて (ITpro BOOKs)

クラウドAMAZON EC2/S3のすべて (ITpro BOOKs)