Yuki's Tech Blog

仕事で得た知見や勉強した技術を書きます。

【AWS:ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得】セクション6: 【RDS】DBサーバーを構築しようで知らなかったことをざっくりまとめてみた

目次

AWSでDBサーバーを構築する2つの方法

AWSでDBサーバーを構築するには、2つの方法があります。

方法1: EC2インスタンスを設置して、そこにDBMSをインストールする
方法1の場合、物理的なサーバー構築とOSインストールがAWS上で行えます。 しかし、DBMSのインストール、OSやソフトウェアのアップデート、バックアップやスケーリング、アプリケーションに対してのDB最適化などは自分で行う必要があります。  

方法2: RDSを使用する
方法2の場合、アプリケーションに対してのDB最適化以外、全部AWS上で行うことができます。また、RDSでは、DBにデフォルトでAWSエンジニアによるベストプラクティスな設定がされています。そのため、パフォーマンスが高くなるようになっています。

RDSを使用した方が構築や運用が楽です。

RDSとは

RDSとは、 AWSのフルマネージドなリレーショナルデータベースのサービスです。 RDSを使うことで、従来のDBサーバーの構築・運用に比べて、非常に楽になります。

またRDSでは以下のDBが使用できます。

利用可能なDB
MySQL
PostgreSQL
Oracle
Microsoft SQL Server
Amazon Aurora
Maria DB

(注) RDSはフルマネージドなサービスなので、DBサーバーにSSH接続してDBの各種設定をすることはできません。そのため、RDSでは設定できる項目が制限されています。しかし、ユーザーが変更できる部分は設定グループとしてAWSから提供されています。設定グループの値を変更することで、DBの設定をしていきます。

各種設定グループ 意味
DBパラメータグループ RDSの接続数など、DB設定値を制御します。
DBオプショングループ RDSヘの機能追加を制御します。
DBサブネットグループ DBサブネットグループは、RDSインスタンスが配置されうるVPCサブネット群をグループ化したものです。サブネットグループには2つ以上のサブネットを登録する必要があり、かつそれらのサブネットは最低2つのAZにまたがっている必要があります。シングルAZの場合でもこの「最低2つのAZにまたがっている必要がある」は必須です。

フルマネージドなサービスとは

フルマネージドなサービスとは、AWSが運用・管理を行ってくれるサービスのことです。

RDSの特徴

特徴1. 高い可用性
可用性向上のために、RDSではマルチAZを簡単に構築することができます。マルチAZの構成を選択すると、複数のアベイラビリティゾーンにまたがってRDSのインスタンスを作成します。一つをマスター、もう一つをスレーブと呼びます(スレーブはマスターをレプリケーションしたものです)。通常はマスター側を使用して、マスター側に問題が発生した場合、スレーブに自動的に切り替わるようにします。そうすることでサービスが停止しないようにできます。

特徴2. パフォーマンスの向上が楽
リードレプリカを簡単に構築することができます。リードレプリカとは、更新用データベース(マスター)からレプリケーションされた参照専用のデータベースです。RDSでは、マルチAZのように複数のRDSインスタンスを立ち上げて、マスターと同期された読み取り専用のRDSインスタンスを起動することができます。こうすることで、アプリケーションからのDBの読み込みはリードレプリカの方に任せて、書き込みはマスターにすることができるので、DBの負荷を下げてパフォーマンスを向上させることができます。

特徴3. 運用負荷の軽減
3.1) 自動的なバックアップ

  • 1日1回スナップショットと呼ばれるバックアップを自動取得してくれます。そして、そのスナップショットをもとにDBインスタンスを作成することができます(スナップショットからDBインスタンスを作成することをリストアと言います)。

3.2) 自動的なソフトウェアメンテナンス

  • OSやDBのマイナーバージョンのアップデートを指定した曜日や時間帯に自動的に実施してくれます。メンテナンスウインドウと呼ばれるものでいつアップデートを行うかを指定します。

3.3) 監視

  • 監視も自動的に行ってくれます。DBの各種メトリクスを60秒間隔で取得してくれて、マネジメントコンソール上から確認できます。

(※) 可用性とは障害等があってもサービスが停止しないということです。また、マルチAZとは、複数のアベイラビリティゾーンでシステムを構成することです。

