[AWS]RDSを利用してプライベートサブネットにDBサーバーを構築する ~備忘録~

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

今回は、AWS上でRDSを利用してプライベートサブネットにDBサーバー(MySQL)を構築する流れを学びましたので、すぐに復習できるよう記事にまとめておきたいと思います。

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

##RDSとは
RDSとは、AWSが提供するマネージド型リレーショナルデータベースのサービスです。

>
Amazon Relational Database Service (Amazon RDS) を使用すると、クラウド上のリレーショナルデータベースのセットアップ、オペレーション、スケールが簡単になります。ハードウェアのプロビジョニング、データベースのセットアップ、パッチ適用、バックアップなどの時間がかかる管理タスクを自動化しながら、コスト効率とサイズ変更可能なキャパシティーを提供します。これにより、アプリケーションに集中することができ、必要とされる高速なパフォーマンス、高可用性、セキュリティ、互換性をアプリケーションに実装できるようになります。
``引用:``[Amazon Relational Database Service (RDS)](https://aws.amazon.com/jp/rds/)

``特徴``

**・ユーザーの管理負担を軽減する**
Amazon RDS は、プロジェクトの計画からデプロイまでの手順を簡単にします。
RDSがスケーリング、バックアップ、アップデート、OSインストール、物理サーバーの設定等を自動的に構築・運用してくれるため、ユーザーはアプリ最適化に注力できるようになっています。

また、Amazon RDSでは、デプロイで使用するリレーショナルデータベースソフトウェアに最新のパッチが適用され、常に最新の状態が維持されたり、ユーザーのデータベースインスタンスの設定と使用率メトリクスを分析して、DBを利用するベストプラクティスを提供します。
<br>
**・安定したパフォーマンスを提供する**
Amazon RDSは、汎用 (SSD) ストレージを搭載しています。
>
汎用ストレージは SSD タイプのストレージオプションで、プロビジョニングされた容量 (GB) あたり 3 IOPS の安定したベースラインパフォーマンスを実現し、最大 3,000 IOPS までバーストする機能を備えています。
``引用:``[Amazon RDS の特徴](https://aws.amazon.com/jp/rds/features/)

<br>
**・高い可用性と耐久性を備える**
RDSでは、高い可用性を提供するためにマルチAZを簡単に構築できます。
<br>
**・パフォーマンスの向上を容易にできる**
パフォーマンスを向上するために、リードレプリカを簡単に構築できます。

###・RDS上で利用可能なエンジン
RDS上で利用可能なエンジンは、MySQL、PostgreSQL、Oracle、MariaDB、MicrosoftSQLServer、AmazonAuroraとなっています。(2021/08時点)

###・RDS上の各種設定グループ
RDSの仕様上、ユーザーが各自DBサーバーにSSH接続してDBの各種設定を行うことはできません。
従って、ユーザーが設定できる箇所は設定グループとしてAWS側から提供されています。

``各種設定グループ``

**・DBパラメータグループ**
DBパラメータグループは、1つ以上のDBインスタンスに適用されるエンジン設定値のコンテナとして機能し、DBインスタンスをパラメータグループに関連づけてDBエンジンの設定値を制御します。

要するに、カスタマイズした設定を使用して独自のパラメータグループを定義できます。

その他、DBパラメータグループの詳細については、[リンク先](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html)を確認してください。
<br>
**・DBオプショングループ**
DBオプショングループは、ベースとなるDBエンジンにデータ及びデータベースの管理を容易にしたりデータベースのセキュリティを強化する追加オプションが備わっている際に、Amazon RDSのDBオプショングループを使用することで、RDSへの機能追加として制御することが可能です。

DBオプションの設定では、そのオプションの動作を指定できます。DBインスタンスをオプショングループに関連付けると、指定したオプションとそれらの設定がそのDBインスタンスに対して有効になります。

その他、DBオプションの詳細については、[リンク先](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_WorkingWithOptionGroups.html)を確認してください。
<br>
**・DBサブネットグループ**
DBサブネットグループは、VPCに作成するサブネット(通常はプライベート)のコレクションで、DBインスタンス用に指定することでRDSを起動させるサブネットを制御します。

各DBサブネットグループには、特定のAWSリージョン内に最低でも2つのアベイラビリティーゾーンにサブネットが必要です。

DBサブネットグループのサブネットはパブリックまたはプライベートのいずれかを選択します。パブリックサブネットとプライベートサブネットの両方を混在させることはできません。

その他、DBサブネットグループの詳細については、[リンク先](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_VPC.WorkingWithRDSInstanceinaVPC.html#USER_VPC.Subnets)を確認してください。

##RDSを利用したDBサーバー 作成手順
上記のRDSに関する基礎知識を参考に、実際にRDSを作成していきたいと思います。

大まかな流れは下記の通りです。

1.複数のアベイラビリティーゾーンでプライベートサブネットを用意する(マルチAZのため)
2.RDSの作成準備のためにセキュリティグループ、各種設定グループの作成
3.RDSの作成

###1.プライベートサブネットの作成(複数)
サブネットの作成方法については、[別の記事](https://qiita.com/susuz/items/7e263ce6c4e686b54084#%E3%82%B5%E3%83%96%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90)でまとめていますので参考にしてください。

###2.RDSの作成準備
RDSの作成準備手順は下記の通りです。

1.セキュリティーグループの作成
2.各種設定グループの作成

###2-1.RDSへのアクセス権限設定をEC2のセキュリティーグループで行う
**RDSへのアクセス権限(ファイアーウォール)の設定は、EC2のセキュリティーグループで行います。**

webサーバーからRDSに指定したDBエンジン(MySQLなど)のみでアクセスできるように設定したりします。

まずは、EC2でセキュリティーグループの作成を実行します。

EC2サービス上でセキュリティーグループ作成画面に遷移し、下記のように必須項目を入力します。

``セキュリティーグループ名:``
どのサーバーに対するセキュリティ名かわかりやすいように設定します。
今回の場合、DBサーバーに対するセキュリティグループなので、後ろにdbを付けています。

``説明:``
セキュリティグループを識別するのに役立つ説明を入力します。

``VPC:``
どのVPC上に作成するかを選択します。

``インバウンドルール:``
セキュリティーグループのルールはインバウンドに追加してアクセス権限を設定します。
今回の場合、webサーバーのみMySQLでDBサーバーに接続可能とするため、MySQLのみから接続可能となるようにタイプを指定します。

**ソース**には、アクセスを許可するwebサーバー(IPアドレス)を指定できますが、複数webサーバーが存在する場合、個別に指定しなければなりません。それを回避するための解決策として、アクセスを許可するwebサーバーのセキュリティーグループを指定することができ、結果としてwebサーバーのインスタンスから接続できるようになります。
カスタムを選択して、入力欄でアクセスを許可するwebサーバーのセキュリティーグループを選択します。

![スクリーンショット 2021-09-01 16.46.52 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/aac43b82-80d1-77e9-d78e-ec5196bda5ca.png)

###2-2.各種設定グループの作成
作成の順番は、
1.DBサブネットグループ
2.DBパラメータグループ
3.DBオプショングループ
となっています。

RDSインスタンスを起動する際、まず初めに**DBサブネットグループを作成**します。
VPC内にあるサブネットを複数指定して、RDSインスタンスが起動するサブネットとして指定する設定になります。
指定することで、**マルチAZ(複数のサブネット利用)**が運用可能となります。

下記のように、RDSサービスに移動後、サブネットグループを選択してDBサブネットグループ作成画面に遷移し、必須項目を入力します。

``名前:``
DBサブネットグループの名前を決めます。

``説明:``
DBサブネットグループを識別するのに役立つ説明を入力します。

``VPC:``
どのVPC上に作成するかを選択します。

``アベイラビリティーゾーン:``
利用するサブネットが属するアベイラビリティーゾーンを複数選択します。

``サブネット:``
どのアベイラビリティーゾーンにどのサブネットが属しているのかを入力して利用するサブネットを登録します。


![スクリーンショット 2021-09-01 17.16.14 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/49ab3e68-aa8e-8855-526c-cb1a6c359eeb.png)

次に、**DBパラメータグループ**を作成します。
RDSではDBの設定ファイルを直接編集できないので、DBパラメータグループを設定することで設定ファイルを編集します。

下記のように、RDSサービスに移動後、パラメータグループを選択してDBパラメータグループ作成画面に遷移し、必須項目を入力します。

``パラメータグループファミリー:``
利用するDBエンジンのバージョンを指定します。

``グループ名:``
利用するDBエンジン名を付けると分かりやすいと思われます。

``説明:``
DBパラメータグループを識別するのに役立つ説明を入力します。

![スクリーンショット 2021-09-01 17.32.39 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/54b9f781-c683-dcae-f527-58cb1774b84b.png)

作成したDBパラメータグループを選択すると、下記のように変更不可を含む複数のパラメータの一覧が表示されます。

``タイプの適用:``
DBパラメータを変更したときに、staticの場合はRDSインスタンスの起動後に変更が反映され、dynamicの場合は動的に変更が反映されることを表しています。

``値のタイプ:``
変更可能かどうかがわかります。

![スクリーンショット 2021-09-01 17.36.20 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/72601f20-685e-08b1-67f4-56a8a7ac2ce9.png)

最後に、**DBオプショングループ**を作成してDBの機能的な部分を設定します。

下記のように、RDSサービスに移動後、オプショングループを選択してDBオプショングループ作成画面に遷移し、必須項目を入力します。

``名前:``
オプショングループ名を入力します。

``説明:``
DBオプショングループを識別するのに役立つ説明を入力します。

``エンジン:``
利用するDBエンジンを選択します。

``メジャーエンジンバージョン:``
利用するDBエンジンのバージョンを指定します。

![スクリーンショット 2021-09-01 17.45.27 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/933e15d0-9d8c-8da0-254e-c15fbc13bf25.png)

オプショングループを作成すると、デフォルトのオプショングループも同時に作成されます。

以上で、RDSの作成準備は完了です。

###3.RDSの作成
MySQL データベースを実行するための環境 (この環境をインスタンスと呼びます) を作成する方法、データベースに接続する方法、DBインスタンスを削除する方法については、[リンク先](https://aws.amazon.com/jp/getting-started/hands-on/create-mysql-db/)でわかりやすくまとめられているので参考にしてください。



##補足
上記内容で出てきたRDSの用語についてまとめておきます。
###・DBインスタンス
DBインスタンスは、クラウドで実行される独立したデータベース環境です。
DBインスタンスには、ユーザーが作成した複数のデータベースを含めることができ、スタンドアロンデータベースインスタンスにアクセスする場合と同じクライアントツールやアプリケーションを使用してアクセスできます。

※スタンドアロンとは
ネットワークにつながっていないコンピュータのことを指し、ネットワークから切り離された状態になっています。

###・マルチAZ
マルチAZとは、複数のアベイラビリティーゾーン間でRDSインスタンスを作成して1つをマスター、もう片方をスレーブ(マスターをコピーしたもの)として扱い、マスター側で問題が発生した場合、自動的にスレーブへと切り替わる仕組みになっています。

###・リードレプリカ
リードレプリカとは、複数のRDSインスタンスを立ち上げて、マスターと同期された読み込み専用のRDSインスタンスを起動する仕組みになっています。リードレプリカのおかげで、アプリケーションからのDBの読み込みはリードレプリカを使用し、書き込みはマスターを指定することができ処理を分散させることで、DBの負荷を軽減しパフォーマンスを向上させることが可能な仕組みになっています。

##参考文献
[Amazon Relational Database Service (RDS)](https://aws.amazon.com/jp/rds/)
[Amazon RDS マルチ AZ 配置](https://aws.amazon.com/jp/rds/features/multi-az/)
[Amazon RDS DB インスタンス](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Overview.DBInstance.html)
[Amazon RDS リードレプリカ](https://aws.amazon.com/jp/rds/features/read-replicas/)
[MySQL データベースを作成して接続する](https://aws.amazon.com/jp/getting-started/hands-on/create-mysql-db/)