【Amazon Lightsail】Laravel x Nginx 環境で爆速デプロイしてみる

## アジェンダ
* Amazon LightsailでLaravel実行環境を構築したい
* LAMPパッケージでなくNginxパッケージでインスタンスを立てたい
* ApacheではなくNginxで実行したい
## Amazon Lightsailとはなんぞ
### 概要
AWSの中のサービスの一つで、仮想サーバーを提供するサービス。コンピューティング環境だけを提供するEC2と異なり、実行したいシステムに必要なアプリケーションやライブラリ、ツールがオールインワンで事前に備わっているので、デプロイや利用が容易にできる。

また従量課金制が多いAWSの中では珍しく月額固定制で、23/4現在の最安構成料金は月額$3.5(約462円)と低コストで利用できる。拡張性は当然EC2で実行環境を構築することに比較して劣るが、有料オプションである程度の拡張性は担保されている。

総じて、規模の小さいアプリや個人サービスなどであれば、十分に稼働でき、初学者であっても扱いやすいAWSのエントリークラスなサービスと理解している。

https://aws.amazon.com/jp/lightsail/

### なんだかんだ言って難しいんでしょ？
まだまだ駆け出しエンジニアである筆者もそれとなくデプロイまでできたので、なんだかんだ言って難しくないかも。Lightsailを実行するためには、AWSアカウントを作成する必要があるが、Lightsail専用コンソールで視覚的に容易に行える。ssh接続も、自前のターミナルアプリからも接続できるが、このコンソール上からも接続ができ、とにかく簡単に操作できる。（※ここでいうコンソールはWEBブラウザ上の画面。）

ただ、ちょっとでも王道じゃないことをしようとすれば、調査すべきAWSのドキュメントを理解するのが難しい点と、該当する野良記事も中々ヒットせず、つまりは参考文献があんまり無い。なので、そういった場合に躓いたり沼にハマったりする事があるかなと。

今回、Laravelで開発したWEBアプリのデプロイ先としてLightsailを採用したが、Laravelの一般的な実行環境であるLAMPではなくLEMPで開発したため、Nginxのパッケージでインスタンスを生成した。しかし意外とNginxパッケージの記事が見つからず、デプロイに苦労したので、自分のナレッジとしてまとめておく。

:::note
**LAMP環境とは**
Linux(OS)、Apache(WEBサーバー)、MySQL(DB)、PHP(プログラミング実行環境)を実行環境にしている総称。開発環境としてもよく見かける構成なので、どこへ行っても大体通じる。

**LEMP環境とは**
上記のWEBサーバーにあたるApacheが、Nginxへ置き換わった実行環境の総称。LEMPの"E"は、Nginx(EngineX?)から取ったものとされる（諸説あり）。

※NignxがApacheよりも後発のため、よりモダンな環境と言えるのがLEMPなのかなと思っている。
:::

## まずはインスタンスを生成する
### マジでクリックしていくだけ
*前提：AWSアカウントの作成及びAWSコンソールの基本操作ができているものとします。*
#### LEMP環境のインスタンスを立よう
![スクリーンショット 2023-04-09 23.31.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1069990/a74ade66-e2b2-c9b1-f3d1-a8922d4322ca.png)
まず、AmazonLightsailのコンソール画面へアクセスする。AWSのコンソールと異なり、ライトでポップな印象。「インスタンス」タブ内、「インスタンスの作成」ボタンを押下する。
![スクリーンショット 2023-04-10 8.14.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1069990/e96274b0-9e93-a233-92a8-180d03f9dee4.png)
すると、**インスタンスロケーション・インスタンスイメージの選択**メニューがまず目に入るので、選択していく。

**・インスタンスロケーション**
要はリージョン。詳細はリージョン等を調査していただければと思うが、近い場所を選ぶことで遅延を短くすることができる。
日本に住んでいるのに、わざわざムンバイにあるサーバーで色々しようよりも、東京にあるサーバーでしたほうがそりゃレイテンシーは少ないよね、っていう理解。

