[AWS EC2]RDSを作成後、webサーバーからRDSに接続してみた

## はじめに
この記事はプログラミング初学者による備忘録用の記事であり、また、少しでも他の初学者のお役に立てればと思い書いています。

今回は、AWSのリレーショナルデータベースサービスであるRDSを作成し、webサーバーからRDSへの接続を試みたので、一連の流れと関連の知識を備忘録としてまとめておきたいと思います。

間違いなどがございましたら、ご指摘のほどよろしくお願い致します。

## RDSとは
RDSとは、AWSが運用・管理まで自動的に行ってくれるリレーショナルデータベースサービスのことを指します。

RDSは、OSのインストールやアップデート、バックアップやスケーリングなどを自動的に行ってくれるので、ユーザーはアプリケーションに対してデータベースを最適化することのみに注力することができます。

``RDSで利用可能なエンジン``
MySQL、Oracle、PostgreSQL、Amazon Aurora、VariaDB、Microsoft SQL Serverを利用することができます。(※2022/03/05時点)

RDSはフルマネージドサービスなので、ssh接続でDBサーバーにアクセスして各種設定を変更することができません。
ただし、下記のように一部ユーザーが変更可能な設定を**各種設定グループ**として設けてあります。

``各種設定グループ``
**・DBパラメータグループ**:DB設定値を制御する

**・DBオプショングループ**:RDSへの追加機能を制御する

**・DBサブネットグループ**:RDSを起動させるサブネットを制御する

``主な特徴``
**・可用性と耐久性**:
RDSでは、マルチAZを簡単に構築でき、データベースインスタンスの可用性と持続性を高めることが可能です。

**・高度な拡張可能性**:
RDSで利用できるエンジンタイプの多くは、1つ以上のリードレプリカを起動でき、プライマリデータベースインスタンスの読み取りトラフィックによる負荷を軽減できます。
また、ストレージのスケーリングも容易であり、ストレージ要件の拡大に合わせて、ストレージを追加でプロビジョニングできます。

**・運用負荷の軽減**:
RDSでは、本稼働用データベースの運用負荷を軽減するために、自動バックアップ、データベーススナップショットなどを備えています。
また、デプロイで使用するリレーショナルデータベースソフトウェアに最新のパッチが適用され、常に最新の状態が維持されています。

RDSの詳細は、参考文献のリンク先をご確認ください。
それでは、下記にてRDSの作成手順を記述していきます。(初めてRDS構築を実施したので、間違い等がございまいしたらご指摘下さい)

## 1.プライベートサブネットを作成する
RDSはマルチAZを簡単に構築できる優れたサービスであり、RDSはサブネットの中に設置します。
RDSを作成する際には、**マルチAZを構築できるように複数のアベイラビリティーゾーンにサブネットが作成されている**ことが必須条件となります。 
従って、RDSを作成する前にプライベートサブネット(インターネットから隠す為のサブネットであり、今回はDBサーバーを置くサブネット)を作成しておきます。

設定内容は、下記の通りです。

``VPC``
**・VPC ID**:プライベートサブネットを作成するVPCを選択します。

**・関連付けられたVPC CIDR**:VPC IDを選択すると自動的に表示されます。

``サブネットの設定``
**・サブネット名**:今回は、複数のプライベートサブネットが存在することになるので、後ほど選択するアベイラビリティーゾーンと対応していることが分かりやすいように、サブネット名の後ろを``1c``としています。

**・アベイラビリティーゾーン**:予め存在するプライベートサブネットとは異なるアベイラビリティーゾーンを選択して下さい。

**・IPv4 CIDR**:インターネットからアクセス可能な領域と不可能な領域を分けるために、パブリックサブネットとは異なる範囲を設定します。
(今回の場合、私の環境ではパブリックサブネットのIPv4CIDRが10.0.10.0/24で、予め存在するプライベートサブネットが10.0.20.0/24である為、区別がつきやすいように10.0.21.0/24としています)

これらの設定を決めた後にサブネットを作成します。

![スクリーンショット 2022-03-02 22.37.10（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/52570435-a91a-255f-0eaf-04221bb8002b.png)

## 2.RDSの各種設定グループを作成
RDSを作成する前に、いくつか作成しておくべきものがあるので先にそちらの方を作成していきます。

作成すべきものは下記の4つです。

・セキュリティグループの作成
・DBサブネットグループの作成
・DBパラメータグループの作成
・DBオプショングループの作成

