はじめに
Redmineすごく便利です。やる気が出ないときでもチケットの一覧として並んでいて、それをこなして行くと段々とやる気がでてきます。
またここ最近になってAWSを使い始めたのですがそのお手軽さに感動しています。
ということで今までは自前のサーバでRedmineを運用していましたが、AWSでRedmineを立ててみました。
自分用のメモとしつつ、次回同じサーバを立てるときに5分で構築、10分でバックアップという目標を達成できる用にメモします。
BitnamiのAMIをつかってEC2にインストール
全体の流れは次の通りです。
- EC2インスタンスの作成画面へ行く
- AMIからインスタンスを選択する
- 作成が完了するのを待つ
- 管理者用のパスワードを確認する
- IPアドレスを確認して接続する
- 完了!
個人的にあまりAWSには慣れていないので順に追って説明します。
AWSコンソールからEC2を選び、「インスタンスの作成」を選びます。
作成するときにAMIと呼ばれるインストールイメージを選択します。
「AWSマーケットプレイス」の中で「redmine」で検索します。
Bitnamiが作成しているRedmineのイメージが出てきます。
いくつかイメージが出てきますが、バージョンやHVM、OSのバージョン、32 or 64bitなどによって分類されています。
https://bitnami.com/stack/redmine
一番新しいものを選びました。
インスタンスのタイプは無料枠のt1.microにしました。
ファイアウォールはデフォルトで必要なポートが空いています。
しばらくするとインスタンスの作成が完了します。
ちなみにBitnamiでは、AWSへのインストール以外にWindowsやMac、他のクラウド環境へそのままデプロイすることもできます。
しかしながら今回AWS側から操作をしたのには理由がありまして、BitnamiではAWSのリージョンで東京(アジアパシフィック)を選択することができませんでした。
そのためAWSコンソールから作成しました。
インストールが完了したらEC2インスタンスのシステムログから管理者パスワードを取得しておきます。
EC2インスタンスを選択して「アクション > インスタンスの設定 > システムログの取得」を開きます。
ログの下方に#で囲まれたパスワードがあります。
このパスワードが重要なので控えておきます。
次いで接続するためにEC2インスタンスのIPアドレスを確認してブラウザで接続します。
繋がりました :)
先ほどのパスワードを使って接続します。
ID: user
Password: 先に控えて置いたパスワード
ここで接続するIDはbitnami
かと思ったのですがuser
にするとうまく繋がりました。
この初期アカウントは攻撃を受ける可能性があると思いRedmineから削除しておきました。
バックアップ
このRedmineでのデータをAmazon S3にて自動バックアップするように設定しました。
- Amazon S3でのバケット作成
- IAMユーザの作成
- ポリシーのアタッチ
- EC2インスタンスでaws-cliのイントール
- EC2インスタンスでIAMユーザの認証
- バックアップスクリプトの作成
- cronの設定
まずS3の管理画面からバケットを作成します。
https://console.aws.amazon.com/s3/home
IAMユーザを作成します。
https://console.aws.amazon.com/iam/home?#users
今回はRedmineというユーザを作成しました。
「アクセスキーID」と「シークレットアクセスキー」が発行されますので忘れずにメモを取っておきます。
また取り扱いには十分注意します。
このユーザに「AmazonS3FullAccess」のポリシーをアタッチします。
先ほど作成したユーザを選択して、「ポリシーのアタッチ」です。
EC2インスタンスにawscliをインストールします。
$ sudo apt-get install -y awscli
続いてaws configure
でIAMの認証設定を行います。
$ aws configure
AWS Access Key ID [None]: (先ほど取得したID)
AWS Secret Access Key [None]: (先ほど取得したアクセスキー)
Default region name [None]: ap-northeast-1 (東京の場合)
Default output format [None]:
リージョンについては次のページに一覧が載っていました。
バックアップの一時保存場所とバックアップスクリプトを作成します。
スクリプトは/home/bitnami/backup.sh
に置きました。
スクリプト中にパスワードを記載していますので取り扱いには注意してください。
パスワードの確認は以下のようにしてredmineのコンフィグファイルから取り出しました。
$ grep password /opt/bitnami/apps/redmine/htdocs/config/database.yml
password: Password
password: ""
password: ""
# password: "postgres"
# password: jenkins
#!/bin/sh
# バックアップ先です。s3のURL形式で記述してください。 ( ex. s3://bucketname/path/to/backup )
DEST=s3://aet01.l2tp.org/backup
DBUSER=bitnami
DBPASS=957de910a1
# 1日前のバックアップを全て消します。 ワイルドカードを使っているのでシェルによっては注意が必要です
YESTERDAY=/mnt/backup/`date --date="yesterday" +%Y%m%d`*_redmine.sql.gz
# 新規に作るSQLダンプ
ファイルです。ファイル名は年月日と日時を組み合わせたものです。 20160101121212
NEWFILE=/mnt/backup/`date +%Y%m%d%H%M%S`_redmine.sql.gz
REDMINEFILES=/opt/bitnami/apps/redmine/htdocs/files
rm $YESTERDAY # 過去のバックアップ削除
/opt/bitnami/mysql/bin/mysqldump -u$DBUSER -p$DBPASS --all-databases | gzip > $NEWFILE
# 過去のファイルもあれば一緒にバックアップします
/usr/bin/aws s3 sync `dirname ${NEWFILE}` $DEST > /tmp/hoge.txt
/usr/bin/aws s3 sync $REDMINEFILES ${DEST}/files # filesディレクトリはこんがらがらないように一つ階層を下げていま
す。
ちゃんと動くか一度試験しておきましょう。
実行権限を付けてCronを設定します。
$ chmod +x backup.sh
$ sudo crontab -e
0 * * * * /home/bitnami/backup.sh
cronでaws-cliを使用する場合には注意が必要です。
最後にAmazon S3 Consoleで確認しましょう
https://console.aws.amazon.com/s3/home
作成されていれば完璧です!
以上でバックアップまで完了しました。
補足
このBitnamiのRedmineを使う上で重要な情報はWikiにあります。
https://wiki.bitnami.com/Applications/BitNami_Redmine
僕はBitnamiを使わないRedmineを使ってきましたので色々と戸惑うことが多かったです。
タイムゾーンの変更の仕方、デバッグのやりかた、サービスの再起動方法などが載っています。
一通り目を通しておくととても役に立ちます。
プラグインのインストール
プラグインのインストールは/opt/bitnami/apps/redmine/htdocs/plugins
へディレクトリを配置します。
注意点としてmigrateをするためにrakeを呼びますがパスが違うと動かないので注意してください。
/opt/bitnami/ruby/bin/rake
を使います。
RedmineやApache httpdの再起動はservice bitnami restart
を使います。
$ sudo service bitnami restart
/opt/bitnami/subversion/scripts/ctl.sh : subversion stopped
Syntax OK
/opt/bitnami/apache2/scripts/ctl.sh : httpd stopped
/opt/bitnami/php/scripts/ctl.sh : php-fpm stopped
160623 14:44:18 mysqld_safe mysqld from pid file /opt/bitnami/mysql/data/mysqld.pid ended
/opt/bitnami/mysql/scripts/ctl.sh : mysql stopped
160623 14:44:22 mysqld_safe Logging to '/opt/bitnami/mysql/data/mysqld.log'.
160623 14:44:22 mysqld_safe Starting mysqld.bin daemon with databases from /opt/bitnami/mysql/data
/opt/bitnami/mysql/scripts/ctl.sh : mysql started at port 3306
/opt/bitnami/php/scripts/ctl.sh : php-fpm started
Syntax OK
/opt/bitnami/apache2/scripts/ctl.sh : httpd started at port 80
/opt/bitnami/subversion/scripts/ctl.sh : subversion started at port 3690
SSHでの接続
BitnamiのRedmineイメージへの接続は他のEC2インスタンスと同じく、SSHの公開鍵認証でののみ接続できます。
接続ユーザ名はbitnamiで固定です。
$ ssh -i /path/to/privatekey bitnami@203.0.113.1
この辺りについての説明は次のページに載っています。
アプリケーション(ここではRedmine)のパスワードのリセット方法についても上記のページに載っています。
cd /opt/bitnami/apps/redmine
sudo ./bnconfig --userpassword mypassword
各種ツールへのパス
各種ツールなどを使う際にはパスに注意する必要があります。
Bitnamiでは/opt/bitnami
に必要なバージョンを取りそろえていて、そちらをちゃんと使ってあげないとダメです。
/opt/bitnami/ruby/bin/ruby
/opt/bitnami/mysql/bin/mysqldump
/opt/bitnami/apache2/bin/apachectl
PATH="/opt/bitnami/perl/bin:/opt/bitnami/git/bin:/opt/bitnami/sqlite/bin:/opt/bitnami/ruby/bin:/opt/bitnami/subversion/bin:/opt/bitnami/postgresql/bin:/opt/bitnami/php/bin:/opt/bitnami/mysql/bin:/opt/bitnami/apache2/bin:/opt/bitnami/common/bin:$PATH"
デフォルトのbitnamiユーザ以外を使うときには注意が必要です。
特に
- プラグインのインストールでruby関連を使ったりする場合にOS標準のバイナリが選ばれてバージョンが違う
- MySQLを使おうとしたときにsockファイルの場所が違う
ということを経験しました。
過去にもBitnamiを使いましたが、このあたりはBitnami自体のバージョンによっても変わってきます。
MySQLの接続
SSHで接続した後にMySQLへの接続をすることもできます。
MySQLへ接続するためのパスワードなどは /opt/bitnami/apps/redmine/htdocs/config/database.yml
に記載されていました。
Cronの登録
Cronで動かすのは実は結構手間取りました。
手間取った原因は次です。
- Cronではシェルの環境変数が違うためAWS-CLIで設定が読み出せない
- Cronのエラーのログが取れない
Cronだとありがちなトラブルではあるのですが、やはり手間取りました。
解決方法についてメモします。
まず1の「Cronではシェルの環境変数が違うためAWS-CLIで設定が読み出せない」件についてです。
AWS-CLIは接続情報をaws configure
した際にユーザのホームディレクトリ、~/.aws/config
に書き込みます。bitnamiであれば/home/bitnami/.aws/config
です。
一般ユーザで作業している場合、そこからroot権限などでcronを登録すると~/.aws
が/root/.aws
などに書き換えられます。
そのためこの設定情報を環境変数で伝えてあげる必要があります。
もちろんパーミッションには注意してください。
次に「Cronのエラーのログが取れない」件についてです。
こちらも良くありがちなトラブルですが、まずメール送信のパッケージをインストールして
$ sudo apt-get install -y postfix
crontabへ
MAILTO="yousan@example.com"
と設定する事でエラーメールを飛ばすことができます。
cronの実行ログは/var/log/syslog
にありました。
S3へのアクセス
今回はRedmineのEC2で、「AmazonS3FullAccess」というIAMのポリシーを与えました。
これですと全てのバケットにアクセスすることができます。
下記のページなどを参考にIAMの権限を制限すべきですね。
http://dev.classmethod.jp/cloud/aws/iam-user-for-each-s3bucket/
S3の料金
S3でのバックアップには際限を設けていないので、高額請求に注意する必要がありそうです。
https://console.aws.amazon.com/billing/home#/
Redmineで巨大な添付ファイルを扱う場合には大変そうです。
ある程度の目測を立てておくことが重要そうです。
最近はアラート設定も簡単になったようですね。
参考
Bitnamiを利用してEX-CLOUDにRedmineを入れる
http://qiita.com/yousan/items/374fb8f21fc3a64b7842
まとめ
RedmineもAWSも扱っていてすごく楽しいです。これからも精進します。