無難に東京を選択。 -> `東京　ap-northeast-1`

**・インスタンスイメージの選択**
実行したいシステムに必要なアプリケーションやツールが含まれているイメージを選択する箇所。Lightsailの肝なのではと思う場所で、ここでLAMP環境やらWordpress環境やらを選ぶ。

今回は表題の通りNginxがテーマなので、Nginxを選択。 -> `Nginx`
このイメージには記載の通り、PHP・MySQL・Nginxが含まれている。プラットフォームの選択でLinuxを選ぶと、LEMP環境を構築できるという。

:::note info
**「Bitnami によってパッケージ化された Nginx x.xx.x-x」**
びとなみ？びっとなみ？
ビットナミーと呼ぶらしい。Lightsailの主であるように、システムの実行に必要なアプリケーションをパッケージ化してくれるライブラリのよう。

Lightsailでは、Bitnamiによってパッケージ化してある、「Nginx」のイメージを使って、あなたのインスタンスを構築していくよ〜という意味の理解。
:::

https://consulting-glossary.com/item.php?name=Bitnami

![スクリーンショット 2023-04-10 8.15.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1069990/3dc35ea8-a6d7-2853-c059-6f4415a9b634.png)
オプションは一旦飛ばすと、**インスタンスプランの選択**へ移る。

本当に低コストな事がわかるかと思う。最小構成で3.5ドル、ちょっとだけグレードを上げると5ドル。そして23/4現時点では最初の3ヶ月が無料なので、お試しに触ってみるでもノーコスト。Amazonすごい。

あまりにも大きなサービスをクローンします、とかでなければ3.5ドルのプランで問題なし。筆者は個人開発アプリ、かなり簡単なものをgit cloneしてデプロイしたが、トラブル無く対応できた。

これらのスケールはインスタンス生成後もアップグレードできる仕様みたいなので、最安構成で問題ないはず。

:::note warn
ダウングレードについて公式サポートでは、詳細を明示していないので注意。
https://repost.aws/ja/knowledge-center/change-lightsail-plan
:::

最後に、**インスタンスを確認**で任意のインスタント名に決定。
この名称は後々変更できないので注意。

キーオンリータグ、キー値タグも飛ばしてOK。

あとは**インスタンスの作成**を押下すると、即時作成処理される。立ち上げに数分かかることもあるみたいなので、遷移先のコンソールページに表示される進捗状況を確認し、「実行中」に更新されればLightsailが利用可能となる。

**マジでクリックするだけ。**

## いろいろ触ってみよう
### オールインワンということ
先程も記述したが、Lightsailの強みはシステムの起動に必要な環境が最初から備わっていること。インスタンス生成時に選択したイメージを元に生成されるので、インスタンス立ち上げ後にサーバー内で何かしらをインストールする必要がなく、手間いらず。

実務や勉強の為であればssh接続をした方が間違いないが、ここではオールインワンをすぐに確認すべくコンソール画面からサーバーに接続をし、中身を見てみる。

コンソール画面中央、**SSHを使用して接続**を押下。
![スクリーンショット 2023-04-10 8.47.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1069990/73e4175a-4f04-a639-384f-af3dfc6fe9fb.png)
![スクリーンショット 2023-04-10 8.50.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1069990/fd8e2fc5-410d-e38e-5907-d00ea50098e4.png)
真っ黒な見慣れたターミナル画面がブラウザ上で動けば、完了。
早速、各アプリケーションがちゃんと初期状態で入っているか確認してみる。
```ssh
bitnami@ip -xxx-xx-xx-xxx:-$ php -v
 // PHPのバージョン情報が表示

bitnami@ip -xxx-xx-xx-xxx:-$ nginx -v    
 // Nginxのバージョン情報が表示
```
続いてDBの動作確認。ちょっとなんでかわからないが、Nginxのイメージには標準でmariaDBがインストールされている。まずはアプリケーション共通パスワードを取得し、そのパスワードでDBへ接続するため、確認する。

