プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

【EC2】 Subversion+Redmine環境の構築 (5/6) : バックアップの設定

次は、バックアップの設定を行います。

 

【EC2】 Subversion+Redmine環境の構築 (1/6)

【EC2】 Subversion+Redmine環境の構築 (2/6) : Subversionの設定

【EC2】 Subversion+Redmine環境の構築 (3/6) : SSLの設定

【EC2】 Subversion+Redmine環境の構築 (4/6) : Redmine の設定

【EC2】 Subversion+Redmine環境の構築 (5/6) : バックアップの設定 ←ここです

【EC2】 Subversion+Redmine環境の構築 (6/6) : 雑多な設定

 

Subversionのリポジトリは一度EC2上にダンプした形でバックアップを作成します。それをS3に保存することで、トラブルに備えます。

本当なら、Redmine もDBのバックアップなどを設定するべきなのですが、こちらは当面お試しなので現時点では設定しません。

 

また、EC2を使っているので、インスタンスのスナップショットを自動的にとることもできるのですが、今回は全ての設定が終了してから手動で取るのみとしておきます。これについては、後日、考えてみようと思います。

 

リポジトリのバックアップ用スクリプトのインストール

Subversionのリポジトリのバックアップの方法は何種類かあるようですが、ここではsvn-backup-dumps.pyを使うことにします。

(参考)

Subversionリポジトリのバックアップ [svn-backup-dumps.py の利用方法]

Subversionリポジトリのバックアップ方法いろいろ

 

Bitnami のRedmine スタックには、このスクリプトが標準で入っていないので、Subversionのリポジトリから取得してきます。

なお、Ubuntu としては、apt-get install subversion-tools でこのスクリプトがインストールが可能ですが、Bitnami のRedmine スタックだとSubversion等がパッケージではなくて、別途インストールした環境になっています。このため、apt-getを使うと、Subversionパッケージなども重複してインストールすることになってしまいますので、今回はこの方法はやめました。

 

Subversionのリポジトリはここになります。

http://subversion.apache.org/source-code.html

 

インストールされているSubversionが1.7.5なので、対応するリポジトリからエクスポートします。

bitnami@ip-10-132-10-247:~$ 
bitnami@ip-10-132-10-247:~$ cd /opt/bitnami/subversion/bin/
bitnami@ip-10-132-10-247:/opt/bitnami/subversion/bin$ sudo svn export 'http://svn.apache.org/repos/asf/subversion/tags/
1.7.5/tools/server-side/svn-backup-dumps.py'
A    svn-backup-dumps.py
エクスポートが終わりました。
bitnami@ip-10-132-10-247:/opt/bitnami/subversion/bin$ 

 

複数リポジトリのバックアップ

svn-backup-dumps.py は差分バックアップなどにも対応してくれているので便利なのですが、複数のリポジトリを同時にバックアップするようなことができません。なので、複数リポジトリのバックアップ用スクリプトを作ります。

 

ディレクトリ構成としては、

スクリプト置き場     :/opt/bitnami/backup/bin
ログファイル置き場    :/opt/bitnami/backup/log
リポジトリのバックアップ先:/opt/bitnami/backup/repositories

を仮定します。スクリプト名をsvn-backup-parent.sh とし、実行権限をつけて、binディレクトリに保存しておきます。以下がその中身です。

#!/bin/bash
#
# Command line script to svn-backup-dumps for all repositories
#
# written by JunichiMORI, 2012/12/5
#

SVNBackupPath=/opt/bitnami/backup/repositories
SVNParentPath=/opt/bitnami/repositories
SVNBackupCmd=/opt/bitnami/subversion/bin/svn-backup-dumps.py

# functions
function usage() {
    echo "execute svn-backup-dumps.py for repositories parent path"
    echo "svn-backup-parent [OPTIONS]"
    echo "    -i  incremental backup"
    echo "    -h  display help message"
}