### 2-1.セキュリティグループの作成
後ほどRDSで作成するデータベース用のセキュリティグループを作成します。

ここでの要点は、**指定するVPC**と**インバウンドに追加するタイプ**、**ソース**です。

**・VPC**:RDS作成における、DBインスタンスの仮想ネットワーク環境を定義する対象となるVPCを選択します。

**・タイプ**:webサーバーのみmysqlでデータベースに接続できるように、``MySQL Auror``を選択します。

**・ソース**:webサーバーを指定します。
指定する際に、個別のIPアドレスを指定することも可能ですが、サーバーを複数台運用する際にそれぞれ個別に指定する必要が出てきます。
それを避けるために、``webサーバー(EC2インスタンス)のセキュリティグループ``を指定します。セキュリティグループを指定することで、そのセキュリティグループ内のインスタンス(webサーバーのインスタンス)から接続可能になります。

![セキュリティグループ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/06afb89c-cae0-c23d-4538-4ea43ad2999a.png)

### 2-2.DBサブネットグループの作成
後ほどRDSインスタンスを作成する際に、DBサブネットグループというものを指定する必要があるので、事前に作成しておきます。

DBサブネットグループの作成では、特定のVPC内にあるサブネットから複数指定して、RDSインスタンスが起動するサブネットを決めます。

``サブネットグループの詳細``

**・名前**:分かりやすい名前を付けておきます。(インスタンス名 + subnet-groupなど)

**・VPC**:DBサブネットグループに使用するサブネットを持つVPC識別子を選択します。

``サブネットの追加``
RDSで使用するサブネット(プライベートサブネット)を選択します。

**・アベイラビリティーゾーン**:作成済みのプライベートサブネットのアベイラビリティーゾーンを選択します。

**・サブネット**:アベイラビリティーゾーンに対応した**プライベートサブネット**を選択します。


![DBサブネットグループ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/250b411c-6d5a-cd47-5eb0-47ecba64697a.png)

### 2-3.DBパラメータグループの作成
DBパラメータグループとは、RDSではDBの設定ファイルを直接編集することが不可能な為、代わりにDBの設定値を選択するものです。

``パラメータグループの詳細``

**・パラメータグループファミリー**:後ほど作成するRDSにおけるDBエンジンと同じDBエンジンのバージョンを指定します。

**・グループ名**:分かりやすいグループ名を付けて下さい。(名前の最後に-mysql80など)

作成後、パラメータグループを編集が可能となりますが詳細は[リンク先](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html)をご確認ください。

![パラメータグループ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/5c916bbc-37d8-bcae-7d0b-95eaf3e204ba.png)

### 2-4.DBオプショングループの作成
DBオプショングループでは、DBの機能的な部分を設定します。


![オプショングループ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/ac974bec-d9a6-8717-78bd-aa7eadc2f0f4.png)

``オプショングループの詳細``

**・エンジン**:RDSで使用するエンジンを指定します。

**・メジャーエンジンバージョン**:RDSで使用するエンジンのバージョンと同じバージョンを指定します。

## 3.AWSでRDSサービスを選択し、データベースを作成

データベースの作成画面を開き、下記の手順に従って必要事項を入力してください。

### 3-1.データベースの作成方法

全ての設定オプションを設定したいので、標準作成を選択します。

![スクリーンショット 2022-02-28 11.44.14（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/99b783ff-3160-8d8a-f393-02019ece4169.png)

### 3-2.エンジンを選択する

**・エンジンのタイプ:** MySQL(環境にあったエンジンを選択して下さい)
**・バージョン:** MySQL8.0.xx(バージョンに関しては、開発環境でのバージョンに合わせ、xxは作成するタイミングによって異なるので、選択できるバージョンを指定する)

![スクリーンショット 2022-02-28 16.47.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/79463a65-019e-c6a5-4919-b1bb42188f2f.png)

### 3-3.テンプレートの選択

今回は、練習を兼ねて作成するため、開発/テストを使用します。
実際に、サービスを運用する際は本番稼働用を選択して下さい。

![スクリーンショット 2022-03-01 15.54.22（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/eb37a385-ecf7-3d36-47d0-6623a1eb995c.png)


### 3-4.設定
**・DBインスタンス識別子:** AWSアカウントが現在のリージョンで所有している全てのDBインスタンスにおいて一意な名前を指定します。