(注) RDSではDBを設置するときに、DBの冗長化ができるように複数のアベイラビリティゾーンを必要とします(マルチAZ)。1台のDBに何か問題があっても、他のDBがあることでシステムがダウンしないようにRDSでは複数のアベイラビリティーゾーンにDBを設置することが推奨されています。そのため、RDSを使う際は、複数のDBを別のアベイラビリティゾーンに作れるように、複数のアベイラビリティゾーンにサブネットを用意しておく必要があります。

RDS用のプライベートサブネットを作成する

RDSを利用するために、プライベートサブネットを作ります。 現在、ap-northeast-1aというアベイラビリティゾーンにプライベートサブネットが作られているので、ap-northeast-1cにプライベートサブネットを作ります。blog-test-private-subnet-1cという名前で、VPC内のap-northeast-1cというアベイラビリティゾーンにプライベートサブネットを作りました。

Image from Gyazo

サブネットの作成方法は以下のブログを参考にします。

【AWS:ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得】セクション3: 【VPC】ネットワークを構築しようで知らなかったことをざっくりまとめてみた - Yuki's Tech Blog

RDSインスタンスを作成する

作成手順

手順1:
WebサーバーからDBサーバーにアクセスできるようにしたいので、DB用のセキュリティグループをまずは作成します。EC2のページを開いて、左サイドバーのセキュリティグループをクリックします。次に「セキュリティグループを作成」をクリックします。 Image from Gyazo

手順2:
セキュリティグループ名を入力します。今回はblog-test-db-security-groupという名前にしました。説明のところも同じ名前を入力します。VPCは自分で作成したものを選択します。 Image from Gyazo

手順3:
インバウンドのルールを追加します。WebサーバーだけDBサーバーに接続できるように設定します。タイプはMySQL/Auroraを設定します。これでMySQLの接続を許可できます。ソースの部分にはWebサーバー個別のIPアドレスを指定することもできますが、サーバーを複数運用していると、個別に指定しなければなりません。そこで、ソースにはセキュリティグループを指定します。そうすることで、セキュリティグループ内のインスタンスから接続できるようになります。セキュリティグループを指定するためには、カスタムにします。最後に「セキュリティグループを作成」をクリックします。これでセキュリティグループを作成できました。 Image from Gyazo

手順4:
RDSの設定画面を開きます。RDSインスタンスを作成する前に、各種設定グループを事前に設定していきます。「サブネットグループ」→「DBサブネットグループを作成」をクリックします。RDSインスタンスを起動するとき、DBサブネットグループを指定します。DBサブネットグループとは、 RDSインスタンスが配置されうるVPCサブネット群を指定してグループ化したものです。 マルチAZでは複数のサブネットを使用するので、RDSを作成するときは、DBサブネットグループを指定する必要があります。名前と説明は同じものを入力します。VPCは作成したものを選択します。次にサブネットの追加でRDSインスタンスが配置されうるVPCサブネット群を追加します。最後に「作成」をクリックします。これで、DBサブネットグループが作成されました。RDSインスタンスを作成する際にDBサブネットグループを指定すると、このサブネットグループで指定したプライベートサブネットの中にRDSインスタンスが作成されます。

Image from Gyazo

(注)DBサブネットを作成するときは、RDSインスタンスを設置するサブネット以外に、マルチAZ用のプライベートサブネットも指定します。

手順5:
RDSの設定画面から「パラメータグループ」→「パラメータグループの作成」をクリックします。DBパラメータグループとは、 RDSではDBの設定ファイルを直接編集できないので、その代わりにDBの設定値を指定するものです。 パラメータグループファミリーでDBエンジンのバージョンを指定します。今回はmysql8.0を指定します。グループ名はblog-test-mysql80にしました。説明も同じものを入力します。その後、「作成」を入力します。「パラメータグループアクション」→「編集」をクリックすると、パラメータグループを編集できます。変更可能なものはtrueで変更不可能なものはfalseです。今回は特に編集しません。 Image from Gyazo

手順6:
RDSの設定画面から「オプショングループ」→「グループの作成」をクリックします。オプショングループではDBの機能的な部分を設定します。プラグインの使用などが設定できます。名前はパラメータグループと同じ名前にしました(blog-test-mysql80)。説明も同じものを入力します。エンジンはmysql、メジャーエンジンのバージョンは8.0を指定します。最後に作成をクリックします。 Image from Gyazo

手順7:
RDSのダッシュボードから「データベース」→「データベースの作成」をクリックします。エンジンのオプションはMySQLを選択します。バージョンは8系の最新にします。テンプレートは開発/テストを選択します。本番環境の場合は本番稼働用を選択します。次にDBインスタンス識別子を入力します。 DBインスタンス識別子はRDSインスタンスの名前です。次にDBのマスターユーザーの名前とパスワードを入力します。今回はマスターユーザーの名前はrootにしておきます。 Image from Gyazo

