初めての AWS で Laravel API をデプロイしてみた！ - 第 1 弾：サーバー設置編

# 1. はじめに
私は2023年10月より、内定直結型エンジニア学習プログラム「アプレンティス」に2期生として参加しています。

https://apprentice.jp/

AWS について学んだので、Laravel API を AWS でデプロイする方法についてまとめました。
AWS に初めて触れる方の参考になれば幸いです。

### シリーズ一覧
長編になっているので、複数の記事に分けて公開しています。
本記事はその第一弾です。

1. サーバー設置編 ★本記事!!
2. [サーバー接続編](https://qiita.com/mosyaneko/items/55e75ee5a96920db5981)
3. [IP アドレス編](https://qiita.com/mosyaneko/items/0788e1011b792f137d5b)
4. [データベース編](https://qiita.com/mosyaneko/items/182438555c7d23e5a3e9)
5. [アプリケーション起動編](https://qiita.com/mosyaneko/items/f221be0fc56c270ee5fe)
6. [Webレイヤ冗長化編](https://qiita.com/mosyaneko/items/b85d0e7bb633a42eb9e4)
7. [SSL 化編](https://qiita.com/mosyaneko/items/d6c6b63c35f9868858be)

# 目次
[1.はじめに](#1-はじめに)
[2.今回実装する内容](#2-今回実装する内容)
[3.使用環境](#3-使用環境)
[4.注意事項](#4-注意事項)
[5.VPC 作成](#5-VPC作成)
[6.サブネット作成](#6-サブネット作成)
[7.インターネットへ接続可能にする](#7-インターネットへ接続可能にする)
[8.EC2 インスタンスの作成](#8-EC2インスタンスの作成)

# 2. 今回実装する内容
## 現状
すでにローカルで動作する
- フロントエンド：Next.js
- バックエンド：Laravel

のプロジェクトがあり、それぞれを GitHub リポジトリで管理している状態です。

バックエンドの Laravel プロジェクトは、Next.js からのリクエストに応じて MySQL と通信してデータを返す API として機能しています。

また、AWS のアカウント、および IAM ユーザーは作成済みです。

## やりたいこと
今回は Laravel API の部分と、データベースの SQL を AWS クラウド上に構築したいと思います。
Laravel プロジェクトは EC2 インスタンス、MySQL は RDS で構築します。


# 3. 使用環境
MacBook Air : M2 チップ / 16 GB
Next.js : 14.1.0
React : 18.2.0
PHP : 8.2.14
Laravel Framework : 10.39.0
My SQL ： 8.0.32

# 4. 注意事項
AWS でアプリケーションをデプロイするために使用するサービスでは、料金が発生します。
料金体系などについてはここでは触れませんので、ご自身でご確認をお願いします。

# 5. VPC作成
まずは、AWS で仮想ネットワークを作成できる VPC (Virtual Private Cloud) というサービスを利用します。

画面上のサービス検索窓に「VPC」と入力して、VPC のダッシュボードに移動します。

VPC は、リージョンという、AWS の各サービスが提供されている地域を選択して作成します。
今回は東京リージョンで作成したいので、画面右上のユーザー名の左隣にあるプルダウンから、「アジアパシフィック（東京） ap-northeast-1」を選択します。
![スクリーンショット 2024-02-14 0.10.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/33073934-2181-e031-7013-53e623e01cbd.png)
左のメニューから「お使いの VPC」をクリックし、右上オレンジの「VPC を作成」から作成していきます。

私が今回作成しているアプリケーションは、Conduit というサービスのクローンなので、VPC の名前は「conduit-practice-vpc」としていますが、任意の名前を設定してください。
![vpc2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/72f920b5-2f3b-1ea8-e3d0-e10675e78074.png)
IPv4 を自分で設定することができるので、今回は`10.0.0.0/16`で設定します。
この IP アドレスの範囲の中で、この後サブネットというのを作成していくのですが、後から変更ができないため、余裕を持った数字にする必要があります。

なお、「IP アドレス、CIDR とはなんぞや」ということについてはここでは割愛させていただきます。

画像の内容で問題がなければ「VPC を作成」をクリックします。

# 6. サブネット作成
## サブネットとは
VPC には「サブネット」という概念があります。
VPC の中を細かく区切ったもので、外部と通信できる**パブリックサブネット**と、通信できない**プライベートサブネット**があります。

例えば、ユーザーがアクセスする Web ページをパブリックサブネットに配置し、セキュリティ上外部からアクセスできないようにしたいデータベースをプライベートサブネットに配置する、といった使い方をします。

## アベイラビリティゾーンとは
アベイラビリティゾーンとは、独立したデータセンターのことを指し、各リージョンに複数存在しています。
例えば東京リージョンの VPC を利用していて、複数のアベイラビリティゾーンにサーバーを設置しておくと、災害などであるアベイラビリティゾーンのサーバーが使用不可となった場合にも、別のアベイラビリティゾーンは無事なのでサービスを停止しなくて済むといった利点があります。

サブネットを作成する際は、どの VPC のどのアベイラビリティゾーンにサブネットを作成するかを選択します。

## 作成
今回はまず、1 つのアベイラビリティゾーンに、パブリックサブネットとプライベートサブネットを１つずつ作成します。
VPC ダッシュボードの左メニューから、「サブネット」をクリックし、右上オレンジの「サブネットを作成」から作成していきます。
![スクリーンショット 2024-02-14 0.14.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/7fa6ae14-00fd-578b-5133-5266d0e8426c.png)
なお、デフォルトで既に ３ つ作成されていますが、これらは使用しません。

![スクリーンショット 2024-02-14 0.16.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/7a4ce4d8-cdd0-016d-cd57-4fac6f3ffe7d.png)
VPC ID は、先程作成した VPC がプルダウンで表示されるので、それを選択します。

サブネット名には、任意の名前を選択します。
今回はパブリックサブネットで、アベイラビリティゾーンが 1a なので、「conduit-practice-public-subnet-1a」としました。
![スクリーンショット 2024-02-14 3.38.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/ef32cd88-9c9f-87d1-86d2-94d004a1ef0d.png)
サブネットの IPv4 は、先述したように、VPC の IP アドレスの範囲内で設定します。
今回は`10.0.10.0/24`としました。
問題がなければ、「サブネットを作成」をクリック。

同様に、プライベートサブネットも作成します。
異なる点は、以下の通りです。
- サブネット名：「conduit-practice-private-subnet-1a」
- IPv4：`10.0.20.0/24`

２つ作成できました！
![スクリーンショット 2024-02-14 0.18.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/7240f159-ea42-743c-7f17-732c5469761f.png)

# 7. インターネットへ接続可能にする
## インターネットゲートウェイとは
先程作成した「conduit-practice-public-subnet-1a」をインターネットと接続できる**パブリック**サブネットとするためには、VPC とインターネットを繋ぐ入り口を作成する必要があります。それがインターネットゲートウェイです。
## インターネットゲートウェイ作成
VPC ダッシュボードの左メニューから、インターネットゲートウェイをクリックし、右上オレンジの「インターネットゲートウェイの作成」から作成します。
![スクリーンショット 2024-02-14 0.19.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/dfe53431-4584-eb28-4181-fe4ab61b4731.png)

任意の名前を付けて、「インターネットゲートウェイの作成」をクリックするだけで完了です！
![スクリーンショット 2024-02-14 0.19.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/9a517068-4e2b-d799-eaaa-50159932aa9b.png)
今回は「conduit-practice-igw」としました。

## インターネットゲートウェイを VPC と紐づける
作成したインターネットゲートウェイを、作成した VPC に紐づけすることで、インターネットへ接続できるようになります。

作成したインターネットゲートウェイにチェックを入れて、「アクション」プルダウンから「VPC にアタッチ」をクリックします。
![スクリーンショット 2024-02-14 0.23.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/62bfa5ae-dbc8-8b2b-4987-f7de97671d71.png)
作成した VPC を選択し、「インターネットゲートウェイのアタッチ」をクリックします。
![スクリーンショット 2024-02-14 0.24.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/f040dc15-ce98-1cf4-c173-7e1cfcb0d82d.png)

## ルートテーブルとは
これだけではまだインターネットへ接続はできません。
VPC やサブネットには**ルートテーブル**というものが存在します。
アクセスされた際の行き先を振り分ける対応表のようなものです。
VPC のルートテーブルに、インターネットゲートウェイ行きのルートを登録してあげる必要があります。

## インターネットゲートウェイをルートテーブルに登録する
VPC ダッシュボードの左メニューから、ルートテーブルをクリックします。
![スクリーンショット 2024-02-14 0.26.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/11f7221c-c5eb-16b2-d9d4-92db2c694a12.png)
作成した VPC のルートテーブルがあるのが確認できます。
チェックを入れて、下の「ルート」タブを開くと、
送信先：`10.0.0.0/16`
ターゲット：local
というルートが１つ登録されています。
これは簡単に言うと、「`10.0.0.0/16`に行きたい！」というアクセスに対して、「local へ案内するよ！」という意味です。
VPC を作成する際に IPv4 を`10.0.0.0/16`で設定したので、`10.0.0.0/16`へのアクセスはこの VPC へ案内されることになります。

今回は、`10.0.0.0/16`以外の IP アドレスへのアクセスがあった際には、インターネットゲートウェイに案内してあげるように設定します。

「ルート」タブ右上の「ルートを編集」をクリックし、「ルートを追加」をクリックして入力していきます。
![スクリーンショット 2024-02-14 1.35.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/545166c1-e01c-f985-501e-f23cc6be7a16.png)
`0.0.0.0/0`とすると、設定されている`10.0.0.0/16`以外のすべての IP アドレスという意味になります。
ターゲットには、先程作成したインターネットゲートウェイを選択します。
「変更を保存」をクリックします。
![スクリーンショット 2024-02-14 1.36.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/627a4c9d-b2a1-3083-09c4-6e7702463e63.png)
これで、VPC がインターネットと接続できるようになりました！

# 8. EC2インスタンスの作成
## EC2 とは
EC2 とは、Elastic Compute Cloud の略で、AWS クラウド上の仮想サーバーのことです。
インスタンスというのは、 EC2 から立てられたサーバーのことを指します。

今回は、パブリックサブネット内に EC2 インスタンスを設置して、そのサーバー上で Laravel API が稼働するようにしていきます。

## AMI とは
EC2 インスタンスを作成するには、そのための設計図が必要です。その設計図のことを **AMI** (Amazon Machine Image) といいます。
AMI は AWS やサードパーティが提供している他、自前のカスタム AMI を作成することもできます。
今回は、AWS が提供する AMI を利用して EC2 インスタンスを作成していきます。

## EC2 インスタンス作成
画面上のサービス検索窓で「EC2」と検索し、EC2 ダッシュボードに移動します。
左メニューから「インスタンス」をクリックし、右上オレンジの「インスタンスを起動」から作成していきます。
![スクリーンショット 2024-02-14 1.50.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/a07190bc-fa92-e8f8-2cb3-221068680d60.png)

### 名前の設定
まずは任意の名前をつけます。今回は「conduit-practice-web」とします。
![スクリーンショット 2024-02-14 1.51.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/d24c8a64-82a2-78de-9bd1-e59d4d0c84e8.png)

### AMI 選択
次に AMI を選択します。
今回は、「Amazon Linux 2」を選択しました。
![スクリーンショット 2024-02-14 1.52.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/add64eb9-0582-a62f-a771-262b36aad288.png)
![スクリーンショット 2024-02-14 1.52.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/ccf8c0f9-18c8-2dbb-2fac-62beecb4d08d.png)
**インスタンスタイプ**というのは、OS のスペックを表すもので、今回は無料利用枠の対象となっていた「t2.micro」を選択しました。

### キーペアの作成
次に**キーペア**を指定します。
これは、この EC2 インスタンスに接続する際の公開鍵認証に使用する鍵です。
この鍵を使って、SSH 通信というセキュアな通信方法で EC2 に接続します。
私は前回作成したものがあったので、それを指定しました。ない場合は「新しいキーペアの作成」から作成します。
![スクリーンショット 2024-02-14 1.54.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/e8ca0adb-6a8c-037d-3d49-ec82f5a50510.png)

こちらが作成画面です。
![スクリーンショット 2024-02-14 1.53.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/55e58d14-1da0-1641-b43f-4796513796c1.png)
任意のキーペア名を設定して、「キーペアを作成」をクリックします。
注意書きにあるように、作成された秘密鍵（プライベートキー）は、分からなくならない場所に保管してください。
EC2 インスタンス作成画面に戻ってきたら、更新ボタンをクリックすると作成したキーペアがプルダウンに表示されるようになるので、それを選択します。

### ネットワーク設定
EC2 インスタンスをどこに設置するのかを指定します。
作成した VPC と、パブリックサブネットを選択します。
パブリックサブネットなので、パブリック IP の自動割り当てを有効化します。
![スクリーンショット 2024-02-14 2.00.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/94260f16-50b0-04a3-1fed-89beef538f74.png)

### セキュリティグループの作成
上の画像の**セキュリティグループ**というのは、この EC2　インスタンスへの通信を制限するための設定です。
今回は「conduit-practice-web-sg」という名前にしました。
先程作成したプライベートキーによる SSH 接続を受け付けるように設定します。
ソースの`0.0.0.0/0`というのは、キーさえ持っていればどこからでもアクセスできるという意味です。
今回はこれで設定しますが、ご自身の PC の IP アドレスを指定するとより安全です。

# ストレージの設定
ストレージはデフォルトのままにしました。
![スクリーンショット 2024-02-14 2.02.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/d0bef0f9-f074-8eec-fd8c-3f291348f6c2.png)

問題がなければ、「インスタンスを起動」をクリックします。
![スクリーンショット 2024-02-14 2.02.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/817433d9-c725-a65b-7cd0-c188fb7143ff.png)

作成した直後は、「ステータス」が「初期化しています」となっています。
![スクリーンショット 2024-02-14 2.04.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/de03af28-f67a-9c44-280d-d26553acfe7e.png)
少し待つと、「チェックに合格しました」となり、使用できるようになります。
![スクリーンショット 2024-02-14 2.06.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/6749906a-f15b-116f-0640-7127bfa77a5d.png)


本記事はここまでです。
次の記事はこちら↓
[初めての AWS で Laravel API をデプロイしてみた！ - 第 2 弾：サーバー接続編](https://qiita.com/mosyaneko/items/55e75ee5a96920db5981)