**・マスターユーザー名:** マスターユーザーのログインIDを定義する英数字の文字列を指定します。
マスターユーザーログインを使用して、DBインスタンスのデータベースのすべてのユーザー、オブジェクト、アクセス許可の定義を開始します。
マスターユーザー名は、"awsuser" のように文字で始める必要があります。

**・パスワードの自動生成:** 有効にします。

![スクリーンショット 2022-02-28 16.50.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/b8223295-8113-14d8-a2d1-dc5f1fd5c597.png)


### 3-5.DBインスタンスクラスの設定
**・DBインスタンスクラス:** バースト可能クラスを選択します。
バーストパフォーマンスインスタンスは、ベースラインレベルのCPUパフォーマンスをもたらし、ベースラインを超えてバーストする機能を提供します。
サービスを運用する際は、標準クラスを選択して下さい。

**・以前の世代のクラスを含める:** オフにしておきます。

![スクリーンショット 2022-03-01 16.04.49（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/446b14b3-7894-0d88-6914-5ed2d781a69b.png)


### 3-6.ストレージの設定

**・ストレージタイプ:** 汎用(SSD)
汎用(SSD)ストレージは、幅広いデータベースワークロードに対応します。ベースラインとして``3IOPS/GiB``が提供され、``3,000IOPS``までバースト可能です。

**・ストレージ割り当て:** 20 GiB

