[AWS] 安価で簡単にRedmineの環境を作成・管理できるよ！そうLightsailならね

# Redmine
今更説明する必要もありませんが、Webベースのプロジェクト管理ツールです。
AWSでは、DB（PostgreSQL、MySQL）や全文検索（Elasticsearch）、あるいはコンテナ管理（Kubernetes）など、様々なOSSがマネージドサービスとして提供されていますが、残念ながらプロジェクト管理や課題管理をしてくれるサービスがありません（2020年8月現在）。

これらのサービスを利用しようと思ったら、

* EC2インスタンス上で起動
* ECSでRedmineのコンテナを起動

少なくともAWS上で、ということを考えると、この辺がすぐに思い浮かぶと思います。

が、しかし、もっと簡単な方法があるのです。それも定額で。

# Amazon Lightsail
AWSでの仮想サーバといえば、すぐに思い浮かぶのは、やはりEC2だと思います。
EC2は、多種多様なインスタンスやOSの選択ができる一方、課金がインスタンスの稼働時間に依存するため、気がつくと高額になっている、なんてことも実はない話ではありません。
しかし、Lightsailは、なんと定額利用できる、仮想サーバなのです。
EC2でもリザーブドインスタンスなどを利用すれば、かなりコストを抑えることができますが、それも及ばないほど、しかも定額で利用することができるのです。

## 価格
いくつか、インスタンスタイプが用意されています。
これはEC2と同様で、メモリ、CPUコア数、ディスク容量、データ転送量の組み合わせです。
あと、OSは、LinuxとWindowsが選択できますが、価格面ではWindowsの方がやや高い設定になっています。