:::note warn
mariaDBはMySQLから派生したDBなので、ほぼMySQLと変わりないものと捉えてOK。mariaDBの方が厳格にSQL文を処理してくれる気がする。
:::

```ssh
bitnami@ip -xxx-xx-xx-xxx:-$ ls
bitnami_application_password bitnami_credentials stack
bitnami@ip -xxx-xx-xx-xxx:-$ vi bitnami_application_password
 // 1行だけ表示される文字列がパスワードなのでコピーする

:q
 // vim内なので :q で変更処理せず終了

bitnami@ip -xxx-xx-xx-xxx:-$ mysql -u root -p
Enter password: //先程コピーしたパスワードを入力
 // Welcome to the MariaDB monitor. 以降が表示される

MariaDB[(none)]> exit
Bye

 // bitnamiホームディレクトリへ戻る
```
以上のように、インスタンス生成からものの数分、実際にサーバー内に必要なアプリケーションやツール、DBが備わっていることを確認。
本当に便利でわかりやすい。
## Laravelの実行環境を試してみる
### Laravelプロジェクトをインストール
まっさらインストールにせよ、git cloneで既存プロジェクトを配置するにせよ、以下ディレクトリへ移動してそれぞれ対応する。
```ssh
bitnami@ip -xxx-xx-xx-xxx:-$ cd stack/nginx/html/
```
##### 新規プロジェクトの場合
```ssh
bitnami@ip -xxx-xx-xx-xxx:-$ composer create-project laravel/laravel hogehoge-app
bitnami@ip -xxx-xx-xx-xxx:-$ composer install
bitnami@ip -xxx-xx-xx-xxx:-$ cp .env.example .env
bitnami@ip -xxx-xx-xx-xxx:-$ php artisan key:generate
```
##### 既存プロジェクトをcloneする場合
*前提：Githubの公開鍵・秘密鍵を生成し、公開鍵をGithubに連携・ssh接続できている事*


```ssh
bitnami@ip -xxx-xx-xx-xxx:-$ git@github.com:hoge_user/hogehoge-app.git
bitnami@ip -xxx-xx-xx-xxx:-$ composer install
bitnami@ip -xxx-xx-xx-xxx:-$ cp .env.example .env
bitnami@ip -xxx-xx-xx-xxx:-$ php artisan key:generate
```
*※いずれもDB設定や.envファイルにDBとの接続についての記述を行うことで、Laravel上でMariaDBを扱うことができる。*

### Nginxの設定
#### confファイルをいじる
以下ディレクトリに配置されているファイルを確認する
```ssh
bitnami@ip -xxx-xx-xx-xxx:-$ cd stack/nginx/conf/
bitnami@ip -xxx-xx-xx-xxx:-$ vi nginx.conf
```
`# HTTP Server`と記載されている部分で以下記述する
```vim
root /home/bitnami/stack/nginx/html/hogehoge-app/public;
index index.html index.htm index.php;
```
Laravelプロジェクト内にあるPublicディレクトリ直下のindex.phpをルートにするよう指定している。
この設定を行うことで、生成したLaravelプロジェクトを動かすことができるようになる。

#### Nginxを再起動する
最後に、confファイルを反映させるためにNginxを再起動する。
```ssh
bitnami@ip -xxx-xx-xx-xxx:-$ cd sudo /opt/bitnami/ctlscript.sh restart nginx
```
URLに自身のIPアドレスを入れてあげると、Laravelのトップページが表示される。
Success!!

## 終わりに
現状であれば、サーバーに上がっているプロジェクトが動作するので、デプロイが完了している状況。githubでバージョン管理しているのであれば、mainブランチを最新の状態にすると更新も実施可能。

どのようなマージ運用にするかは自身が勉強中だが、LightsailでNginxを用いたデプロイ方法は以上。

その他必要なことで考えられるのは
* 静的IPアドレスの設定
* （割愛した）各マシンのターミナル等ソフト上でサーバー接続用にssh接続設定
* 証明書の発行
…などなど。

本日はこちらにて。
お時間頂きありがとうございました。