EC2で無料タスク管理 〜マイクロインスタンスにRedmine1.1.2をセットアップ その4

ここ数回のブログで、EC2 マイクロインスタンスRedmineを利用したタスク(プロジェクト)管理システムを構築について説明してきました。

これらの記事は以下の流れで解説しています。

  1. EC2 マイクロインスタンス作成
  2. Redmine 1.1.2をインストール
  3. GmailSMTPサーバーを設定
  4. SVNのセットアップとRedmineプロジェクトと連携
  5. その他運用設定(今回ここ)

今回は、Amazon S3RedmineSubversionリポジトリをバックアップする手順について説明していきます。
EC2のインスタンスからS3へのバックアップファイルの転送は、これまでの解説でインスタンスRubyがインストール済みということもあり、情報も多いs3syncを利用しました。

(解説の中のEC2インスタンス上のコマンドは、指定が無い限りec2-userのホームディレクトリで実行しています。)

Amazon Web Service アクセスキーの生成

まず、s3syncはAmazon Web ServiceのAPIを利用するため、AWSのアクセスキーとシークレットを取得する必要があります。
以下の手順で取得します。

http://aws.amazon.com/account/を開き[Security Credentials]リンクをクリックします。
このページはAWS Management Consoleの上のメニューの[Account]リンクから開くことができます。

[Security Credentials]をクリックします。
ページ中程の[アクセス証明書]の[新しいアクセスキーを作成する]リンクをクリックします。

[はい]をクリックします。

作成後アクセスキーとシークレットが以下の用に表示されます。

実行環境の準備

rubyは前回までの作業でインストール済みですので特にありません。

s3syncのセットアップ

s3syncをダウンロードします。
s3syncのHPを表示して「Download *current* version」をクリックするか、同リンクのURLをwgetします。

$ wget http://s3.amazonaws.com/ServEdge_pub/s3sync/s3sync.tar.gz

解凍し後、tar.gzは削除しておきます。

$ tar xvzf s3sync.tar.gz
$ rm s3sync.tar.gz

READMEによるとs3syncを実行する際には、以下の環境変数を設定するかs3config.ymlを作成する必要があると記述されています。

Your environment:
                                • -
s3sync needs to know several interesting values to work right. It looks for them in the following environment variables -or- a s3config.yml file. In the yml case, the names need to be lowercase (see example file). Furthermore, the yml is searched for in the following locations, in order: $S3CONF/s3config.yml $HOME/.s3conf/s3config.yml /etc/s3conf/s3config.yml Required: AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY

$HOME/.s3conf/にs3config.ymlを作成してみました。

$ mkdir .s3conf
$ vi .3conf/s3config.yml
AWS_ACCESS_KEY_id:GHIAGEGHEJDBBM43HJDV
AWS_SECRET_ACCESS_KEY:xxxxxxxxxxxxxxxxxxxxxxxxxxx

bucketを作成

Amazon S3bucketという単位でファイルを管理します。
バックアップ用のbucketを以下の手順で作成します。

[AWS Management Console]を開き[S3]タブを開きます。

[Create Bucket]をクリックします。

[Bucket Name]を入力して[Create]をクリックします。今回は「redmina_backup」という名前で作って見ました。

Uploadのテスト

READMEの例

Examples: 
                • -
(using S3 bucket 'mybucket' and prefix 'pre') Put the local etc directory itself into S3 s3sync.rb -r /etc mybucket:pre (This will yield S3 keys named pre/etc/...)

適当にファイルを作って試してみます。

$ touch test.txt
$ s3sync/s3sync.rb test.txt redmine_backup:

実行したら以下のエラーが出たました。

