RedmineをAWS無料枠に5分で用意して10分で自動バックアップできるようになる

# はじめに
Redmineすごく便利です。やる気が出ないときでもチケットの一覧として並んでいて、それをこなして行くと段々とやる気がでてきます。

またここ最近になってAWSを使い始めたのですがそのお手軽さに感動しています。

ということで今までは自前のサーバでRedmineを運用していましたが、AWSでRedmineを立ててみました。

自分用のメモとしつつ、次回同じサーバを立てるときに5分で構築、10分でバックアップという目標を達成できる用にメモします。

# BitnamiのAMIをつかってEC2にインストール

全体の流れは次の通りです。

1. EC2インスタンスの作成画面へ行く
2. AMIからインスタンスを選択する
3. 作成が完了するのを待つ
4. 管理者用のパスワードを確認する
5. IPアドレスを確認して接続する
6. 完了！

個人的にあまりAWSには慣れていないので順に追って説明します。

AWSコンソールからEC2を選び、「インスタンスの作成」を選びます。

![Screen Shot 2016-06-09 at 12.39.02 PM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/2f4e5753-800a-39e6-ffe0-886c979944fd.png)

作成するときにAMIと呼ばれるインストールイメージを選択します。

![Screen Shot 2016-06-09 at 12.39.08 PM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/071cb33c-ac72-c586-56c7-f16029ab739b.png)

「AWSマーケットプレイス」の中で「redmine」で検索します。

Bitnamiが作成しているRedmineのイメージが出てきます。

![Screen Shot 2016-06-09 at 12.42.35 PM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/b5681776-71be-ae7b-7cd0-e3ae899cd528.png)

いくつかイメージが出てきますが、バージョンやHVM、OSのバージョン、32 or 64bitなどによって分類されています。
https://bitnami.com/stack/redmine

一番新しいものを選びました。

インスタンスのタイプは無料枠のt1.microにしました。

![Screen Shot 2016-06-09 at 12.44.21 PM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/16fd2b48-8439-2dca-f2a8-8db3bc7b8168.png)

ファイアウォールはデフォルトで必要なポートが空いています。


![Screen Shot 2016-06-09 at 12.44.36 PM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/3bca25d2-7c5a-f0dc-482c-1244a6aee297.png)


しばらくするとインスタンスの作成が完了します。

![Screen Shot 2016-06-09 at 12.57.38 PM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/eda0ab5d-5afc-708d-eb26-99c763d82d72.png)


ちなみにBitnamiでは、AWSへのインストール以外にWindowsやMac、他のクラウド環境へそのままデプロイすることもできます。
しかしながら今回AWS側から操作をしたのには理由がありまして、BitnamiではAWSのリージョンで東京(アジアパシフィック)を選択することができませんでした。
そのためAWSコンソールから作成しました。

インストールが完了したらEC2インスタンスのシステムログから管理者パスワードを取得しておきます。

EC2インスタンスを選択して「アクション > インスタンスの設定 > システムログの取得」を開きます。

![Screen Shot 2016-06-09 at 1.01.22 PM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/b4670435-bafd-1f64-360e-e08e1cea1c8d.png)


ログの下方に#で囲まれたパスワードがあります。
このパスワードが重要なので控えておきます。

![Screen Shot 2016-06-09 at 1.04.00 PM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/0ae345e6-e1e7-4355-5622-af3cd3d10d20.png)

次いで接続するためにEC2インスタンスのIPアドレスを確認してブラウザで接続します。

![Screen Shot 2016-06-09 at 12.59.57 PM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/6c237ef1-ea1d-30b3-121f-61f1b453076a.png)

繋がりました :)

先ほどのパスワードを使って接続します。

```
ID: user
Password: 先に控えて置いたパスワード
```

ここで接続するIDは`bitnami`かと思ったのですが`user`にするとうまく繋がりました。

![Screen Shot 2016-06-09 at 2.03.16 PM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/479815ef-9b15-9139-1a91-1d786d57c44c.png)

この初期アカウントは攻撃を受ける可能性があると思いRedmineから削除しておきました。

# バックアップ

このRedmineでのデータをAmazon S3にて自動バックアップするように設定しました。

1. Amazon S3でのバケット作成
2. IAMユーザの作成
3. ポリシーのアタッチ
4. EC2インスタンスでaws-cliのイントール
5. EC2インスタンスでIAMユーザの認証
6. バックアップスクリプトの作成　
7. cronの設定

まずS3の管理画面からバケットを作成します。
https://console.aws.amazon.com/s3/home
![Screen Shot 2016-06-09 at 4.06.35 PM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/7595b6ea-784f-54a6-f024-cca22cea2cc4.png)


IAMユーザを作成します。
https://console.aws.amazon.com/iam/home?#users
今回はRedmineというユーザを作成しました。

「アクセスキーID」と「シークレットアクセスキー」が発行されますので忘れずにメモを取っておきます。
また取り扱いには十分注意します。

![Screen_Shot_2016-06-09_at_4_09_14_PM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/04f1190a-a26c-361e-9e8c-dce578fdb1f4.png)

