1. はじめに
私は2023年10月より、内定直結型エンジニア学習プログラム「アプレンティス」に2期生として参加しています。
AWS について学んだので、Laravel API を AWS でデプロイする方法についてまとめました。
AWS に初めて触れる方の参考になれば幸いです。
シリーズ一覧
長編になっているので、複数の記事に分けて公開しています。
本記事はその第 4 弾です。
- サーバー設置編
- サーバー接続編
- IP アドレス編
- データベース編 ★本記事!!
- アプリケーション起動編
- Webレイヤ冗長化編
- 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 で作ります。
IPv4 サブネット CIDR ブロックは、VPC の IP アドレスの範囲内で設定します。今回は10.0.21.0/24
としました。
「サブネットを作成する」をクリックすれば完了です。
RDS 用セキュリティグループの作成
以前作成したものとは別に、RDS 用のセキュリティグループを作成します。
VPC ダッシュボードのメニューから、「セキュリティグループ」をクリックし、「セキュリティグループを作成」に進みます。
データベース用のセキュリティグループと分かるように名前をつけます。
作成した VPC を選択します。
インバウンドルールは、「タイプ」に「MySQL/Aurora」を選択します。
「ソース」には、以前作成したセキュリティグループを選択します。
こうすることで、以前作成したセキュリティグループに属する EC2 インスタンスから接続できるようになります。
アウトバウンドルールは設定せずに、「セキュリティグループを作成」をクリックします。
作成できました。
サブネットグループの作成
サービス検索窓に「RDS」と入力し、RDS ダッシュボードに移動します。
左メニューの「サブネットグループ」をクリックし、DB サブネットグループを作成」に進みます。
任意の名前を設定し、作成した VPC を選択します。
アベイラビリティゾーンは、サブネットを作成した 1a と 1c を選択します。
各アベイラビリティゾーンのプライベートサブネットにチェックを入れます。
ここで、パブリックサブネットも表示されているのでご注意ください。
IP アドレスを確認して登録します。
問題なければ「作成」をクリック。
パラメータグループの作成
RDB 作成の際に指定する、設定グループの一つであるパラメータグループを作成します。
RDB ダッシュボードのメニューから「パラメータグループ」をクリックし、「パラメータグループの作成」に進みます。
「パラメータグループファミリー」は「mysql8.0」を選択します。
「タイプ」は「DB Parameter Group」のままで大丈夫です。
任意のグループ名と説明を入力します。今回は、mysql のバージョンが分かるようにしました。
オプショングループの作成
続いて同じく設定グループの一つであるオプショングループを作成します。
RDB ダッシュボードのメニューから「オプショングループ」をクリックし、「グループを作成」に進みます。
RDB 作成
RDB ダッシュボードのメニューから「データベース」を選択し、「データベースの作成」から RDB を作成していきます。
エンジンバージョンは、現時点での最新バージョンを選択しました。
マルチ AZ の機能は、今回は利用せず、単体の DB インスタンスを作成します。
任意の名前を設定します。
DB インスタンスのマスターユーザー名とパスワードを作成します。
今回は、マスターユーザー名は root としました。
これらは分からなくならないように控えておいてください。
「インスタンスクラス」は、小さなスペックの db.t3.micro を選択しました。
「ストレージ割り当て」は 20 と少なめにしています。
「ストレージの自動スケーリング」は、今回は無効にしておきました。
VPC と サブネットグループは、作成したものを選択してください。
今回はデータベースに外部からアクセスできないようにしたいので、「パブリックアクセス」は「なし」を選択します。
「セキュリティグループ」は、RDB 用に作成した方のセキュリティグループを選択してください。
「アベイラビリティゾーン」は、今回は 1a を選択しました。
「拡張モニタリングの有効化」は、詳しいモニタリングをするかどうかの設定ですが、料金がかかるようでしたので無効にしておきました。
「最初のデータベース名」は、ここでは設定しません。
「DB パラメータグループ名」、「オプショングループ名」には、先程作成したグループを選択します。
自動バックアップは有効にして、保存期間は 30 日にしました。
例として、日本時間の午前4時にバックアップを取るようにしたい場合、UTC 標準時間では 19 時となるので、19:00 と設定します。
「ログのエクスポート」に関しては、今回は CloudWatch Logs に出力しないので、チェックをいれません。
「マイナーバージョン自動アップグレードの有効化」はチェックしておきます。
メンテナンスの時間は、例として日本時間午前5時である UTC 標準時間 20:00 に設定しました。
「削除保護」に関しては、今回練習用で削除することもあるかもしれないので、チェックは入れません。
月額利用料の見積もりも出ていますが、あくまで概算のようです。
問題がなければ、「データベースの作成」をクリックします。
3. MySQLデータベースの作成
EC2 インスタンスから RDS の MySQL に接続してして、データベースを作成します。
EC2 インスタンスにログイン
ターミナルから、SSH 接続で EC2 インスタンスにログインします。
ssh -i <秘密鍵ファイルへのパス> ec2-user@<パブリック IP>
MySQL のインストール
下記コマンドで、MySQL をインストールします。
sudo yum -y install mysql
データベースサーバーに接続
RDB ダッシュボードの「データベース」から、作成した RDS をクリックし、詳細画面から「エンドポイント」をコピーしておきます。
ターミナルを開き、下記コマンドでデータベースサーバーに接続する。
mysql -h <エンドポイント> -u root -p
このようになれば、接続成功です!
データベースを作成する
下記コマンドでデータベースを作成します。
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;
デフォルトで作成されているデータベースの他に、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;
作成したユーザーが、接続元ホストが %
(どこからでもよい)で登録されていることが確認できました。
作成したユーザーでログインし直す
一度ログアウトします。
exit;
作成したユーザー名でログインします。
mysql -h <エンドポイント> -u <ユーザー名> -p
接続できることが確認できたら、MySQL からログアウトします。
exit;
本記事はここまでです。
次の記事はこちら↓
初めての AWS で Laravel API をデプロイしてみた! - 第 5 弾:アプリケーション起動編