/home/ec2-user/s3sync/s3config.rb:20: undefined method `each_pair' for # (NoMethodError)
	from /home/ec2-user/s3sync/s3config.rb:17:in `each'
	from /home/ec2-user/s3sync/s3config.rb:17
	from s3sync/s3sync.rb:28:in `require'
	from s3sync/s3sync.rb:28

yamlのフォーマットが壊れてるらしい。
「:」の後にスペース入って無かったので修正。

AWS_ACCESS_KEY_ID: GHIAGEGHEJDBBM43HJDV
AWS_SECRET_ACCESS_KEY: xxxxxxxxxxxxxxxxxxxxxxxxxxx

それでもエラー。

S3 command failed:
list_bucket prefix redmine_backup/test max-keys 200 delimiter /
With result 403 Forbidden
S3 ERROR: #
s3sync/s3sync.rb:290:in `+': can't convert nil into Array (TypeError)
	from s3sync/s3sync.rb:290:in `s3TreeRecurse'
	from s3sync/s3sync.rb:346:in `main'
	from /home/ec2-user/s3sync/thread_generator.rb:79:in `call'
	from /home/ec2-user/s3sync/thread_generator.rb:79:in `initialize'
	from /home/ec2-user/s3sync/thread_generator.rb:76:in `new'
	from /home/ec2-user/s3sync/thread_generator.rb:76:in `initialize'
	from s3sync/s3sync.rb:267:in `new'
	from s3sync/s3sync.rb:267:in `main'
	from s3sync/s3sync.rb:735

これは単にbucket名が誤っている場合のエラーです。正しいbucket名を指定したところ問題なくアップロードできました。

RedmineSVNのバックアップ

Redmineのバックアップ

Redmineのバックアップ方法には公式のマニュアル「Redmineのバックアップ方法に記述されています。」

バックアップ対象

  • Redmineインストールディレクトリ以下のfilesディレクトリ チケットやWikiに添付されたファイルが格納されています。
  • データベース 添付ファイル以外の全ての情報がデータベースに格納されています。

MySQLのバックアップはmysqldumpコマンドを使います。

SVNのバックアップ

Subversionのバックアップはsvnadmin dumpコマンドを使います。

上記の手順をスクリプトにまとめると以下のようになります。

$ vi backup.sh
#!/bin/sh

TODAY=`date '+%Y%m%d'`
BACKUP_DIR=backup$TODAY
mkdir $BACKUP_DIR

tar cvfz $BACKUP_DIR/redmine_files.tar.gz /var/lib/redmine/files/

# MySQLのダンプ
mysqldump -u user_redmine -pxxxxxx db_redmine | gzip > $BACKUP_DIR/redmine_mysql.dump.gz

# subversionのダンプ
svnadmin dump /var/www/svn/myproj > $BACKUP_DIR/svnbackup_myproj.dump.gz


####
# s3sync.rbを用いてバックアップ
s3sync/s3sync.rb $BACKUP_DIR/ redmine_backup:$BACKUP_DIR

rm -Rf $BACKUP_DIR
$ chmod +x backup.sh 

動作の確認

$ ./backup.sh

無事バックアップファイルがアップロードされました。

crontabの設定

今回は、毎朝6時にバックアップを実行するように設定しました。

$ crontab -e

サーバー時間はUTCのままなので21時がJSTの6時です。

00 21 * * * ~/backup.sh

ログのローテーション

最後にログのローテーションを設定します。
ローテーションについては、Redmine.jp FAQページの「production.logのローテート」に説明があります。

sudo vi /etc/logrotate.d/redmine

RedmineRedmine.JP Blogの「Redmine 1.1をCentOS5.5にインストールする手順」に沿ってインストールしたので/var/lib/redmineにあります。
ですので、上記のリンクの解説のまま設定します。

/var/lib/redmine/log/*log {
    missingok      # ファイルが存在しなくてもエラーににない
    notifempty     # 
    copytruncate   # ログを別名でコピーした後、元のファイルの内容を空にする
    compress       # 古いログを圧縮して保存する
}

まとめ

ここまで4回のブログで、Redmine+Subversionを利用したタスク(プロジェクト)管理システムをEC2上に構築し、基本的な運用設定まで解説してきました。
Amazon EC2に限らず、他のクラウドサービスまたは社内のサーバーにRedmineを構築する場合にも参考にしていただければと思います。

今回参考にしたサイト

s3syncの説明:http://d.hatena.ne.jp/rx7/20080816/p1
s3syncの使ったWebサイトのバックアップアップ方法:http://atlchris.com/828/how-to-backup-your-website-to-amazon-s3-automatically/
logrotate.dの解説:http://www.atmarkit.co.jp/flinux/rensai/root03/root03c.html