このユーザに「AmazonS3FullAccess」のポリシーをアタッチします。
先ほど作成したユーザを選択して、「ポリシーのアタッチ」です。

![Screen Shot 2016-06-09 at 4.09.48 PM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/9c4a50b5-2596-2395-7588-320eff9090e6.png)


![Screen Shot 2016-06-09 at 4.09.57 PM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/20396803-b909-5f02-5dab-d632403cf576.png)

EC2インスタンスにawscliをインストールします。

```bash
$ sudo apt-get install -y awscli
```

続いて`aws configure`でIAMの認証設定を行います。

```bash
$ aws configure
AWS Access Key ID [None]: (先ほど取得したID)
AWS Secret Access Key [None]: (先ほど取得したアクセスキー)
Default region name [None]: ap-northeast-1 (東京の場合)
Default output format [None]:
```
![Screen_Shot_2016-06-09_at_4_22_10_PM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/a7e62830-aa52-45be-1c4c-eed572b1816f.png)

リージョンについては次のページに一覧が載っていました。
> http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions


バックアップの一時保存場所とバックアップスクリプトを作成します。
スクリプトは`/home/bitnami/backup.sh`に置きました。
スクリプト中にパスワードを記載していますので取り扱いには注意してください。
パスワードの確認は以下のようにしてredmineのコンフィグファイルから取り出しました。

```bash
$ grep password /opt/bitnami/apps/redmine/htdocs/config/database.yml
  password: Password
  password: ""
  password: ""
#  password: "postgres"
#  password: jenkins
```

```sh:/home/bitnami/backup.sh
#!/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を設定します。

```bash
$ chmod +x backup.sh
$ sudo crontab -e
0 * * * * /home/bitnami/backup.sh
```

cronでaws-cliを使用する場合には注意が必要です。
> https://forums.aws.amazon.com/thread.jspa?threadID=151793


最後にAmazon S3 Consoleで確認しましょう
https://console.aws.amazon.com/s3/home


<img width="407" alt="Screen Shot 2016-06-15 at 1.26.49 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/47327/28e24d6a-9aa7-c40b-6cbf-3972e151ede1.png">

作成されていれば完璧です！

以上でバックアップまで完了しました。

# 補足
この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`を使います。

```shell
$ 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で固定です。

```bash
$ ssh -i /path/to/privatekey bitnami@203.0.113.1
```

![Screen Shot 2016-06-09 at 12.58.59 PM.png](https://qiita-image-store.s3.amazonaws.com/0/47327/9a1c8880-eca4-f327-4ae0-15b692dccd39.png)

この辺りについての説明は次のページに載っています。

https://wiki.bitnami.com/Amazon_cloud/Where_can_I_find_my_AWS_Marketplace_credentials%253f

アプリケーション(ここではRedmine)のパスワードのリセット方法についても上記のページに載っています。

```bash
cd /opt/bitnami/apps/redmine
sudo ./bnconfig --userpassword mypassword
```

## 各種ツールへのパス
各種ツールなどを使う際にはパスに注意する必要があります。
Bitnamiでは`/opt/bitnami`に必要なバージョンを取りそろえていて、そちらをちゃんと使ってあげないとダメです。

```conf
/opt/bitnami/ruby/bin/ruby
/opt/bitnami/mysql/bin/mysqldump
/opt/bitnami/apache2/bin/apachectl
```


```bash:/home/bitnami/.bashrc
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で動かすのは実は結構手間取りました。
手間取った原因は次です。

1. Cronではシェルの環境変数が違うためAWS-CLIで設定が読み出せない
2. Cronのエラーのログが取れない

Cronだとありがちなトラブルではあるのですが、やはり手間取りました。
解決方法についてメモします。
まず1の「Cronではシェルの環境変数が違うためAWS-CLIで設定が読み出せない」件についてです。
AWS-CLIは接続情報を`aws configure`した際にユーザのホームディレクトリ、`~/.aws/config`に書き込みます。bitnamiであれば`/home/bitnami/.aws/config`です。
一般ユーザで作業している場合、そこからroot権限などでcronを登録すると`~/.aws`が`/root/.aws`などに書き換えられます。
そのためこの設定情報を環境変数で伝えてあげる必要があります。
もちろんパーミッションには注意してください。

次に「Cronのエラーのログが取れない」件についてです。
こちらも良くありがちなトラブルですが、まずメール送信のパッケージをインストールして

```bash
$ sudo apt-get install -y postfix
```

crontabへ

```sh: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で巨大な添付ファイルを扱う場合には大変そうです。
ある程度の目測を立てておくことが重要そうです。

<img width="561" alt="Screen Shot 2016-06-15 at 1.29.55 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/47327/6ef090b9-93e3-ad6f-8750-bd53c38192df.png">

最近はアラート設定も簡単になったようですね。

## 参考


Bitnamiを利用してEX-CLOUDにRedmineを入れる
http://qiita.com/yousan/items/374fb8f21fc3a64b7842

# まとめ
RedmineもAWSも扱っていてすごく楽しいです。これからも精進します。