【2021/12】Amazon LightsailでRedmine構築

# 背景
エンジニアなのに最近の技術について（もはや最新でもない。。。）業務でほとんど触ったことないなーと思い、プロジェクトで使用されているものや、必要そうなものをクラウド（今回はAWS）にのっけてみようと思い立った次第です。
ほぼ個人メモっぽくなっていますが、小規模プロジェクトで必要最低限の管理ツールをさっと作りたい場合は役立つかも？
勉強がてらAWSでライトなところから色々やってみようと思います。のその①

# 今回のスコープ
★AWS上にRedmineを構築（Amazon Lightsail）
　⇒インスタンスを作成してちょっとした設定を実施後、接続できるようにするところまで
※Redmineの設定、SVN/Git連携等は別途。
※AWSアカウントは作成済（資格取得の机上学習の際に作ったものが残っていたのでそちらを使用）

# Amazon Lightsail
【公式】https://aws.amazon.com/jp/lightsail/features/
そもそも「Lightsail」とはなんぞや、というところからスタートしますが、一言でいうと「Web」に特化したAWS機能（クラウドリソース）をまとめて提供してくれるサービスといったところでしょうか。
個人的な解釈ですが、「EC2」＋「一部の必要な設定」＋「一部の追加リソース」がWebサービス毎に月額で利用できるサービスと考えています。（超える場合もありますので注意）
パッケージ的なものですので、利用時にある程度サービスの構想が固まっている場合は対応できるか先に確認した方が良いと思います。

# コンソール
AWSのマネジメントコンソールに移動して「Lightasail」でサービスを検索。
リンクを押すと「Lightasail」専用の別コンソールが開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467094/c8d2df3c-c86a-7193-5410-87ee6be413c9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467094/360f1393-fd69-41b3-0c81-147ddc0c4c16.png)

# Lightsailのインスタンス種類
（Instance）タブの「Create instance」を押すと、こんな画面が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467094/c9cc3d5d-c126-26e2-da64-79ba64c01e25.png)
「Select a platform」と「Select a blueprint」の組み合わせでいろんな種類のインスタンスが作成できそうですが、「Linux/Unix」の「blueprint」の種類が結構あったのでついでにまとめてみました。
（知らないものも結構あったのでざっくり全部調べてみましたが、基本的にほとんどOSSですなんですね。凄い。）

<details><summary>「Linux/Unix」の「blueprint」一覧</summary><div>

＃|blueprint|説明
---|---|---
1|WordPress|Webサイト作成用のCMS。
2|WordPressMultisite|一つのWordPressアカウントで複数のWebサイトを管理できるサービス。その他はWordPressと一緒っぽい。
3|LAMP|Linux、Apache、MySQL、PHPといったWebサービス開発用のOSSの組み合わせ。（「M」にMariaDB、「P」にPerlとPythomが含まれることを今回初めて知りました。。。）
4|Node.js|Node.jsがインストール済状態のサーバーが構築される。メリットはお手軽かつサーバーが定額で安心、という程度でしょうかね。
5|Joomla|WordPressの玄人版。やれることは多いがWordPressと比較すると難しいらしい。
6|Magento|オープンソースのECプラットフォーム。海外人気が高い様子で日本では認知度が低めとのこと。（ちょうどECサイトのお話いただいていますので、今度ちゃんと調べてみようかな。）
7|MEAN|MongoDB、Express.js、Angular.sj、Node.jsといったWebサービス開発用のOSSの組み合わせ。複数の言語の学習コストも馬鹿になりませんし、すべてJavaScriptで開発可能というのは魅力的ですね。
8|Drupal|「ドゥルーパル」と読むみたいですね。Webサイト作成用のCMS。Webアプリケーションフレームワークとしての側面もあるようで、ポータルサイトなんかも作成できるようです。
9|GitLab CE|GitLab Community Edition。Gitリポジトリとして使うことが多いと思いますが、DevOps向けOSSというのが正しい位置付けのようですね。
10|Redmine|プロジェクト管理用のOSSです。今回構築してみますが、チケットと呼ばれる単位でタスク管理したり、ガントチャートを作成したりできます。
11|Nginx|「エンジンエックス」と読みます。Apache、IIS等と同じWebサーバ（MW）の一つです。Apacheしか使用した経験がないのですが、性能面に強みがあるようです。
12|Ghost|Webサイト作成用のCMS。WordPressの更に簡易版といったところですかね。
13|Django|Python向けWebアプリケーションフレームワークとのこと。認証機能や管理機能が簡単に構築できるみたいです。
14|PrestaShop|OSSのeコマースプラットフォーム（ECサイト構築システム）のようです。
15|Plesk Hosting Stack on Ubuntu|サーバーの管理ソフト「Plesk」をUbuntuに乗せて、サーバーの諸々を管理できる様子。「WordPress Toolkit」が有名なんですかね。（環境整備で便利そうだなー程度しか理解できていません。）
16|cPanel & WHM for Linux|「Plesk」と同様にサーバー管理ソフトですかね。同じく詳しく理解できていないので割愛。。。
</div></details>

