初めての AWS で Laravel API をデプロイしてみた！ - 第 4 弾：データベース編

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

https://apprentice.jp/

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

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

1. [サーバー設置編](https://qiita.com/mosyaneko/items/0788e1011b792f137d5b)
2. [サーバー接続編](https://qiita.com/mosyaneko/items/55e75ee5a96920db5981)
3. [IP アドレス編](https://qiita.com/mosyaneko/items/0788e1011b792f137d5b)
4. データベース編 ★本記事!!
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.DB サーバーの構築](#2-DBサーバーの構築)
[3.MySQL データベースの作成](#3-MySQLデータベースの作成)

# 2. DBサーバーの構築
DB サーバーは、EC2 インスタンスにデータベースをインストールして構築する方法もありますが、今回は DB サーバーとして RDS を利用します。
## RDS とは
RSD は、フルマネージドなリレーショナルデータベースのサービスです。
EC2 にインストールしてデータベースを構築する場合は、OS のアップデートやバックアップなどのメンテナンスが必要になります。
RDS の場合は、それらを AWS 側でよしなにやってくれるため、手軽に構築・運用することができます。
また、複数のアベイラビリティゾーンに簡単に設置できるため、可用性（障害があってもサービスが停止しなくて済む）が高い点が特徴です。

フルマネージドサービスなため、逆に言うと、自分で DB サーバーに接続して各種細かい設定をすることができません。
その代わりに、ユーザーが変更できる部分は「設定グループ」として提供されています。
- DB パラメータグループ：DB 設定値を制御
- DB オプショングループ：RDS への機能追加を制御
- DB サブネットグループ：RDS を起動させるサブネットを制御

他にも自動バックアップの仕組みや、監視システムがあったりしますが、詳しくは割愛します。

リレーショナルデータベースの種類を選ぶことができ、今回は MySQL を利用します。

## プライベートサブネットの作成
セキュリティ上、RDB（データベース）はインターネットと接続しないプライベートサブネットに設置します。
マルチAZ（AZ はアベイラビリティゾーンの略）で複数アベイラビリティゾーンのサブネットを使用する関係で、RDS を作成するときにはこのサブネットグループを指定する必要があります。
サブネットグループを作成するためには、現状ではプライベートサブネットが１つだけなので、もう１つプライベートサブネットを作る必要があります。

### プライベートサブネットの作成
VPC ダッシュボードのサブネットから、新しいサブネットを作成します。
前回作成したプライベートサブネットのアベイラビリティゾーンが 1a なので、今回は 1c で作ります。
![スクリーンショット 2024-02-14 22.35.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/de5b8a28-7f0d-af71-e0b8-eb106f38ed4b.png)
IPv4 サブネット CIDR ブロックは、VPC　の IP アドレスの範囲内で設定します。今回は`10.0.21.0/24`としました。
![スクリーンショット 2024-02-14 22.36.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/74c86851-fc18-cae6-0599-b7da2377361b.png)
「サブネットを作成する」をクリックすれば完了です。

## RDS 用セキュリティグループの作成
以前作成したものとは別に、RDS 用のセキュリティグループを作成します。
VPC ダッシュボードのメニューから、「セキュリティグループ」をクリックし、「セキュリティグループを作成」に進みます。

データベース用のセキュリティグループと分かるように名前をつけます。
作成した VPC を選択します。
![スクリーンショット 2024-02-14 22.53.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/2751fc95-9fb1-3762-9e17-4651657ec6fa.png)

インバウンドルールは、「タイプ」に「MySQL/Aurora」を選択します。
「ソース」には、以前作成したセキュリティグループを選択します。
こうすることで、以前作成したセキュリティグループに属する EC2 インスタンスから接続できるようになります。
![スクリーンショット 2024-02-14 22.54.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/d7c64615-209c-8c9c-e29d-2ff627cfb3f2.png)

アウトバウンドルールは設定せずに、「セキュリティグループを作成」をクリックします。
![スクリーンショット 2024-02-14 22.55.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/0191b35d-4775-7061-29fd-e599fb08acb0.png)
作成できました。

## サブネットグループの作成
サービス検索窓に「RDS」と入力し、RDS ダッシュボードに移動します。
左メニューの「サブネットグループ」をクリックし、DB サブネットグループを作成」に進みます。
![スクリーンショット 2024-02-09 4.15.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/7e97ac4b-4f62-3aa1-ca85-75e0a91b18d7.png)
任意の名前を設定し、作成した VPC を選択します。
![スクリーンショット 2024-02-14 23.01.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/b4c7554b-a904-58e6-438b-3586d51617a1.png)
アベイラビリティゾーンは、サブネットを作成した 1a と 1c を選択します。
各アベイラビリティゾーンのプライベートサブネットにチェックを入れます。
ここで、パブリックサブネットも表示されているのでご注意ください。
IP アドレスを確認して登録します。
![スクリーンショット 2024-02-14 23.03.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/462782d7-bc73-4f8b-ec57-319955704e46.png)
問題なければ「作成」をクリック。

## パラメータグループの作成
RDB 作成の際に指定する、設定グループの一つである**パラメータグループ**を作成します。
RDB ダッシュボードのメニューから「パラメータグループ」をクリックし、「パラメータグループの作成」に進みます。
![スクリーンショット 2024-02-15 1.04.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/d9b72418-fd96-a46d-0ffe-74ca767dc228.png)

「パラメータグループファミリー」は「mysql8.0」を選択します。
「タイプ」は「DB Parameter Group」のままで大丈夫です。
任意のグループ名と説明を入力します。今回は、mysql　のバージョンが分かるようにしました。
![スクリーンショット 2024-02-15 1.06.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/c19cfbfa-42e9-859e-3819-379945cb5d6d.png)

## オプショングループの作成
続いて同じく設定グループの一つである**オプショングループ**を作成します。
RDB ダッシュボードのメニューから「オプショングループ」をクリックし、「グループを作成」に進みます。
![スクリーンショット 2024-02-15 1.09.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/36b27cd7-b540-a292-7614-574611b20e37.png)

こちらも同じように登録します。
![スクリーンショット 2024-02-15 1.14.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/9889a465-025a-d81d-8866-18c48c66a03f.png)




## RDB 作成
RDB ダッシュボードのメニューから「データベース」を選択し、「データベースの作成」から RDB を作成していきます。
![スクリーンショット 2024-02-15 0.21.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/d2fb8063-3826-b392-5e7c-e2e0084d84bc.png)

今回は、MySQL を利用します。
![スクリーンショット 2024-02-15 0.26.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/129df55e-4f64-3467-b226-8ff177f09d42.png)

エンジンバージョンは、現時点での最新バージョンを選択しました。
![スクリーンショット 2024-02-15 0.29.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/b3833713-792e-ffac-7283-75a4b52fc45e.png)

マルチ AZ の機能は、今回は利用せず、単体の DB インスタンスを作成します。
![スクリーンショット 2024-02-15 0.29.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/df758968-43c3-2c19-75e6-3432160dcba9.png)

任意の名前を設定します。
DB インスタンスのマスターユーザー名とパスワードを作成します。
今回は、マスターユーザー名は root としました。
これらは分からなくならないように控えておいてください。
![スクリーンショット 2024-02-15 0.39.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/864e8dd4-0569-6700-142b-1ce95759c4ab.png)

「インスタンスクラス」は、小さなスペックの db.t3.micro を選択しました。
![スクリーンショット 2024-02-15 1.24.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/db1d529b-1606-52b5-1827-a8fe39c7ef26.png)

「ストレージ割り当て」は 20 と少なめにしています。
「ストレージの自動スケーリング」は、今回は無効にしておきました。
![スクリーンショット 2024-02-15 1.25.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/7634c4e3-dd38-6c73-b998-7f4136919fbc.png)

VPC と サブネットグループは、作成したものを選択してください。
![スクリーンショット 2024-02-15 1.34.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/6df74c4a-ad57-b38b-01df-d5e60069ee2e.png)

今回はデータベースに外部からアクセスできないようにしたいので、「パブリックアクセス」は「なし」を選択します。
「セキュリティグループ」は、RDB 用に作成した方のセキュリティグループを選択してください。
「アベイラビリティゾーン」は、今回は 1a を選択しました。
![スクリーンショット 2024-02-15 1.36.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/2b3497d2-4931-3e77-17a6-6ef1d20871a8.png)

この辺はデフォルトのままで大丈夫です。
![スクリーンショット 2024-02-15 1.48.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/f5dca4a7-dacd-3ce4-58bb-f3176f481ea8.png)

「拡張モニタリングの有効化」は、詳しいモニタリングをするかどうかの設定ですが、料金がかかるようでしたので無効にしておきました。
「最初のデータベース名」は、ここでは設定しません。
「DB パラメータグループ名」、「オプショングループ名」には、先程作成したグループを選択します。
![スクリーンショット 2024-02-15 2.00.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/3cd95e73-d4c2-01c6-e4e2-cf453eda75c0.png)

自動バックアップは有効にして、保存期間は 30 日にしました。
例として、日本時間の午前４時にバックアップを取るようにしたい場合、UTC 標準時間では 19 時となるので、19:00 と設定します。
![スクリーンショット 2024-02-15 2.03.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/8cc69cbd-cdcc-6c8d-28c8-4e77f50bdf7c.png)

この辺の設定はデフォルトのままにしました。
![スクリーンショット 2024-02-15 2.07.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/997fb22b-ecaa-5ce6-192f-743e20a8a8e7.png)

「ログのエクスポート」に関しては、今回は CloudWatch Logs に出力しないので、チェックをいれません。
「マイナーバージョン自動アップグレードの有効化」はチェックしておきます。
メンテナンスの時間は、例として日本時間午前５時である UTC 標準時間 20:00 に設定しました。
![スクリーンショット 2024-02-15 2.09.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/87f1fb1f-c633-b4c8-93f1-25081ef6d815.png)

「削除保護」に関しては、今回練習用で削除することもあるかもしれないので、チェックは入れません。
![スクリーンショット 2024-02-15 2.12.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/f2c32001-80e2-388b-3b5d-f7136034f2b1.png)
月額利用料の見積もりも出ていますが、あくまで概算のようです。

問題がなければ、「データベースの作成」をクリックします。

作成できました！
![スクリーンショット 2024-02-15 2.21.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/bf239a3e-a83a-275a-0f5f-78f6d3dc2d93.png)

# 3. MySQLデータベースの作成
EC2 インスタンスから RDS の MySQL に接続してして、データベースを作成します。

### EC2 インスタンスにログイン
ターミナルから、SSH 接続で EC2 インスタンスにログインします。
`ssh -i <秘密鍵ファイルへのパス> ec2-user@<パブリック IP>`

### MySQL のインストール
下記コマンドで、MySQL をインストールします。
`sudo yum -y install mysql`

### データベースサーバーに接続
RDB ダッシュボードの「データベース」から、作成した RDS をクリックし、詳細画面から「エンドポイント」をコピーしておきます。

![スクリーンショット 2024-02-15 2.38.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/e7757736-28b1-010d-eb50-54b4d25fe247.png)

ターミナルを開き、下記コマンドでデータベースサーバーに接続する。
`mysql -h <エンドポイント> -u root -p`
![スクリーンショット 2024-02-15 2.43.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/90814a44-92b2-d37e-2825-25ad6a7018bc.png)
このようになれば、接続成功です！

### データベースを作成する
下記コマンドでデータベースを作成します。
`CREATE DATABASE <データベース名> DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;`

オプションの意味は以下の通りです。
`DEFAULT CHARACTER SET` ：文字コードの設定
`COLLATE`：データベースの照合順序を指定。文字列の比較方法
`utf8：`文字コード
`general：`多言語
`ci`：大文字小文字を区別しない

今回はデータベース名を conduit_practice とするので、
`CREATE DATABASE conduit_practice DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;`
と実行します。

### 作成したデータベースを確認
下記コマンドでデータベースが作成されているか確認できます。
SHOW DATABASES;
![スクリーンショット 2024-02-15 2.50.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/77fce310-15c4-afaa-6407-17873d10d5ef.png)
デフォルトで作成されているデータベースの他に、`conduit_practice`データベースが作成されていることが確認できました。

### ユーザーの作成
現在は root ユーザーでログインしているので、普段利用するユーザーを新規作成します。
下記コマンドで、ユーザー名とパスワードを指定して実行します。
`CREATE USER '<ユーザー名>'@'%' IDENTIFIED BY '<パスワード>';`

オプションの意味は以下の通りです。
`@`以降：接続元のホスト
`%`：どこからでもいいということ
`IDENTIFIED BY`：接続時のパスワードを指定する

今回は以下のように実行します。
`CREATE USER 'conduit_practice_user'@'%' IDENTIFIED BY 'password';`

### 権限の付与
以下の`GRANT`コマンドで、作成したユーザーに権限を付与します。
`GRANT ALL ON <データベース名>.* TO '<ユーザー名>'@'%';`

オプションの意味は以下の通りです。
`ALL`：全ての権限を
`ON <データベース名>.*`：指定したデータベースの全てのテーブルにおいて
`TO '<ユーザー名>'@'%'`：このユーザーに対して

今回は以下のように実行します。
`GRANT ALL ON conduit_practice.* TO 'conduit_practice_user'@'%';`

### 設定（権限）の反映
すぐに設定が反映されないことがあるので、以下コマンドを実行して反映させます。
`FLUSH PRIVILEGES;`

### ユーザーの一覧確認
以下コマンドで、作成したユーザーを確認してみます。
`SELECT user , host FROM mysql.user;`
![スクリーンショット 2024-02-15 3.03.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070527/cfe3896c-0335-e10d-d3ec-c34c8d1a805e.png)
作成したユーザーが、接続元ホストが `%`（どこからでもよい）で登録されていることが確認できました。

### 作成したユーザーでログインし直す
一度ログアウトします。
`exit;`

作成したユーザー名でログインします。
`mysql -h <エンドポイント> -u <ユーザー名> -p`

接続できることが確認できたら、MySQL からログアウトします。
`exit;`

本記事はここまでです。
次の記事はこちら↓
[初めての AWS で Laravel API をデプロイしてみた！ - 第 5 弾：アプリケーション起動編](https://qiita.com/mosyaneko/items/f221be0fc56c270ee5fe)