手順8:
次にDBインスタンスクラスを設定します。本番用だと標準クラスを指定するのが良いですが、練習なので安いバースト可能クラスを選択します。次にストレージを設定します。練習の場合デフォルトの設定で特に問題ないですが、ストレージを自動で増やすオートスケーリングのチェックだけ外しておきます。 Image from Gyazo

手順9:
可用性と耐久性の部分で簡単にマルチAZの構成を作成することができます。今回はする必要がないので、単一のDBインスタンスを指定します。次に接続の部分で、自分で作成したVPCとDBサブネットグループを選択します。VPCの外側からアクセスすることはないので、パブリックアクセスはなしにします。次にRDSインスタンスに適用するセキュリティグループを指定します(デフォルトのセキュリティグループは消しときます)。アベイラビリティーゾーンはap-northeast-1aを指定します。 アベイラビリティゾーンを指定することで、DBサブネットグループで指定した同一のアベイラビリティゾーン内のサブネットにRDSインスタンスが設置されます。シングルAZの場合にこの項目は指定できます。マルチAZの場合は指定できません。 モニタリングは詳しい情報を見る必要がないので、チェックを外しておきました。 Image from Gyazo

手順10:
データベース名は入力せず、DBパラメータグループとオプショングループに先ほど作ったものを指定します。次に自動バックアップの有効化にチェックを入れておきます。バックアップ保存期間は長いほど良いので、30日くらいにしておきます。バックアップウインドウは自動バックアップの開始時間を指定します。UTC(世界協定時刻)で指定する必要があり、日本時間から9時間引くとUTCになります。朝の4時にスナップショットをとりたい場合、19時を指定しておけば大丈夫です。期間はどれくらいの時間でスナップショットを取るかを指定します。0.5時間にしました。 Image from Gyazo

手順11:
ログに関してはAmazon CloudWatch Logs で出力したいログを選択します。今回は特にチェックを入れませんでした。次にマイナーバージョン自動アップグレードの有効化は、MySQLの新しいマイナーバージョンがリリースされたら自動でアップグレードするかを聞いているので、チェックを入れます。また、いつアップグレードを行うかをメンテナンスウインドウで設定します。日曜日の朝5時(UTCだと20時)にしました。削除保護は間違ってDBを削除しないようにする設定です。今回は練習なので、チェックはつけません。最後に「データベースの作成」をクリックします。 Image from Gyazo

(注) テスト環境だとRDSインスタンスを停止しても問題ありませんが、本番環境ではRDSインスタンスは停止しない方が良いです。理由は、停止に時間がかかることがあるのと、起動しようとしたときにAWSのRDSインスタンスのリソースが余っていないとしばらく起動できないことがあるからです。

WebサーバーからRDSに接続する

WebサーバーからDBサーバーにMySQLコマンドで接続します。そのために、まずはWebサーバーにMySQLをインストールしてMySQLコマンドを使えるようにします。

作業手順

手順1:
EC2インスタンスのパブリックIPアドレスをコピーして、SSHでEC2インスタンスに接続します。以下のコマンドでEC2インスタンスに接続します。

ssh -i ./blog-test-ec2.pem ec2-user@54.250.26.39

手順2:
以下のコマンドでEC2インスタンスMySQLをインストールします。

sudo yum -y install mysql

DBサーバーに接続するためには、エンドポイントが必要なので、RDSインスタンスの接続とセキュリティに書いてあるエンドポイントをコピーします。その後、以下のコマンドでDBサーバーに接続します。

// -hの後ろにはRDSインスタンスのエンドポイントを指定します。
mysql -h blog-test-db.csnjegchinkg.ap-northeast-1.rds.amazonaws.com -u root -p

DBサーバーと接続が成功していれば以下のような画面になっています。 Image from Gyazo

インフラ構成図

以前のインフラ構成図にRDSを追加しました。

Image from Gyazo

参考記事

AWS:ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得 | Udemy

レプリケーション

マルチAZとは - 意味をわかりやすく - IT用語辞典 e-Words

リードレプリカのスケールアウト(データベースの負荷分散) - IIJ GIOベストプラクティス

【初心者向け】RDS for MySQLを構築しEC2からアクセスしてみる | DevelopersIO

RDSってなんでAZ(Availability Zone)を指定する項目がふたつあるの?