【月額400円～】安くてカンタンが売りの Amazon Lightsail に Laravel 環境を構築して最安運用する手順

# TL;DR

* AWSでLaravelするのに必要なコストは **400円/月**。
* 月額$3.5のLightsailインスタンス1台に、PHP/LaravelとMySQLを入れる手順です。
* インストールの待ち時間を含めて **20～30分くらい**


# Amazon Lightsail とは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129854/2f4ff7e9-c2e4-949d-17b8-334298c6a57d.png)

* 最安値AWS。EC2を1台使うより安い。
* レンタルサーバーと同じ価格帯で使える VPS。
* AWS史上最もカンタンにサーバーが立ち上げできる。EC2やRDSの構築をカンタンにしたBeanstalkよりもさらにカンタン。
* あの転送料も完全コミコミプラン。「AWSは**従量課金だから実際使うまで料金がわかんない**よね」がない。\$3.5と言ったら \$3.5以上取らない。※注：上限はあります

EC2やRDSをカンタンに構築できるBeanstalkというサービスがあるけど、それでもまだまだとっつきにくい、もっとカンタンに！どこまでもカンタンに！とにかく**「わかりにくいとは言わせない」**を追求したサービスですね。ただ「ホントにこれで限界ですか、AWSさん？！」と言いたい！ 僕みたいなインフラ素人が使うには、まだまだこれだけの理解と手順が必要なんですよ！という嘆願書（笑）。

でも、これだけの手順を踏めばできますので、もし躊躇している人がいたら挑戦してみてほしいです。


# 前提・仕様

- LaravelアプリのコードはGitHubにPUSH済
- UbuntuベースのフルカスタムPHP環境（PHP + nginx + MySQL） 

もう少しカンタンにセットアップしたい場合は、
LAMPスタックを使う方法として「 [Amazon Lightsail（LAMP）でLaravelを動かす](https://qiita.com/shin1kt/items/b4d300e4e6a450ba29a5) 」という記事があります（参考にさせていただきました！）。
今回あえてLAMPスタックを使わずUbuntuを選んだ理由は、

- Laravel Homestead と同じOSなので、操作やコードの互換性が高い
- nginxを入れてちょっとモダンな気分
- MySQLインストール時にrootパスワード設定できるのでひと手間省略

といったところです（マニアックなことを要求しなければ、実用性はまったく変わりません）。




# さぁ漕ぎ出そう

## インスタンスを立ち上げる

### Lightsail へようこそ

AWSコンソールにログインして Lightsail へ移動します。

https://lightsail.aws.amazon.com

「インスタンスの作成」をクリックしてスタートします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129854/3b571b69-5b3b-c98d-8846-2bf74a7cb28e.png)

### インスタンスは Ubuntu

「OSのみ」をクリックして「Ubuntu」を選択します。

＃今気づきましたが16を選択していました（笑）。18でも同様に動くはず。後日試します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129854/a70c0f66-60b7-6c48-3760-aa5a36534f12.png)



### リソース名を入力

プランはそのまま $3.5 でOK。
もしより大きいサイズが必要になったら、いつでも、すぐに、スケールアップできます。
＃逆に、**スケールダウンはできません**。アップするときは慎重に。

リソース名を入力して、「インスタンスの作成」！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129854/8c16aa14-8e97-d3aa-8e5d-51d05d4b4a28.png)


### 立ち上げ完了

「保留中」のステータスが「実行中」になって、色付きアイコン状態になれば立ち上げ完了。
「作成」から「実行中」までは数分程度です。早い！

「実行中」になったら、リソース名をクリックして詳細を開きましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129854/0656fef2-3bc4-3869-562e-de9037ae4d89.png)

速やかに「SSHを使用して接続」をクリックして設定に進んでください😄

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129854/30a59c75-1b7d-5748-5c5e-a8d0846de8b8.png)

＃ブラウザクライアントはコマンドのコピペがうまく動かなかったりと使いにくいので、
記事末尾に、[SSHクライアントの設定例](#sshクライアントから接続する)を書きました。よろしければ参考にしてみてください。


## インスタンスをインストール／設定する

### nginxのインストール

SSHからコマンドを入力して、最新化とnginxのインストールを行います。

```bash
sudo apt-get update
sudo apt-get install nginx
```

うまくいくと、先程のIPアドレスをブラウザに入力すると、nginx の初期画面が出てきます。
確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129854/90ec98bd-3978-2694-3930-9afe5da616ed.png)


