1
0

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

Last updated at Posted at 2024-02-15

1. はじめに

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

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

シリーズ一覧

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

  1. サーバー設置編
  2. サーバー接続編
  3. IP アドレス編
  4. データベース編 ★本記事!!
  5. アプリケーション起動編
  6. Webレイヤ冗長化編
  7. SSL 化編

目次

1.はじめに
2.DB サーバーの構築
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 を作成するときにはこのサブネットグループを指定する必要があります。
サブネットグループを作成するためには、現状ではプライベートサブネットが1つだけなので、もう1つプライベートサブネットを作る必要があります。

プライベートサブネットの作成

VPC ダッシュボードのサブネットから、新しいサブネットを作成します。
前回作成したプライベートサブネットのアベイラビリティゾーンが 1a なので、今回は 1c で作ります。
スクリーンショット 2024-02-14 22.35.13.png
IPv4 サブネット CIDR ブロックは、VPC の IP アドレスの範囲内で設定します。今回は10.0.21.0/24としました。
スクリーンショット 2024-02-14 22.36.35.png
「サブネットを作成する」をクリックすれば完了です。

RDS 用セキュリティグループの作成

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

データベース用のセキュリティグループと分かるように名前をつけます。
作成した VPC を選択します。
スクリーンショット 2024-02-14 22.53.43.png

インバウンドルールは、「タイプ」に「MySQL/Aurora」を選択します。
「ソース」には、以前作成したセキュリティグループを選択します。
こうすることで、以前作成したセキュリティグループに属する EC2 インスタンスから接続できるようになります。
スクリーンショット 2024-02-14 22.54.17.png

アウトバウンドルールは設定せずに、「セキュリティグループを作成」をクリックします。
スクリーンショット 2024-02-14 22.55.03.png
作成できました。

サブネットグループの作成

サービス検索窓に「RDS」と入力し、RDS ダッシュボードに移動します。
左メニューの「サブネットグループ」をクリックし、DB サブネットグループを作成」に進みます。
スクリーンショット 2024-02-09 4.15.15.png
任意の名前を設定し、作成した VPC を選択します。
スクリーンショット 2024-02-14 23.01.42.png
アベイラビリティゾーンは、サブネットを作成した 1a と 1c を選択します。
各アベイラビリティゾーンのプライベートサブネットにチェックを入れます。
ここで、パブリックサブネットも表示されているのでご注意ください。
IP アドレスを確認して登録します。
スクリーンショット 2024-02-14 23.03.31.png
問題なければ「作成」をクリック。

パラメータグループの作成

RDB 作成の際に指定する、設定グループの一つであるパラメータグループを作成します。
RDB ダッシュボードのメニューから「パラメータグループ」をクリックし、「パラメータグループの作成」に進みます。
スクリーンショット 2024-02-15 1.04.19.png

「パラメータグループファミリー」は「mysql8.0」を選択します。
「タイプ」は「DB Parameter Group」のままで大丈夫です。
任意のグループ名と説明を入力します。今回は、mysql のバージョンが分かるようにしました。
スクリーンショット 2024-02-15 1.06.18.png

オプショングループの作成

続いて同じく設定グループの一つであるオプショングループを作成します。
RDB ダッシュボードのメニューから「オプショングループ」をクリックし、「グループを作成」に進みます。
スクリーンショット 2024-02-15 1.09.30.png

こちらも同じように登録します。
スクリーンショット 2024-02-15 1.14.55.png

RDB 作成

RDB ダッシュボードのメニューから「データベース」を選択し、「データベースの作成」から RDB を作成していきます。
スクリーンショット 2024-02-15 0.21.08.png

今回は、MySQL を利用します。
スクリーンショット 2024-02-15 0.26.23.png

エンジンバージョンは、現時点での最新バージョンを選択しました。
スクリーンショット 2024-02-15 0.29.11.png

マルチ AZ の機能は、今回は利用せず、単体の DB インスタンスを作成します。
スクリーンショット 2024-02-15 0.29.51.png

任意の名前を設定します。
DB インスタンスのマスターユーザー名とパスワードを作成します。
今回は、マスターユーザー名は root としました。
これらは分からなくならないように控えておいてください。
スクリーンショット 2024-02-15 0.39.10.png

「インスタンスクラス」は、小さなスペックの db.t3.micro を選択しました。
スクリーンショット 2024-02-15 1.24.58.png

「ストレージ割り当て」は 20 と少なめにしています。
「ストレージの自動スケーリング」は、今回は無効にしておきました。
スクリーンショット 2024-02-15 1.25.46.png

VPC と サブネットグループは、作成したものを選択してください。
スクリーンショット 2024-02-15 1.34.06.png

今回はデータベースに外部からアクセスできないようにしたいので、「パブリックアクセス」は「なし」を選択します。
「セキュリティグループ」は、RDB 用に作成した方のセキュリティグループを選択してください。
「アベイラビリティゾーン」は、今回は 1a を選択しました。
スクリーンショット 2024-02-15 1.36.13.png

この辺はデフォルトのままで大丈夫です。
スクリーンショット 2024-02-15 1.48.35.png

「拡張モニタリングの有効化」は、詳しいモニタリングをするかどうかの設定ですが、料金がかかるようでしたので無効にしておきました。
「最初のデータベース名」は、ここでは設定しません。
「DB パラメータグループ名」、「オプショングループ名」には、先程作成したグループを選択します。
スクリーンショット 2024-02-15 2.00.09.png

自動バックアップは有効にして、保存期間は 30 日にしました。
例として、日本時間の午前4時にバックアップを取るようにしたい場合、UTC 標準時間では 19 時となるので、19:00 と設定します。
スクリーンショット 2024-02-15 2.03.18.png

この辺の設定はデフォルトのままにしました。
スクリーンショット 2024-02-15 2.07.37.png

「ログのエクスポート」に関しては、今回は CloudWatch Logs に出力しないので、チェックをいれません。
「マイナーバージョン自動アップグレードの有効化」はチェックしておきます。
メンテナンスの時間は、例として日本時間午前5時である UTC 標準時間 20:00 に設定しました。
スクリーンショット 2024-02-15 2.09.25.png

「削除保護」に関しては、今回練習用で削除することもあるかもしれないので、チェックは入れません。
スクリーンショット 2024-02-15 2.12.20.png
月額利用料の見積もりも出ていますが、あくまで概算のようです。

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

作成できました!
スクリーンショット 2024-02-15 2.21.40.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

ターミナルを開き、下記コマンドでデータベースサーバーに接続する。
mysql -h <エンドポイント> -u root -p
スクリーンショット 2024-02-15 2.43.51.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
デフォルトで作成されているデータベースの他に、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
作成したユーザーが、接続元ホストが %(どこからでもよい)で登録されていることが確認できました。

作成したユーザーでログインし直す

一度ログアウトします。
exit;

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

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

本記事はここまでです。
次の記事はこちら↓
初めての AWS で Laravel API をデプロイしてみた! - 第 5 弾:アプリケーション起動編

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0