Amazon LightsailでLaravel実行環境をサクッと作る

# はじめに

本記事は、[Fusic Advent Calender 2020](https://qiita.com/advent-calendar/2020/fusic) の14日目の記事になります。

昨日の記事は@ryu022304さんの「Go+serverlessで署名付きURLの取得」でした！署名付きURLをAPI Gatewayにアクセスして取得するという構成を丁寧に解説されています（この方はなんと、今月3回目のAdvent Calender投稿です）、ぜひご一読を！

さて、私事ですが、早いもので転職して3ヶ月が経ちました。
前職とは全く異なるスキルセットが必要になる業界で、日々スキルの乏しさに苦悩しつつも、得るものの多い環境で楽しく業務を行っています。

最近になって、AWS認定資格のソリューションアーキテクトアソシエイトを取得し、ようやくAWS初心者を名乗れるかなというところまできましたが、まだまだ実際の構築経験が少ないので、これからいっぱいシステムを作っていきたいな！って所存です。

今回私にとってはじめての Advent Calender への参加で、何を書こうか（今の自分に何が書けるのか）、本当に色々悩んだのですが、今回は、近々案件で使う予定がありそうな Amazon Lightsail をつかって、Laravelの実行環境を構築する工程について、調査してまとめてみました。

# Amazon Lightsail
Amazon Lightsail は、WebサイトやWebサービスを提供するのに必要な機能を組み合わせてパッケージにして提供してくれるサービスです。パッケージは複数用意されており、今回使用するLAMP環境を提供するものや、WordpressやRedmineなど、特定のアプリケーションを実行するのに最適化されたものなど、様々なものがあります。

https://lightsail.aws.amazon.com/ls/webapp/home/instances
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145491/27b8cda1-a646-c757-4ddc-fe7451eba27c.png)

HOME画面がめちゃくちゃかわいいです。

## インスタンス作成

今回はLaravelの開発・動作環境を構築することを想定しているので、LAMP（PHP 7） を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145491/526f1c28-d804-4f30-ac8f-6c06249be459.png)

インスタンスを立ち上げると、IPが発行されます。ブラウザでアクセスしてみると、すでに Apache が立ち上がっていることも確認できます。

## Laravelインストール
### SSH接続
SSHキーに適切なPermissionを割り当てた後、発行されたIPを用いて、ターミナルからSSHでインスタンスに接続します。

```
ssh -i ~/.ssh/keys/lightsail-key.pem bitnami@**.***.***.***
```

### Composer の Update
Laravelのインストールの際に、warningが表示されるので、先にComposerを更新しておく。

```
sudo /opt/bitnami/php/bin/composer.phar self-update
```
### プロジェクト作成
ホームディレクトリに、apacheのルートディレクトリへのシンボリックリンクがあるので、そこから Laravelのインストールディレクトリへ移動し、Laravelプロジェクトを作成します。

```
cd htdocs
composer create-project --prefer-dist laravel/laravel lightsail-laravel
```
ここで、無料枠ではメモリ不足でエラーが起こる場合があるそうですが、私のときには大丈夫でした。発生した場合は、ひとつ上のインスタンスプランを選択してみてください。

### ドキュメントルートの変更
ドキュメントルートとして Laravel の publicフォルダを指定します。
設定ファイルは、 /opt/bitnami/apache2/conf/bitnami/bitnami.conf です。

```vim:bitnami.conf:v_tone4:
# DocumentRoot "/opt/bitnami/apache/htdocs"
# <Directory> "/opt/bitnami/apache/htdocs"
DocumentRoot "/opt/bitnami/apache2/htdocs/lightsail-laravel/public"
<Directory> "/opt/bitnami/apache2/htdocs/lightsail-laravel/public"
```

### apacheの再起動
```
sudo /opt/bitnami/ctlscript.sh restart apache
```

### 権限の変更
```
cd lightsail-laravel
chmod -R 777 storage bootstrap/cache
```

ここまで行った段階で、インストール作業は完了です。IPアドレスでアクセスしてみると、LaravelのTop画面が表示されました。爆速でLaravelの動作環境を立ち上げることができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145491/86cc370e-79de-363a-610d-db7007670436.png)

## データベース
パッケージとしてLAMPを選択したので、MySQLもインストールされています。Laravelの認証機能をインストールして、ログインして動作を確認してみます。

### 認証機能の追加
```
# laravel8 なので以下でOKです
composer require laravel/ui
php artisan ui bootstrap --auth
```

### npmのインストールと実行
インストールした認証機能を有効にするために、npm install の実行が必要になります。
先にnpmをインストールします。

```
sudo apt-get install npm
sudo apt-get install nodejs
sudo update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10
npm install
```

認証機能の追加が確認できました。（下図右上）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145491/9a47f1d7-2026-3a8e-36d5-92af1ebee79c.png)

### 認証用のデータベースの準備
MySQLの初期パスワードはHOMEディレクトリ内のファイルに書かれているので、そのパスワードを用いてログインします。

```
$ cat /home/bitnami/bitnami_credentials
Welcome to the Bitnami LAMP Stack

******************************************************************************
The default password is '*************'.
******************************************************************************

You can also use this password to access the databases and any other component the stack includes.

$ mysql -u root -p
Enter password:*************
``` 
laravel という名称のデータベースを作成し、マイグレーションを実行します。migrationファイルは、標準で用意されているのでそれを利用します。マイグレーションが成功し、実際にログインできれば成功です。

```
mysql> create database laravel;
Query OK, 1 row affected (0.19 sec)

$ php artisan migrate
```

# まとめ
Amazon Lightsail で Laravel の動作環境を構築する手順について調査して、まとめてみました。

所感としてはインスタンスの起動の速さや、各種設定の初期化がなされており、作業手順の少なさに非常に感動しました。タイトルを付けてから Lightsail の調査を始めたのですが、本当にサクッと作れてしまって驚きました。
一方で、パッケージとして提供されるため無駄なアプリケーションが入ってしまったり、拡張性がないなどのデメリットがあるため、実際に案件に使う場合などには、前提条件などをしっかりと確認して、本当に使えるの？という確認は大いに必要になってくるのかなと感じました。

今回の Advent Calender に際しては、直前（13日15:00）になって「この題材では公開が間に合わない！」と見切りをつけて題材をきりかえるなどしていました。なにごとも、もう少し余裕を持って準備する習慣をつけないとな〜と思いました。（雑な反省）

また、近いうちに今回ボツになった題材に関する記事を投稿できればなと思います！
ありがとうございました！