* Linux (Amazon Linux / Ubuntu / Debian / FreeBSD / OpenSUSE）
    * 3.5 USドル/月 - 160.0 USドル/月
* Windows Server
    * 8.0 USドル/月 - 240.0 USドル/月

なお、データ転送量のみ、それぞれのプランの上限を超過した場合に、超過分のみの追加料金が発生します。

[「Amazon Lightsail 料金表」](https://aws.amazon.com/jp/lightsail/pricing/)

## 用意されているOSS
もう一つ特徴的なのが、いくつかのOSSが自動設定可能になっています。
そう、自分でインストールして初期設定して、といった作業が不要になるのです。
提供されているOSSは、以下の通りです。

* WordPress
* WordPress Multisite
* LAMP
* Node.js
* Joomla!
* Magento
* MEAN
* Drupal
* GitLab CE
* Remine
* Nginx
* Ghost
* Django
* Plesk
* cPanel & WHM

# Redmineを使えるようにするまで
## Lightsailでのインスタンス作成
まず、サービス一覧より、Lightsailを選択します。

<img width="1387" alt="Lightsail1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/8e7cc76b-5778-69ac-709b-df2826b861ef.png">

ここで「インスタンスの作成」を押します。

次の画面で、

* リージョン（アベイラビリティゾーン）
* OS
* OSS
* インスタンスプラン

などを選択します。

![lightsail2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/9d63f1b3-b147-7939-8a4a-9903da319a6f.png)

今回は、東京リージョン上に、Linux+Redmineで、月額3.5$のインスタンス作成してます。
すると、下記のように「保留中」という状態になり、1分もしないうちに「実行中」に変わります。

<img width="1087" alt="Lightsail3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/a0e6acaf-a43b-a516-3ab4-7a3f1c57c0b5.png">

<img width="1090" alt="Lightsail4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/3296f3fb-a991-c6d1-c0da-cddb03db8f3b.png">

これだけで、RedmineがセットアップされたLinux環境ができあがりました。

## Redmineユーザの確認
まず、インスタンスに接続してみます。
インスタンスの枠の右上にあるメニューをクリックします。

<img width="544" alt="Lightsail50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/7fe7f6d1-6c3d-06e5-2335-8b157006eef1.png">

その中から「接続」を選択してください。

<img width="552" alt="Lightsail5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/1e511a82-67c8-91e1-4462-f974893bda51.png">

ステータスが「実行中」になった直後だと、まだインスタンスに接続できないことがあります。
その場合は、1、2分経ってから接続してみてください。

接続できると、ブラウザで別のウィンドウが開き、コンソールが表示されます。

<img width="1021" alt="console1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/b348ad07-1a1e-8cc2-f3a9-5ca13ea2e604.png">

どんなファイルがあるか、見てみましょう。

```bash
bitnami@ip-172-26-4-233:~$ ls -la
total 40
drwxr-xr-x 4 bitnami bitnami 4096 Aug  8 12:35 .
drwxr-xr-x 3 root    root    4096 Feb  6  2020 ..
lrwxrwxrwx 1 bitnami bitnami   17 Feb  6  2020 apps -> /opt/bitnami/apps
-rw-r--r-- 1 bitnami bitnami  220 Aug 31  2015 .bash_logout
-rw-r--r-- 1 bitnami bitnami 4139 Feb  6  2020 .bashrc
-rw------- 1 bitnami bitnami   13 Aug  8 12:35 bitnami_application_password
-r-------- 1 bitnami bitnami  422 Aug  8 12:35 bitnami_credentials
drwx------ 2 bitnami bitnami 4096 Feb  6  2020 .cache
lrwxrwxrwx 1 bitnami bitnami   27 Feb  6  2020 htdocs -> /opt/bitnami/apache2/htdocs
-rw-r--r-- 1 bitnami bitnami  655 Jul 12  2019 .profile
drwx------ 2 bitnami bitnami 4096 Aug  8 12:33 .ssh
lrwxrwxrwx 1 bitnami bitnami   12 Feb  6  2020 stack -> /opt/bitnami
```

はい、この中の`bitnami_credentials`に、Redmineの管理用ログインIDとパスワードが記載されているのです。

<img width="1013" alt="console2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/4da6133f-a5b3-aaca-fcd6-b0ffd0f5aa88.png">

このファイルにある赤枠部分がログインID、青枠部分がパスワードになります。

## Redmineに接続してみる
インスタンスに対してパブリックIPアドレスが割り当てられています。

<img width="519" alt="address.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/955b19e3-ec1e-2255-f634-a84c8f4cdf95.png">

上記例ですと`http://54.92.33.40`にアクセスしてみましょう。

<img width="1435" alt="Redmine.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/f1611cb2-83cc-bc07-01a6-4a04b9387463.png">

Redmineの画面が出てきました！

## 管理者でログインする
では、`bitnami_credentials`に記載されていた情報でログインしてみましょう。
画面右上にある「ログイン」をクリックします。

<img width="1436" alt="Redmine2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/253f2915-bf80-c610-ade0-93e938a39465.png">

そして、ログインIDとパスワードを入力し、ログインします。

<img width="414" alt="Redmine3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/2e3088fb-b210-439e-f4bc-df6a62a9b205.png">

ログインできました！

<img width="1433" alt="Redmine5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/acf4704f-2aeb-423c-3705-ba6f62e5fe73.png">

あとは、「Administration」から、各種設定を行ってください。
初期状態は英語表示ですが、日本語表示も問題なく動作します。

# ネットワークの設定を変更したい
実はLightsailのネットワークはVPCで構成されていません。
ある意味、これが管理を簡略化できる要因の一つだったりもしますが、例えば、IPアドレスはインスタンス起動ごとに変更になってしまうので固定したい、だとか、IPアドレスではなくホスト名（ドメイン名）でアクセスしたい、などといったことが、実は可能です。
その場合は、最初の画面にある「ネットワーキング」をクリックしてみましょう。

<img width="1392" alt="networking1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/e7422500-9a02-0784-d458-640993ccd4a2.png">

![networking2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/e76ccb14-6743-9bb6-4e1d-9a0cdaa57f40.png)

# バックアップをとる
## スナップショット
インスタンスに接続して所定の方法でバックアップを取得する方法もありますが、最も簡単なのはスナップショットをとってしまうことです。
インスタンスのメニューから「管理」を選択します。

<img width="552" alt="Lightsail5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/1e511a82-67c8-91e1-4462-f974893bda51.png">

管理画面が表示されるので、この中から「スナップショット」を選択します。

<img width="1103" alt="manage1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/1bde3812-4435-8848-1d9d-faadced07587.png">

今回は手動スナップショットを作成してみましょう。

<img width="1074" alt="snapshot1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/22249886-a704-5fb1-b633-cd025734d195.png">

スナップショットの名称を入力します。
今回はデフォルト設定のまま作成してみます。

<img width="813" alt="snapshot2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/9ebeb73c-1450-aa75-7fbf-a76bd7180db6.png">

間も無く「スナップショット作成中」の状態になります。

<img width="802" alt="snapshot4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/44aa32a2-de10-913c-518f-5f655c2387c1.png">

しばらくたつと、完成します。

<img width="797" alt="snapshot6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/1d49cdc5-a9b5-a14d-b5c3-f44314efc06a.png">

今回は手動でスナップショットを取得しましたが、自動スナップショットの場合、定期的に取得してくれるようになります。

## スナップショットの使い道
作成済みのスナップショットは、ホーム画面で確認することができます。
ホーム画面の「スナップショット」をクリックしてみましょう。

<img width="1388" alt="snapshot1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/573abd1c-b0dc-eec7-33bc-4a9e33807fce.png">

先ほど取得したスナップショットが確認できました。
では、スナップショットをどう使うかというと、スナップショットの右側にあるメニューを開いてみましょう。

<img width="1047" alt="snapshot8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/fec3ce52-4169-cb37-b8bc-2417a9725fa0.png">

<img width="994" alt="snapshot9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/f1b513e7-4600-3ead-dcc7-44ec0d604489.png">

スナップショットを使ってできることは

* 新しくインスタンスを作成して、そこに復元する
* 別のリージョンにスナップショットをコピーする
* EC2にエクスポートする
* スナップショットを削除する

です。RDSのスナップショットなどとできることはほぼ同じようなものですが、EC2にエクスポートできるのが特徴的です。

## EC2にエクスポートしてみた
せっかくここまでやってみたので、EC2にエクスポートするとどうなるか見てみたいと思います。
メニューから選択すると、確認画面が表示されます。
ここで「はい、続行します」を選択します。

<img width="593" alt="ec21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/9c94f9da-ba19-58ab-00b9-29bd4ceffd39.png">

セキュリティの案内が出るので「承諾」。

<img width="588" alt="ec22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/cd45425d-3c23-1ffe-9e8c-c0470887dc32.png">

なんか、歯車がクルクル回り出した！！

<img width="1334" alt="ec23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/87b2d3d4-1522-2a49-f0b9-81f5661601fd.png">

しばらく経つと、完了します。

<img width="1335" alt="ec25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/9dc803b8-4130-4e2b-c0f2-863a73472c25.png">

# EC2
## EC2側での確認
では、どのような状態でエクスポートされているか、ですが、インスタンスとしてエクスポートされるわけではなく、EC２のスナップショットとして復元されます。
あと、カスタムAMIとしても作成されますが、今回は、スナップショットから復元する方法で進めてみようと思います。

まずは、EC2の管理画面より、EBSのスナップショットを確認してみましょう。

あったー！！

<img width="1434" alt="ebs1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/f8a10142-40aa-5078-2e02-872987b76c0f.png">

では、せっかくなんで、ここからインスタンスとして復元してみましょう。

<img width="1427" alt="ebs2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/f28f1591-ff8e-6c59-6ee8-eabd56e11814.png">

「アクション」から「ボリュームの作成」を選択します。

<img width="1310" alt="ebs7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/a59a736e-ca0a-beff-e898-91335f9fa886.png">

そのままの状態で「ボリュームの作成」ボタンを押します。

<img width="1003" alt="ebs9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/dce37d44-8186-89c7-21f7-b46800de8cea.png">

少し経つと、ボリュームが出来上がります。

<img width="1427" alt="ebs10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/7e572907-bcd4-58f6-935a-740be9a7e7db.png">

## EC2インスタンスに復元
ちょっと長くなったので、省略しますが、手順はオーソドックスです。

1. EC2インスタンスを作成
    * Redmineに接続したいので、Public Subnetを割り当ててください
    * EBSの設定は適当でよいです（サイズもあってなくてよいです）
2. インスタンスが起動したら停止（終了ではないですよ！）
    * この時、インスタンスのルートデバイス（/dev/xvdaなど）を確認しておいてください
3. インスタンスのステータスが「stopping」から「stopped」になったら、ボリューム一覧の画面で、インスタンスからデタッチする。
4. LightsailからエクスポートしたボリュームをEC2インスタンスにアタッチする
    * ルートデバイスをちゃんと指定しましょう
    * インスタンスのアベイラリティゾーンとあっていないとアタッチできないので、あっていない場合はボリューム作成時のアベイラリティゾーンをEC2インスタンスにあわせて作り直しましょう
5. 停止中だったEC２インスタンスを開始する

ここまできたら、インスタンスのパブリックIPアドレスにブラウザでアクセスするだけです。

<img width="1430" alt="ec28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/4f60e011-3c21-7202-af77-67bf44ce53ac.png">

きたー！！！！
もちろん、Lightsailでアクセスした、管理者のログインIDとパスワードでログインもできます。
もしアクセスできない場合は、EC2インスタンスにアタッチされているセキュリティグループにHTTP（80）のポートをインバウンドルールに追加してみてください。

# まとめ
ご覧のように、AWS上でOSSを安価にさくっと立ち上げる方法として、Lightsailという選択肢が有効であることがおわかりいただけたかと思います。
また、スケーリングの必要性などが出てきた場合は、EC2インスタンスとして移行することも、非常に簡単に行えることがわかったかと思います。
これまで、EC2やECSの影に隠れがちで、あまりメジャーな感じがしなかったLightsailですが、こんな簡単に導入できるのです。
結構おすすめです！