0からAWSでLAMPとLaravel環境構築(Windows)

# 手順
１．AWSアカウントを作成。
参照：[AWS アカウント作成の流れ](https://aws.amazon.com/jp/register-flow/)

２．EC2というAmazonのクラウド上の仮想サーバーを構築。
参照：[AWS EC2でWebサーバーを構築してみる](https://qiita.com/Arashi/items/629aaed33401b8f2265c)

３．LAMP環境を構築。
参照：[チュートリアル: Amazon Linux 2 に LAMP ウェブサーバーをインストールする](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-lamp-amazon-linux-2.html)

４．Laravelをインストール。
参照：[AWSのEC2を立ち上げてLaravelのログイン機能を動かすまで](https://qiita.com/atto/items/e1effd28c212c3829cb0)
　　　[AWSでLaravelを立ち上げた](https://qiita.com/outase/items/0de097cc51d1ff037bd7)

# １．AWSアカウントを作成
AWS は Amazon Web Services の略で、Amazon のクラウドサーバーを使用できるサービスです。
一年間無料でいろんな機能を試せます。
アカウントの登録は参照（[AWS アカウント作成の流れ](https://aws.amazon.com/jp/register-flow/)）に沿って行えばすぐできます。

# ２．EC2構築
AWSにログインすると最初はこの画面が表示されると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464023/1fc52431-06bd-aa02-cb95-7efe3ec40c63.png)
右上の地域はリージョンといい、自分の所在地に合わせて選択します。これは利用するデータセンターの場所を意味します。理論上近いほどレスポンスタイムが短いので、近いところを選びましょう。自分の場合は「東京」です。

そしたら、左上のサービスからEC2を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464023/3b6650d5-9573-653f-37e5-3a8d65e8bc82.png)
左のメニューの「インスタンス」 → 「インスタンス作成」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464023/34ca1706-0c17-f893-0da3-d9d4599b0e56.png)
一番目のAmazon Linux2 AMIを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464023/7156c13d-1ad5-1031-1933-1c53dbff693d.png)
無料利用枠のt2.microにチェックを入れ、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464023/65bdc386-2365-27c7-02cd-e90bcd1d65fc.png)
他の設定は特にいじらずセキュリティグループの設定まで飛ばします。「新しいセキュリティグループを作成する」を選択し、「セキュリティグループ名と「説明」を好きなように入力し、画像のように五つのタイプを追加します。「ソース」のところでIP指定ができます。「任意の場所」を選択するとどこでもアクセスすることができ、「マイIP」を選択すると自分が現在使用しているネットワーク環境のIPでしかアクセスできなくなります。趣味程度の個人利用でしたら任意の場所で問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464023/c5752f80-179a-dab2-dde3-d4c3ddc9ed07.png)
右下の「確認と作成」 → 「起動」を押してから、このように表示されます。「新しいキーペアの作成」でキーペア名を入力。**重要ですが、キーペアのダウンロードは必ずしてください。サーバーにアクセスするために必要となります。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464023/00f46134-a81f-68d0-a577-b9fa6f50bac1.png)
「インスタンスの作成」 → 「インスタンスの表示」を順番に進めると、インスタントの画面に戻ります。
インスタンスの状態が running になっていれば作成成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464023/4b468c1d-ccdc-c3ef-662d-3f619f5a2c62.png)
### プラスα（オプション）
今作ったインスタンスに固定IPを割り当てることができます。左のメニューから「Elastic IP
」 → 「新しいアドレスの割り当て」 → 「割り当て」 → 「閉じる」で固定IPを一つゲットします。リストからIPを右クリック → 「アドレスの関連付け」で作成したインスタンスを選択し結びつけれます。
# ３．LAMP環境の構築
### ①インスタンスに接続
サーバーに接続するため、ssh接続できるターミナル[TeraTermをダウンロード](https://ja.osdn.net/projects/ttssh2/)します。インスタンス画面下の説明から固定IPとっていれば「IPv4 パブリック IP」、とっていなければ「パブリック DNS (IPv4)」をTeraTermのホストに入力して「OK」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464023/c30d6622-f68c-d263-66d4-b76d772263ce.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464023/90a75ce8-5971-56f2-c3b4-2cffa92486c1.png)
次にユーザー名に「ec2-user」、秘密鍵に先ほどインスタンスを作るときにダウンロードしたキーペアファイルをセットして「OK」。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464023/94344487-4ff7-8fe8-01fc-5bd5ffbb6544.png)
サーバーに接続できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464023/a1e12ff1-b826-dd31-fda9-fa6afc934559.png)
**直接とは関係ないですがコマンドでsudoを打つかどうかについて「[root権限で\`sudo\`を付けた場合と付けない場合の違いに\`su\`は何の略？](https://blog.keinos.com/20170619_2585)」を読めばわかると思います。**
###②EC2のタイムゾーン設定
「[Amazon EC2のタイムゾーンを日本時間に変更する方法](https://qiita.com/drapon/items/2fc5b21a9cdc31ddb152)」でわかりやすく書かれていますが、いくつか補足があります。
`/etc/sysconfig/clock`にはこのように変更すると書いてありますが、

```
# ZONE="UTC"
ZONE="Japan"
UTC=true
```

`true`のところを`false`にしないと再起動するときにタイムゾーンがUTCに戻ることがあります。

```
# ZONE="UTC"
ZONE="Japan"
UTC=flase
```

ここでルート権限を持たないため、`vim`で保存するときにきっとこのようなエラーが出ると思います。

```
E45: 'readonly' option is set (add ! to override)
```

この解決法として自分がrootになるか、「[［vim］read only のファイルをsudoで強制的に保存する](https://qiita.com/shuthimaru/items/2334f63845d8b0d85bdd)」を参照してください。

オプションとして、「[AWSの初期設定でrootパスワードを設定する](https://qiita.com/shanonim/items/5496e0c6f6bf09e76f7c)」。一行目の`ssh`なんちゃらはすでにTeraTermログイン時にできてますので無視。

`ln`のオプションの意味は[【 ln 】コマンド――ファイルのハードリンクとシンボリックリンクを作る](https://www.atmarkit.co.jp/ait/articles/1605/30/news022.html)に書いてあります。

###③LAMP環境構築
AWSの公式チュートリアル「[チュートリアル: Amazon Linux 2 に LAMP ウェブサーバーをインストールする](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-lamp-amazon-linux-2.html)」の順序を追えばできます。自分はSQLに慣れているため、オプションの phpMyAdmin のインストールはしていません。phpMyAdmin はデータベースをGUIで管理できるツールです。

#４．Laravelのインストール
###①Composerをダウンロード
Composerについては「[PHP開発でComposerを使わないなんてありえない！基礎編](https://qiita.com/niisan-tokyo/items/8cccec88d45f38171c94)」。
以下ダウンロードコマンドです。

```
$ curl -sS https://getcomposer.org/installer | sudo php
$ sudo mv composer.phar /usr/local/bin/composer
```

これで`composer.phar`というファイルが`/usr/local/bin/composer/`の下に置かれます。
この`composer.phar`ファイルを`composer`というコマンドで実行できたら便利なので、`composer`というコマンドを作ります。

```
alias composer='php /usr/local/bin/composer/composer.phar'
```

ただし、これだけだと再起動するとリセットされて`composer`が効かなくなりますので、常に成立するようにルートに存在する`.bashrc`というファイルに書き込みます。

```
$ cd ~          # ルートに移動
$ ls -la        # .bashrcがあるかどうかを確認
$ vi .bashrc    # 「alias composer='php /usr/local/bin/composer/composer.phar'」を書き込む
```

そしたらターミナルが起動すると読み込まれる`.bash_profile`に`.bashrc`を参照するようにします。

```
$ vi .bash_profile    # 「source ~/.bashrc」を一番下に書き込む
```

###②拡張ライブラリをダウンロード
Laravelをダウンロードするのに必要なライブラリーは３つあります。`mbstring`、`mysqlnd`と`xml`です。

```
$ sudo yum install -y php-mbstring php-mysqlnd php-xml
```
###③Laravelをインストール
Laravel をインストールするディレクトリに移動します。自分の場合は`/var/www/`の下にしました。

```
$ cd /var/www
$ composer create-project --prefer-dist laravel/laravel
```

自分の場合ここで「proc_open(): fork failed errors」というエラーが出ました。「[[PHP]Composer使用時に「proc_open(): fork failed errors」エラーが出た時の対処法](https://akamist.com/blog/archives/236)」を見て解決できたので共有します。

`-prefer-dist`って何ぞやと知りたい方には「[composer の–prefer-distってよく使うけど何してる？](https://kin29.info/composer-%E3%81%AE-prefer-dist%E3%81%A3%E3%81%A6%E3%82%88%E3%81%8F%E4%BD%BF%E3%81%86%E3%81%91%E3%81%A9%E4%BD%95%E3%81%97%E3%81%A6%E3%82%8B%EF%BC%9F/)」へ。
###④Apacheのドキュメントルートの設定と.htaccessの有効化

```
$ sudo vi /etc/httpd/conf.d/custom.conf
```

に

```custom.conf
# ドキュメントルート
DocumentRoot "/var/www/laravel/public"

# .htaccess 有効化
<Directory /var/www/laravel/public>
    AllowOverride All
</Directory>
```

を加えます。
そしたらApacheを再起動してください。

```
$ sudo service httpd restart
```

###⑤パーミッションを変更
自分はパーミッションについてまだちんぷんかんぷんで、どの権限をどうすればいいか自分ではわかっていないので、他の方のブログを見たほうがいいかもしれません。基本的にパーミッションが合ってないとシステムにこのファイルに書き込めないよと怒られます。どうやらLaravelの場合は`storage`と`bootstrap`の権限を変更する必要があるらしい。

```
$ cd ~
$ sudo groupadd www
$ sudo usermod -a -G www ec2-user
$ exit
```

一度ログアウトして再度入り直して、

```
$ cd /var/www
$ sudo chmod -R 777 laravel/storage
$ sudo chmod -R 775 laravel/bootstrap/cache
$ sudo chown -R root:www /var/www
```

これでLaravelが使えるようになったはず。