### PHPのインストール

先にUbuntuの更新とレポジトリの追加を行い、最新のPHPをインストールします。

```
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
```

「インストール済のモジュールがあって変更されています」とな？
大事な変更はしていないので「上書きインストール」しておきます。（２番目の「ローカルを保持」が良かったかも）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129854/8bd32c14-b0c8-5ea1-82d7-432c1f066d98.png)

PHP7.3をインストールします。

```
sudo apt-get install php7.3 php7.3-xml php7.3-gd php7.3-opcache php 7.3-mbstring
```

なぜか1回コケましたが、再実行したらうまくいきました。
終わったら確認します。

```
$ php -v
PHP 7.3.11-1+ubuntu16.04.1+deb.sury.org+1 (cli) (built: Oct 24 2019 18:23:06) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.11, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.11-1+ubuntu16.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies
```

### composer をインストール

Composer をインストールしておきます。
[参考サイト](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-composer-on-ubuntu-18-04)のまま実行したらベリファイでコケたのでそこだけ省略しました。

```
sudo apt install curl php-cli php-mbstring git unzip
cd ~
curl -sS https://getcomposer.org/installer -o composer-setup.php
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
```

「Use it」と出たら成功。確認します。

```
$ composer -v
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.9.0 2019-08-02 20:55:32
...
```



### Apache2 を削除

特に必要ないと思うので削除しておきましょう。

```
sudo apt-get purge apache2 apache2-utils apache2-bin apache2.2-common
```

### MySQL をインストール

します。

```
sudo apt-get install mysql-server
```

親切に、rootパスワードを聞いてきます。
記号の混ざった長いパスワードを用意して、コピペしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129854/2f79b376-daa0-be81-361b-94713b288ad1.png)

サーバーを立ち上げます。

```
sudo service mysql status
```

接続できるか確認します。

```sh
$ mysql -u root -p
Enter password: （先ほど登録したパスワード）
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.27-0ubuntu0.16.04.1 (Ubuntu)
......
mysql>
```


## アプリケーションを動かす

### GIT のレポジトリをクローン

まず、公開ディレクトリのパーミションを変更しておきます。

```
sudo chown ubuntu:ubuntu /var/www
```

つづいて、レポジトリをクローン。
レポジトリ名は用意したものを入力してください。

```
cd /var/www
sudo rm html -rf
git clone https://github.com/(アカウント名とレポジトリ名).git html
```

ユーザー名とパスワードを入れて、done で完了。

```
Cloning into 'html'...
Username for 'https://github.com': xxxxx
Password for 'https://xxxxx@github.com':
...
Checking connectivity... done
```

verndorをインストール。

```
cd html
composer install
```

### nginxの設定変更

```
sudo nano /etc/nginx/sites-available/default
```

開いたファイルを次のように変更します。
nanoでの保存は、Ctrl+O → ファイル名が出てくるのでEnter → Ctrl+X で終了。

```nginx:/etc/nginx/sites-available/default
server {
        listen 80; # default_serverなどを除去してこれに合わせる
        listen [::]:80; # 　　　　　　　〃

        root /var/www/html/public; # /public を追記
...
        location / {
                try_files $uri /index.php?$query_string; # これに合わせる ＄をお忘れなく
        }

        location ~ \.php$ { # コメントを取って、内容をこれに合わせる（PHPのバージョンはインストールしたものに合わせる）
                include snippets/fastcgi-php.conf; 
                fastcgi_pass unix:/run/php/php7.3-fpm.sock;
        }
...
}
```

再起動。

```
sudo service nginx restart
```

うまくいくと、IPをブラウザで開いたときに……

### ログディレクトリのパーミションを変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129854/ba306d8f-b446-b96e-31a9-21735d2371d1.png)

こんなエラーが出ることが多いです。
単にログディレクトリのパーミションの問題なので、

```
sudo chown www-data:www-data /var/www/html/storage -R
```

※.env と暗号化キーの準備ができていないとこの画面すら出ません。そのときは .env があるかを確認し、無い場合には下記を試してみてください。

```
cp .env.example .env
php artisan key:generate
```