ちょっと舐めてましたが個人とか小規模プロジェクトであれば、web系はLightsailで大体構築できそうです。JavaとかC#でWeb構築したい、バッチ処理も実施したい、とかだったらLambdaとかEC2って選択肢になるんですかね。

# Lightsailのデメリット
既にLightsailのメリット（お手軽さ）はなんとなく理解できたのですが、構築前ということもありデメリットがあまり思いつかなかったので調べてみました。
以下のようなデメリットがあるようです。

1. 機能の組み合わせがしづらい
2. サーバーが停止していても課金されてしまう
3. 大規模なWebサイトやサービスの構築には向いていない

[AWSのAmazon Lightsailに関するデメリット3つ](https://www.fenet.jp/aws/column/aws-beginner/461/#AWS%E3%81%AEAmazon_Lightsail%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%883%E3%81%A4)

合っているかわかりませんが個人的な理解のために言い換えるとざっくりこんな感じでしょうか。


1. 構築したWebサービスから収集したデータを元に分析とか機械学習をさせたい場合等は、Lightsailでは実現が難しい。MWが自由に選べない。（機能の組み合わせがしづらい） 
2. EC2と違って従量課金制でないので、後からインスタンスを停止させたりして使ってない期間があっても同じ月額料金になってしまう（サーバーが停止していても課金されてしまう）
3. 細かい権限設定やセキュリティ設定ができないので、大人数であったり多くのケースに対応することができないことがある（大規模なWebサイトやサービスの構築には向いていない）

まぁ、EC2に移行できるようですので、最初に何かWebサービスを始める上でクリティカルとなるようなデメリットは無いように思います。（最初の数カ月無料枠もありますし。）

# Redmineインスタンス作成
一通り事前調査も終わりましたので、早速LightasailでRedmine用インスタンスを作成していきます。（ここから本番）
「Select a platform」で「Linux/Unix」、「Select a blueprint」で「Redmine」をそれぞれ選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467094/20323fe6-3512-36cf-41df-82c6a393de28.png)

OPTIONALは真ん中の「Change SSH key pair」をクリックして「SSH key」だけdefaultから変更しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467094/7db68d62-e422-1a7e-51e2-6c355adeb588.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467094/16713098-ec7b-a584-7535-4a734dd1edbe.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467094/3c0adf8a-1e04-6cf4-a0a0-ce5c23dd397e.png)
（この辺の名前は何でも良いのですが、臆病なので一応伏せておきます。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467094/5e8ad85e-56f4-0d5b-16dc-b3318042026f.png)

一度しかダウンロードできないようなので、勢いで閉じてしまわないように注意。
[公式](https://aws.amazon.com/jp/premiumsupport/knowledge-center/lightsail-troubleshoot-lost-ssh-keypair/)によると、ダウンロードを忘れた場合やKey紛失時は、コンソールからSSHログインを実施後、新しいkeyに差し替えて対応することができるみたいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467094/bad0a584-b7b2-adda-c9dd-bcee6d6f2573.png)

これでKeyPairの新規作成は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467094/0b8c8858-427f-3a06-6734-251c522b016f.png)

次にプラン（月額料金）の設定ですが、今回は一番安いものを選択しておきます。
後から変更できますし、貧乏性なので。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467094/0dee4def-7e1d-c12f-821f-35a654269d05.png)

最後にインスタンス名とKeyタグをつけて「Create instance」を押下。
インスタンス名とKeyタグに悩む方は以下がとても分かりやすいので見てみてください。
【DevelopersIO】[「弊社で使っているAWSリソースの命名規則を紹介します」](https://dev.classmethod.jp/articles/aws-name-rule/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467094/e64ce945-db0e-f833-c3aa-6a4a12eb88e4.png)

無事インスタンスが作成されて、数分後には起動しました。
余計な作業や調査を挟まなければ5分程度でインスタンス起動まで実施できるので、このタイミングでお手軽さが凄くわかります！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467094/0faaffcf-0b71-bf41-dc14-fdca0aa24fc7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467094/595cc2eb-15b4-0ee5-d2d1-616844689313.png)


