2010年11月27日土曜日

Amazon S3へのバックアップ

内容的にはいまさらですが、最近さくらインターネットの仮想専用サーバー VPS980(OSはCentOS 5.5)を使う機会があったので、そこのコンテンツをAmazon S3へバックアップするようにしました。

rsyncでもよかったのですが、更新頻度も頻度も高くないので。

バックアップするファイルサイズが1GBもあったら、別の方法を考えますが、毎日のバックアップファイルのサイズが数百MBまでだったら、十分でしょう。




1. 事前準備

バックアップ先のストレージに、Amazon S3を使います(そういえば、サイトも日本語化されたんでしたね)。なので、事前にAmazon Web Servicesへの登録を済ませておきましょう。Amazon Web Servicesへの登録が済むと

と、この3つがもらえます。


以上です。


以前であれば、「Firefoxのプラグイン S3Fox Organizer や Windowsのエクスプローラにオンラインストレージをマウントできる Gladinet Cloud Desktop を入れて」と書くところですが、いつの頃からかAmazon自身がコンソール画面を提供しはじめたので、いまは S3Fox OrganizerGladinet Cloud Desktop といった外部ツールは、必須ではありません。


2. S3 toolsのダウンロード

S3toolsは、次のWebサイトからダウンロードできます。

http://s3tools.org/download

この資料を書いている 2010年11月27日現在、1.0.0 -rc1が最新版(2010/10/29にリリース)です。


3. S3 toolsのインストール

(1) ソース展開用ディレクトリ、コマンド用ディレクトリの作成

Amazon S3toolsをインストールする前に、ソースファイルの展開先として、$HOME/src ディレクトリを作成します。

$ pwd /home/username
$ mkdir src
$ mkdir bin
$ cd src
      
$HOME/binに、パスが通ってなければ、通しておきましょう。


(2) Amazon S3 Toolsのアップロード

前「2. S3 toolsのダウンロード」でダウンロードしたファイルを $HOME/src へアップロードします。


(3) Amazon S3 Toolsのインストール

続いて、Amazon S3 Toolsのセットアップ作業を行います。

専用サーバー等では、yumコマンドによりパッケージごとインストールすることもできます。
また、通常であればAmazon S3 Toolsの "INSTALL" ファイルに記述された方法でインストールを行いますが、共用サーバーなど、"/usr/local/bin" などのディレクトリへの書き込み権限がない場合は、手動でインストールを行います。
今回は手動でインストールしてみます。

インストールには、あらかじめAmazon S3のアカウントが必要なので、必要な手続き、情報は揃えておきます。

$ cd $HOME/src
$ gzip -dc s3cmd-1.0.0-rc1.tar.gz.gz | tar xvf -
$ mv s3cmd-1.0.0-rc1/S3 $HOME/bin
$ mv s3cmd-1.0.0-rc1/s3cmd $HOME/bin
      

インストールには、あらかじめAmazon S3のアカウントが必要なので、必要な手続き、情報は揃えておきます。
$ s3cmd --configure
Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.
Access key and Secret key are your identifiers for Amazon S3
Access Key: ********************** ← Amazon S3のアクセスキーを入力
Secret Key: ********************** ← Amazon S3の秘密キーを入力

Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password: ******   ← Amazon S3のアカウントに設定したパスワードを入力
Path to GPG program [/usr/local/bin/gpg]:Entryキーを押下

When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP and can't be used if you're behind a proxy
Use HTTPS protocol [No]:Yes

New settings:
 Access Key: 入力したアクセスキー
 Secret Key: 入力した秘密キー
 Encryption password: パスワード
 Path to GPG program: /usr/local/bin/gpg
 Use HTTPS protocol: True
 HTTP Proxy server name:
 HTTP Proxy server port: 0

Test access with supplied credentials? [Y/n] Y
Please wait...
Success. Your access key and secret key worked fine :-)

Now verifying that encryption works...
Success. Encryption and decryption worked fine :-)

Save settings? [y/N] y
Configuration saved to '/home/username/.s3cfg'
$
      
以上で Amazon S3 Toolsのインストールが終了です。


4.バックアップの設定

今回のサーバーでは、HTML等Webのコンテンツとデータベース(MySQL)のデータをバックアップします。

(1) バックアップ先のバケット(ディレクトリと同様のことを表すAmazon S3での用語)の作成

Amazon S3toolsをインストールする前に、ソースファイルの展開先として、$HOME/src ディレクトリを作成します。

先にインストールした s3 toolsでは、階層構造を持つバケットが作成できないようです。作成しようとしたところ、次のようなエラーになりました。


$ s3cmd mb s3://examples/hoge
ERROR: Parameter problem: Expecting S3 URI with just the bucket name set instead of 's3://examples/hoge'
      

0.9.9の頃もそうでしたが、1.0.0-rc1の現在でも同様に作成できないようです。
このため、Amazonのコンソール画面 や Firefox用のプラグイン等、他のツールを利用して、あらかじめばバックアップデータを格納するバケットを作成しておきます。ここでは次の名前でバケットを作成しました。

/examples/www.example.org

.(ドット)は問題にならないか、心配したものの、大丈夫っぽい。


(2) バックアップ用のシェルスクリプトの作成

$HOME/bin ディレクトリの下に、以下のシェルスクリプトを backup.sh の名前で作成します。

$ cd $HOME/bin
$ vi backup.sh

  #!/bin/sh
  # for s3cmd by python
  export PATH=$PATH:/usr/local/bin:/bin:/usr/bin
  export MY_HOME=/home/username

  cd $MY_HOME

  # cleanup
  rm backup_daily.log

  # backup MySQL database for WordPress
  /usr/bin/mysqldump wordpress -uユーザー名 -pパスワード  > server_data_db_`date +%Y%m%d`.dmp

  # backup Web contents
  tar czpf server_data_`date +%Y%m%d`.tgz  bin www log

  # send to Amazon S3
  $MY_HOME/bin/s3cmd -c $MY_HOME/.s3cfg put server_data_db_`date +%Y%m%d`.dmp s3://simplesoft/server_data/server_data_db_`date +%Y%m%d`.dmp >> backup.log
  $MY_HOME/bin/s3cmd -c $MY_HOME/.s3cfg put server_data_`date +%Y%m%d`.tgz s3://simplesoft/server_data/server_data_`date +%Y%m%d`.tgz >> backup.log

  # delete old data
  find $MY_HOME -maxdepth 1 -name "server_data_*.dmp" -type f -mtime +4 -exec rm {} \;
  find $MY_HOME -maxdepth 1 -name "server_data_*.tgz" -type f -mtime +4 -exec rm {} \;

  # logging
  ls -l >> backup.log
  ls -l > backup_daily.log

  # send log file
  mail -s "[BACKUP LOG] server_data" 通知先のメールアドレス < backup_daily.log
      
findコマンドの -maxdepthは、以前は -typeオプションのあとに書いていたのですが、-name の前に指定とのwarningが出るようになったためオプションの指定順をj変更し、-nameの前に -maxdepthを指定。(前から?)
$ chmod 755 backup.sh
$ exit
      
設定したバックアップコマンドを実行し、バックアップされたファイル(Amazon S3からのダウンロードと、サーバー上に保存されたファイル)の中身、バックアップの実行自体の結果を確認します。
$ su -
# /home/username/bin/backup.sh
      

5. 日次で実行するように設定

 バックアップの設定確認を終えたら、それが毎日実行されるように cron の設定を行います。

$ su -
# crontab -e
0 2 * * * /home/username/bin/backup.sh
    
 以上により、毎日午前2時に、バックアップが行われるようになります。


0 コメント:

コメントを投稿