**・ストレージの自動スケーリングを有効にする:** チェックしない
このDBインスタンスで計画されているワークロードに必要な動的ストレージのスケーリング設定を選択します。
詳細は[リンク先](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_PIOPS.StorageTypes.html#USER_PIOPS.Autoscaling)をご確認ください。
![スクリーンショット 2022-02-28 11.46.04（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/a3e7c583-b6e6-d947-b99a-53451a477842.png)

### 3-7.可用性と耐久性
マルチAZを選択した方た冗長性が向上しますが、その分料金も高くなる為、今回は利用しません。

![スクリーンショット 2022-03-01 16.05.06（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/fc861395-3ef8-a7e1-44da-2c8e7a8258c4.png)


### 3-8.DBインスタンスと接続するVPCの選択とその他設定
**・Virtual Private Cloud (VPC):** DBインスタンスの仮想ネットワーク環境を定義する``Virtual Private Cloud (VPC)``を選択します。

**・サブネットグループ:** 選択したVPCでDBインスタンスが使用できるサブネットとIP範囲を定義するDBサブネットグループを選択します。
先ほど作成したサブネットグループが選択できると思うので、そちらを選択して下さい。

**・パブリックアクセス:** ``なし``を選択します。
DBインスタンスをホストしているVPCの外部EC2インスタンスおよびデバイスをDBインスタンスに接続する場合は、``あり``を選択します。[なし] を選択した場合、Amazon RDSはパブリックIPアドレスをDBインスタンスに割り当てず、VPCの外部にあるEC2インスタンスやデバイスは接続できなくなります。

**・VPCセキュリティグループ:** ``既存の選択``を選びます。

**・既存のセキュリティグループ**:今回は、先ほど作成したセキュリティグループを選択します。(defaultは削除して下さい)

**・アベイラビリティーゾーン:** DBインスタンスを作成する現在のリージョンからアベイラビリティーゾーンを選択します。

**・追加設定(データベースポート):** この記事ではMySQLのデフォルトを選択します。

![スクリーンショット 2022-03-01 16.05.22（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/1518026f-92fa-4463-00ca-de9bc9dcbaa4.png)


### 3-9.データベース認証の設定

**・データベース認証オプション:** パスワード認証を選択します。
DBエンジンのネイティブパスワード認証機能を使用して、データベースユーザー認証情報を管理します。
詳細については、各DBエンジンの[ドキュメント](https://dev.mysql.com/doc/)を参照してください。

![スクリーンショット 2022-02-28 11.46.37（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/9ccd64d3-8a5e-5103-a641-90a88b126ce3.png)

### 3-10.追加設定

**・最初のデータベース名:** 一意の名前を付けておきます。
Amazon RDS が DB インスタンスを作成するときに、データベースに指定する名前を、最大 64 文字の英数字の文字列 ("mydb" など) で指定します。

**・DBパラメータグループ:** DBインスタンスに適用する構成設定を定義するDBパラメータグループを選択します。
今回は、先ほど作成したDBパラメータグループを選択します。
詳細は、[リンク先](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html)をご確認下さい。

**・オプショングループ**:今回は、先ほど作成したオプショングループを選択して下さい。

**・バックアップ:** 今回は使用しません。使用した場合、RDSが毎日自動的にバックアップを実行し、ユーザーは保存期間を選択できます。
また、バックアップを有効にした場合、バックアップウィンドウで自動バックアップの開始時間(UTC)を設定できます。

**・モニタリング:** 今回は使用しません。

**・ログのエクスポート:** 今回は使用しません。

**・メンテナンス:** 有効化を選択し、新しいマイナーバージョンがリリースされたときに自動的にアップグレードできるようにします。
メンテナンスウィンドウは設定しません。
(メンテナンスウィンドウでは、変更保留(DBインスタンスクラスの変更など)またはAmazon RDSによってDBインスタンスに適用されるパッチが必要な期間を選択します。)

**・メンテナンスウィンドウ**:マイナーバージョンの自動アップグレードの開始時間を設定できます。

**・削除保護:** 今回はサービス運用を目的としていないので使用していません。

![スクリーンショット 2022-02-28 11.47.51（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/d4a33ccc-4432-6061-797c-6e2e54a75f3c.png)


### 3-11.データベース作成後、接続の詳細を確認する
データベースの作成が完了すると、下記のような画面になり``接続の詳細を表示``を選択することができます。

![スクリーンショット 2022-02-28 11.53.14（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/9ed815c8-3b60-4c8f-26a1-ffd828355f42.png)


作成後、接続の詳細を表示を選択することで、下記の画面が表示されマスターユーザー名などを確認することができます。
マスターユーザー名などは、webサーバー上で.envファイル(Laravelの場合)を編集する際に使用します。

![スクリーンショット 2022-02-28 17.27.17（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/499973f2-7423-18cd-31ec-6c677516ad4e.png)

## 4.webサーバーからRDSに接続する
ターミナルを開き、下記のコマンドを実行してEC2インスタンスに接続して下さい。

```
$ ssh -i ~/.ssh/キーペア.pem ec2-user@パブリックIPアドレス

// 実行結果

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-###-##-##-## ~]$
``` 
EC2インスタンスに接続後、``ec2-user``の状態で``sudo yum -y install mysql``コマンドを実行してMySQLをインストールします。

```
[ec2-user@ip-###-##-##-## ~]$ sudo yum -y install mysql
// 実行結果
完了しました!と表示されていればインストールは成功です。
```
MySQLをインストールした状態で、RDSに接続します。
接続する際は、``mysql -h 接続対象のデータベースのエンドポイント.com -u 接続対象のデータベースのマスターユーザー名 -p``コマンドを実行して下さい。
実行後、パスワードの入力が求められるので、接続対象のデータベースの**マスターパスワード**を入力して下さい。

```
[ec2-user@ip-###-##-##-## ~]$ mysql -h 接続対象のデータベースのエンドポイント.com -u 接続対象のデータベースのマスターユーザー名 -p
// 実行結果
Enter password: パスワードの入力が求められるので、接続対象のデータベースのマスターパスワードを入力して下さい。
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.28 Source distribution

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```
上記のように表示されれば、webサーバーからRDSへの接続は成功です。

``補足``
**キーペアとは**
>キーペアには、プライベートキーと公開キーを含んでおり、 Amazon EC2インスタンスへの接続時の身分証明に使用する、セキュリティ認証情報のセットを構成しています。パブリックキーは、Amazon EC2 によりお客様のインスタンス内に保管されます。またプライベートキーは、お客様自身が保管します。
``引用:``[Amazon EC2 のキーペアと Linux インスタンス](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.html)

## 終わりに
今回は、RDSを作成後、webサーバーからRDSへの接続を試みました。
RDSは、フルマネージドサービスなのでログ等が簡単に確認でき、非常に使い勝手が良かったので今後も利用してRDSに対する知識を増やしたいと思えるようなサービスでした。
実際に、RDSを利用してLaravelアプリケーションを動かす際は、対象となるアプリケーションの.envファイルやnginx、php-fpm等を編集する必要がありますので、別の記事でまとめたいと思います。


## 参考文献
[Amazon Relational Database Service (Amazon RDS) Docs](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Welcome.html)
[RDS 概要](https://aws.amazon.com/jp/rds/)
[Amazon RDSでのMySQL](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_MySQL.html)