無事、Redmineの初期画面に接続できました～
（先ほどのインスタンス起動時のキャプチャの黒塗りの部分にIPが記載されています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467094/a12a44d1-ad6b-4070-a90f-79553b3caf4f.png)

# ちょっとした設定
インスタンスを作成して接続しただけだと味気ないので、以下の最低限の設定だけおまけで実施してみます。

1. ドメイン設定
2. IP制限
3. SSL対応

Redmineはプロジェクトメンバーしか使用しないので、ネットワーク自体をインターネットから遮断することが一般的かなーと過去の経験から考えていますが、今回はクラウド上に構築してリモート作業で接続するって想定の上で、上記対応をしておきます。

# 1.ドメイン設定
以下の手順で無事、固定IPが割り当てられました。
これをしていないと、インスタンス起動時に毎回新しいPublicIPが割り当てられます。（毎回変わります。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467094/3276e30a-6f13-39ec-4bef-9115147c2c37.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467094/0cb025c5-b7ce-09af-3874-1663e6820889.png)
ちなみに以前、AWSの資格を取得した際に「インスタンスに紐づけされていないElastic IPは料金が発生する」と学んだ記憶がありましたので、念のため公式を調べてみた結果、同様にLightsailで割り当てた固定IPもインスタンスに紐づけされていない場合は別途料金が発生するようですね。
インスタンス削除の際に気を付けましょう！
【公式】https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/lightsail-create-static-ip

ドメイン割り当てについてですが、今回は取得済のドメイン、というよりドメイン指定がありましたのでそちらを使用します。（DNSレコード設定だけ）
未取得の方はどこかしらでドメインを取得する必要がありますが、「DNSレコード設定」自体はLightsail側でも設定できるようですね。
あんまりメリットも思いつかないので、今回はレンタルしている別のDNSサーバー側で設定しました。手順は同じようなものになるかと思いますが、サービスによってバラバラのはずですので詳細は割愛します。
個人的な理想の姿としては「Route53」でドメインを登録する方法が一番かなと思います。
【公式】https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/lightsail-how-to-create-dns-entry#lightail-create-a-dns-zone

# 2.IP制限
IP制限はEC2等のSGと同様、接続元IPをコンソール上から指定できるみたいですね。
【公式】https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/understanding-firewall-and-port-mappings-in-amazon-lightsail#specifying-source-ip-addresses

コンソールの「Networking」タブ真ん中あたりに「IPv4 Firewall」というブロックがありますので、編集アイコンを押して、接続元IPを記述するだけです。
初期設定では制限なしでアクセスできてしまうので、今回はとりあえず確認用PCのIPのみアクセスできるよう設定変更しておきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467094/e71caf63-a472-7043-a9ec-3e6750d5eaf7.png)

念のため、別PCからアクセスしたところ、ちゃんと接続できなくなっていました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467094/23155875-9271-64c2-0ff9-5d9fc455b434.png)










































# 3.SSL対応
こちらはコマンド一発でできるみたいですね。
「Connect using SSH」を押すとSSHクライアントが別ウィンドウのブラウザで起動しますので、あとは以下のコマンドを実行するだけ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467094/dccd9230-7a88-1560-596c-7ecd0196f66e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467094/ef6e546e-df7e-4283-05a8-700140ce293a.png)

```$ sudo /opt/bitnami/bncert-tool
```

途中、何度か対話型となり質問されますが、以下でかいつまんで説明してくれているため回答に悩む方は参考まで。
【qiita[@kooohei(ハンジュ株式会社)さん](https://qiita.com/kooohei)】[bitnami redmineにSSL証明書(Let's Encrypt)を導入する](https://qiita.com/kooohei/items/c4ac40f4bbf366cc0e31)


以上の手順だけでhttpsで暗号化接続できました～（確認忘れてましたので、ついでにドメイン設定も）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467094/0124bdd0-ec61-60e0-cba1-939fa68c70be.png)

# おわり
Redmine一つとっても、Lightsailのお手軽さが体感できました！
次は実際にRedmineの細かい設定やsvn/git/メール連携等を実施してみて不便がないかも確認してみようと思います。
その辺が終わったらWordPressでHP作成でもしてみようかな。（HP作成系のCMS案件多いらしいし）

# その後
[Redmineの初期設定](https://qiita.com/YutoMatsuoka/private/53b2ff94c96fc36c94f8)も実施してみました。このタイミングでも特に不便なかったです。（2021/12/17）