# options
#   -i : for incremental backup
#   -h : display help mesage
#
if [ $# -ge 2 ]
then
    usage
    exit -1
fi
if [ $# -eq 1 ]
then
    if [ '-h' == $1 ] || [ '-i' != $1 ]
    then
        usage
        exit -1
    fi
    incremental=true
fi

# main process
repos=`ls -1 $SVNParentPath`
for repo in $repos
do
    repoPath=${SVNParentPath}/${repo}
    if [ -d $repoPath ]
    then
        # make backup commandline
        if [ $incremental ]
        then
            cmd="$SVNBackupCmd -i -z $repoPath $SVNBackupPath"
        else
            cmd="$SVNBackupCmd -z $repoPath $SVNBackupPath"
        fi
        # do
        echo $cmd
        $cmd
    fi
done
echo "done"

このスクリプトを実行すると、/opt/bitnami/repositories にあるリポジトリをダンプして、/opt/bitnami/backup/repositoriesに保存するように動作します。

 

S3設定

Subversionのデータを保存するためにS3を設定します。

  1. AWSコンソールにログインします
  2. S3を開きます
  3. bucketを作成します。bucketをどこのリージョンにするかは悩ましいですが、せっかくなので米国スタンダードを選択しました。

 

s3cmdインストール

サーバーからS3へのアクセスを行うのに、s3cmdという便利なコマンドがあることを知りました。

まずは、これをインストールします。Ubuntuの場合は、apt-getからインストールできます。

bitnami@ip-10-132-10-247:~$ apt-cache search s3cmd
s3cmd - command-line Amazon S3 client
bitnami@ip-10-132-10-247:~$ sudo apt-get install s3cmd
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  python-twisted-web gir1.2-gudev-1.0 python-twisted-names
これらを削除するには 'apt-get autoremove' を利用してください。
以下の特別パッケージがインストールされます:
  python-support
以下のパッケージが新たにインストールされます:
  python-support s3cmd
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。
84.9 kB のアーカイブを取得する必要があります。
この操作後に追加で 462 kB のディスク容量が消費されます。
続行しますか [Y/n]? y
取得:1 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ precise/universe python-support all 1.0.14ubuntu2 [26.1 kB]
取得:2 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/ precise/universe s3cmd all 1.0.0-1 [58.8 kB]
84.9 kB を 0秒 で取得しました (1,142 kB/s)
Selecting previously unselected package python-support.
(データベースを読み込んでいます ... 現在 36998 個のファイルとディレクトリがインストールされています。)
(.../python-support_1.0.14ubuntu2_all.deb から) python-support を展開しています...
Selecting previously unselected package s3cmd.
(.../archives/s3cmd_1.0.0-1_all.deb から) s3cmd を展開しています...
man-db のトリガを処理しています ...
python-support (1.0.14ubuntu2) を設定しています ...
s3cmd (1.0.0-1) を設定しています ...
python-support のトリガを処理しています ...
bitnami@ip-10-132-10-247:~$ 

 

無事にインストールが終わったら、設定を行います。設定の際には、AWSのアカウントキーとセキュリティキーが必要になります。これらは、AWSのサイトに アクセスし、『アカウント/コンソール』のメニューから『セキュリティ証明書』を選択し、『アクセス証明書』を見れば記載されています。

設定はs3cmd --configure で実行できます。

bitnami@ip-10-132-10-247:~$ 
bitnami@ip-10-132-10-247:~$ 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: xxxxxxxxxxxxxxx
Secret Key: xxxxxxxxxxxxxxx

Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password: xxxxxxxxxxxxxxx
Path to GPG program [/usr/bin/gpg]: 

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: xxxxxxxxxxxxxxx
  Secret Key: xxxxxxxxxxxxxxx
  Encryption password: xxxxxxxxxxxxxxx
  Path to GPG program: /usr/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/bitnami/.s3cfg'
bitnami@ip-10-132-10-247:~$ 

設定した内容は~/.s3cfgに保存されます。

 

(参考)

s3cmd : command line S3 client

CentOSで"s3cmd"

 

s3cmdによるバックアップ

これでダンプしたリポジトリをs3cmdでS3に保存することができます。S3への保存スクリプトを /opt/bitnami/backup/bin/s3backup.sh として実行権限を与えておきます。

#!/bin/bash
#
# backup to s3 bucket
#
# written by Junichi MORI, 2012/12/5
#

S3Cmd=/usr/bin/s3cmd

# If SourcePath end with /, sync copies files in SourcePath to S3Bucket.
# If SourcePath end without / and this is a directories,
# sync makes folder in S3Bucket and copies files in SourcePath.
#SourcePath=/opt/bitnami/backup/repositories
SourcePath=/opt/bitnami/backup/repositories/
S3Bucket=s3://com.mori-soft.s3.backup/
S3Config=/home/bitnami/.s3cfg

# sync S3
cmd="$S3Cmd sync -r -c $S3Config $SourcePath $S3Bucket"
echo $cmd
$cmd

 

シェルから、svn-backup-parent と s3backup を呼び出して、問題なく動作することを確認します。

 

cronへ登録

これでバックアップを取る準備ができました。

cron にこれらの処理を登録して定期的にバックアップを取るようにします。

 

最初はcrontab -e で設定していたのですが、/etc/cron.d にsvn_backupとして記述するように変更しました。以下にしていないようを示します。

 

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/bitnami/subversion/bin:/opt/bitnami/backup/bin
DATECMD="date +%Y%m%d%H%M%S%Z"
LOGDIR=/opt/bitnami/backup/log

# m h dom mon dow user  command
@reboot bitnami (svn-backup-parent.sh -i; s3backup.sh) > $LOGDIR/backup-reboot.`$DATECMD`.log 2>&1
@daily  bitnami (svn-backup-parent.sh -i; s3backup.sh) > $LOGDIR/backup-daily.`$DATECMD`.log 2>&1
@weekly bitnami (svn-backup-parent.sh   ; s3backup.sh) > $LOGDIR/backup-weekly.`$DATECMD`.log 2>&1

 

 

内容としては、

  • EC2インスタンス起動時に差分バックアップを取り、S3に保存
  • 毎日、差分バックアップを取り、S3に保存
  • 毎週、フルバックアップを取り、S3に保存

となります。一度、起動タイミングを毎分とかにして問題なく処理されていることを確認しておきます。

EC2インスタンス起動時にバックアップを取るのは、頻繁に起動・停止を行うと思っているためです。本来はサーバーなので立ち上げっぱなしのほうが良いのでしょうが、なるべく低コストで運用したいというのがあるのでこのような設定にしています。

ひょっとしたら、anacron を使った方法のほうが良いかもしれないので、また見直そうと思います。

 

なお、crontab の記述では%があるとコマンドの終了とみなされてしまうので、dateコマンドのフォーマットをそのまま書くとコマンドが正しく解釈されない、というのがありました。意外とはまった点でした。最終的には、変数を定義してしまったので直接かんけいなくなってしまいましたけどね。

(参考)

dateコマンド と crontab の コマンドライン中の %(パーセント)記号

 

バックアップも問題なくできるようになったので、雑多な設定を最後に行います