### ようこそLaravelへ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129854/72703f72-f34a-b8f9-3a6f-a6d03fc754eb.png)


このあと、MySQLの設定例（root@localhost ＋ 入力したrootパスワード）やLaravel初期設定、ドメインとSSLなどを書く予定ですが、今日のところのはひとまずここまで。もう少し運用経験積んでから追記したいと思います。








# Appendix おまけ

## LightsailにSSHクライアントから接続する

ブラウザクライアントは機能が最小限だし、接続するのにAWSコンソールを開いたりと手順が多いので、外部クライアントを使えたほうが何かと便利です。

まず、控える情報は ①IPアドレス、 ②ユーザー名 の2つ。
次にSSHキーをダウンロードするため、③「アカウントページ」をクリックします。

＃わかりやすいと思ってIPなどは **ガチ** です。キャプチャした後削除したので接続はできません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129854/1424e799-9952-ad29-bfa1-bdfedee2a668.png)

## キーをダウンロード

「デフォルト」の右側の「ダウンロード」をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129854/5149c8df-0708-6108-177e-bf7afc9af075.png)


## Cmder のセットアップ

我が家では **かっこいいから** Cmder を使っていますが、そのセットアップはこんな感じです。

といっても「硬派」なCmder。これって、ターミナルでのネイティブなSSHコマンドと同じですよね。
コマンドはこのような構成になっています。

```
ssh -i (SSHキーへのファイルパス） (②ユーザー名)@(①IPアドレス)
```

今回のケースだとこのようになっています。

```
ssh -i C:\Users\Document\LightsailDefaultKey-ap-northeast-1.pem ubuntu@54.238.219.63
```

ファイルパスがわからなかったり、探すのが面倒くさい場合は ③「File Path...」で指定するとテキストエリアにパスを貼り付けてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129854/034d0fb6-70c5-9cec-27cd-02fc2cd10941.png)

接続するとこうなるので、「yes」と入力すると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129854/0853cb3e-29f8-23e2-eb14-079bfc5b271f.png)

繋がりました（早い…）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129854/ecaf3e9e-6097-baa8-1666-837f62969f1c.png)


## Putty のセットアップ

という、誰も使ってない cmder の誰得情報を掲載してもしょうがないので、
普及率トップクラスのSSHクライアント「PUTTY」に登場していただきましょう。

……。

すみません。公式にあったのでURL貼っておきます。

https://lightsail.aws.amazon.com/ls/docs/en_us/articles/lightsail-how-to-set-up-putty-to-connect-using-ssh

ポイントは、キーファイルがそのままでは使えなくて、ppk ファイルに変換しないとダメということ。
普及率トップクラスなので他にも良い記事があるかと思います。




# 感想

Amazon Lightsail が出てきたときには「おおーこれでレガシーなレンタルサーバーとおさらばできる！」と喜んだのですが、使い方がぜんぜんレンタルサーバーじゃないし！同じなのは値段だけだし！ていうかDB追加したら結局月額3,000円超えてくるし！ムリ😄！と思ってすぐに投げ出してしまいましたが、冷静になってイチからセットアップしたら、なるほど、VPSのようにカスタム自由なサーバーとして使えるのね。1台でWEBもDBもいけちゃうのね。これで400円～は安いね。と思いなおすことができたので、もし同じように

「AWSクッソ高い！どう頑張っても最低2,000円からだ。■リポにしよう」とか
「何この従量課金って？！見積もりできない！」とか
「料金どころか使い方がまったくわからーーん！」と

悩んでる人の助けになれば幸いです。




# こんな記事も書いています

Laravelのちょっとマニアックな視点から、誰も書かない記事を書いています（笑
合わせてご覧いただけると幸いです（＾＾）

今回のサーバーはSSHとGITを使っているので、下記「ローテクデプロイ」がほぼそのまま適用できます。

-  [Laravel を Lolipop にワンタッチでデプロイする（Laravelのローテクデプロイのケーススタディ）](https://qiita.com/kd9951/items/d3c08fe6f869c20c2ab3)
-  [「WEB公開と言えばFTP」世代に贈る Windows + SourceTree で Heroku を使おうとして悪戦苦闘した話](https://qiita.com/kd9951/items/0d56cf8a091aaecbb78e)