概要
Web アプリケーションの多くは、会員情報や注文履歴などのデータをリレーショナルデータベース(RDB)に保存します。EC2 インスタンスに MySQL や PostgreSQL を自分でインストールして運用することもできますが、その場合は OS やデータベースソフトウェアのパッチ適用、バックアップ、障害時の復旧まで、すべて自分で面倒を見る必要があります。
Amazon RDS(Relational Database Service)は、こうした管理作業の多くを AWS が引き受けるマネージド型のリレーショナルデータベースサービスです。MySQL・PostgreSQL・MariaDB・Oracle・SQL Server・Db2 のエンジンから選んで、数分でデータベースを用意できます。
この記事では、RDS の基本概念(マネージド DB の責任範囲、マルチ AZ 配置とリードレプリカ、バックアップ、DB サブネットグループ、セキュリティグループ)と Amazon Aurora との違いを押さえたうえで、プライベートサブネットに MySQL の DB インスタンスを作成し、パブリックサブネットの Web サーバー(EC2)から接続して SQL を実行するまでを体験します。
クラウドおさる今日は、外からは届かない奥の部屋にデータベースを置いて、Web サーバーからだけ話しかけられるようにするのでござる。猿山でいえば、長老会の帳簿蔵は山の奥にあって、見張り番の猿を通さないと近づけない、あの形でござるな。


この記事のメリット
- マネージドデータベースで AWS が肩代わりしてくれる作業と、利用者に残る作業を区別できる
- RDS で選べる DB エンジンと DB インスタンスクラスの考え方を把握できる
- マルチ AZ 配置とリードレプリカの違い(可用性のためか、読み取り性能のためか)を説明できる
- 自動バックアップと手動スナップショットの違いを理解できる
- DB サブネットグループとセキュリティグループを使って、DB を外部から隔離する構成を作れるようになる
- Amazon Aurora と RDS の違い(ストレージの仕組み、Aurora Serverless)を把握できる
執筆者とキャラクター紹介
執筆者:土肥(とひ)
株式会社ジェニュインの代表であり元エンジニア。これまでオンプレミスと AWS 環境のインフラ業務を担当。AWS 認定資格の学習で得た知識を、ハンズオンとともに解説するのが得意。直近では新人の教育も行っており、これから技術を学ぶ方が納得できる解説を心がけています。基礎編・Cloud Practitioner の記事では、解説役としても登場します。


クラウドおさる



はじめましてでござる。弊猿はクラウドおさる。IT インフラが異常に発達した猿山から、雲に乗って地上の AWS を学びに降りてきたのでござる。



基礎編や Cloud Practitioner の記事では、とひさんに素朴な疑問をぶつける役でござるな。Security - Specialty などの記事では、要所でワンポイントや注意点をひとこと添えるでござる。



猿山にもデータセンターや監視当番があって、地上で起きることはだいたい猿山にも同じ仕組みがあるのでござる。例え話がつい猿山に寄るのは、弊猿の癖でござる。
技術解説
マネージドデータベースで AWS が肩代わりすること



とひさん、データベースなら EC2 に MySQL を入れれば動くでござるよね。わざわざ RDS を使うのはなぜでござるか?
もちろん EC2 に入れても動くよ。ただその場合、OS のパッチ当て、データベースソフトウェアの更新、バックアップ、壊れたときの復旧まで、ぜんぶ自分の仕事になるんだ。RDS はそういう「データベースを動かし続けるための作業」の多くを AWS が引き受けてくれるサービスなんだよ。



具体的には、どこまでやってくれるのでござる?
まとめるとこんな感じだね。
| 担当 | 主な作業 |
|---|---|
| AWS(RDS) | サーバーのハードウェア保守、OS のインストールとパッチ適用、DB ソフトウェアのパッチ適用、自動バックアップ、障害の自動検出と復旧、マルチ AZ 配置時のフェイルオーバー |
| 利用者 | データベースの設計、SQL(クエリ)のチューニング、アプリケーションの最適化、アクセス制御(セキュリティグループ・ユーザー権限)の設定 |
使う側から見ると、DB インスタンスごとに用意されるエンドポイント(接続先のホスト名)を指定して、普段と同じ MySQL クライアントやアプリケーションから接続するだけなんだ。



なるほど、蔵の修繕や鍵の交換は AWS にお任せして、弊猿たちは帳簿の中身を考えることに集中できるのでござるな!
そうそう、その通り! ただ、帳簿をどう整理するか、誰に蔵の鍵を渡すかは利用者の仕事として残る、というところも覚えておいてね。
DB エンジンと DB インスタンスクラス



RDS ではどんなデータベースが使えるのでござるか?
RDS で選べるエンジンは 6 種類だよ。
| エンジン | 特徴 |
|---|---|
| MySQL | オープンソース |
| PostgreSQL | オープンソース |
| MariaDB | オープンソース |
| Oracle Database | 商用エンジン |
| Microsoft SQL Server | 商用エンジン |
| IBM Db2 | 商用エンジン |
「データベースそのもの」が動く環境のことを DB インスタンスと呼ぶんだ。1 つの DB インスタンスの中に、データベースを 1 つ以上作れるよ。



EC2 のインスタンスタイプのように、大きさも選ぶのでござるか?
いいところに気づいたね! それが DB インスタンスクラスだよ。CPU とメモリの量が決まっていて、db. で始まる名前になっているんだ。
| 種類 | 名前の例 | 向いている用途 |
|---|---|---|
| 汎用 | db.m* | バランスの取れた一般的なワークロード |
| メモリ最適化 | db.r*、db.x*、db.z* | メモリを多く使う大きなデータベース |
| コンピューティング最適化 | db.c* | CPU 負荷の高いワークロード |
| バースト可能パフォーマンス | db.t* | 開発・検証や負荷の小さいワークロード |



今日のハンズオンのような小さな検証なら、バースト可能な db.t* の小さいサイズで十分でござるな。
マルチ AZ 配置とリードレプリカ



データベースが 1 台だけだと、壊れたときが心配でござる……。
そのための仕組みが 2 つあるんだけど、目的が違うから混同しないようにしようね。まずはマルチ AZ 配置。プライマリの DB インスタンスとは別の AZ にスタンバイを置いて、データを同期的に複製しておくんだ。プライマリや AZ に障害が起きたら、スタンバイに自動でフェイルオーバーするよ。



予備の帳簿蔵を別の山に建てておいて、毎回同時に書き込むのでござるな! では、普段はスタンバイの蔵からも帳簿を読めるのでござる?
そこがひっかけポイントなんだ。マルチ AZ の DB インスタンス配置では、スタンバイは読み取りのトラフィックを処理しないんだよ。あくまで「落ちないため」の仕組みで、「読み取りを速くする」ための仕組みじゃないんだ。読み取りを分散したいときに使うのがリードレプリカだよ。
リードレプリカは DB インスタンスの読み取り専用コピーで、プライマリへの更新が非同期でコピーされるんだ。参照系のクエリをリードレプリカに向ければ、プライマリの負荷を減らせるよ。別のリージョンに作ることもできるんだ。
| 項目 | マルチ AZ 配置(DB インスタンス) | リードレプリカ |
|---|---|---|
| 主な目的 | 可用性(障害時の自動フェイルオーバー) | 読み取り性能の向上(読み取り負荷の分散) |
| レプリケーション | 同期 | 非同期 |
| コピー側で読み取り | できない(スタンバイは読み取りを処理しない) | できる(読み取り専用) |
| 配置できる場所 | 同じリージョンの別の AZ | 同じリージョン、または別のリージョン |





マルチ AZ にすると、同じ構成のスタンバイインスタンスがもう 1 台できるので、その分の料金がかかるのでござる。本番では心強い仕組みでござるが、練習で試すときはバナナの減り方に気をつけるのでござるぞ。
そうだね。ちなみにスタンバイを 2 つ持ち、読み取りも処理できる「マルチ AZ DB クラスター」という配置もあるけど、今回は名前だけ覚えておけば大丈夫だよ。
自動バックアップとスナップショット



バックアップも AWS がやってくれると言っていたでござるが、どういう仕組みでござるか?
RDS には自動バックアップと手動スナップショットの 2 種類があるよ。自動バックアップは、毎日のバックアップウィンドウの間にストレージボリューム全体のスナップショットを取っておいてくれるもの。保持期間の範囲内なら、好きな時点に戻せる「ポイントインタイムリカバリ」ができるんだ。



保持期間は、どれくらいに決められるのでござる?
DB インスタンスなら 0〜35 日の範囲で決められて、コンソールで作るとデフォルトは 7 日だよ。0 にすると自動バックアップが無効になるんだ。一方、手動スナップショットは自分で好きなタイミングで取るもので、保持期間の影響を受けず、自分で消すまで残り続けるよ。
| 項目 | 自動バックアップ | 手動スナップショット |
|---|---|---|
| 取得タイミング | バックアップウィンドウ中に自動で取得 | 利用者が任意のタイミングで取得 |
| 保持期間 | 0〜35 日で指定(0 で無効) | 期限切れにならない。明示的に削除するまで残る |
| 復元できる時点 | 保持期間内の任意の時点(ポイントインタイムリカバリ) | スナップショットを取った時点 |
| DB インスタンス削除時 | 保持しない設定にすると一緒に削除される | 削除されずに残る |



自動バックアップは毎日の帳簿の写しで、古いものから処分されていく。手動スナップショットは「この日の帳簿は長老会の記念に取っておく」という特別な写しでござるな!
うまい例えだね! 大事な変更の前に手動スナップショットを取っておく、という使い方がよくされるよ。
DB サブネットグループとパブリックアクセス



DB インスタンスは、VPC のどこに置かれるのでござるか?
RDS では、DB を置いてよいサブネットのセットを「DB サブネットグループ」として先に用意するんだ。ここで大事なのは、DB サブネットグループには少なくとも 2 つの AZ のサブネットが必要、ということ。シングル AZ で使うときでも、このルールは同じなんだよ。



1 台しか置かないのに、2 つの AZ が要るのでござるか?
そう、DB サブネットグループを作るときのルールとして決まっているんだ。だから今回の VPC にも、DB 用のプライベートサブネットを 2 つの AZ に 1 つずつ用意してあるよ。それから「パブリックアクセス」という設定もあるよ。「はい」にすると DB インスタンスにパブリック IP アドレスも付くんだけど、Web サーバーからだけ使う DB なら「なし」にして、プライベートサブネットに置くのが基本だよ。



帳簿蔵は山の奥(プライベートサブネット)に建てて、表の道(インターネット)には入口を作らない、ということでござるな。
その通り! ちなみに VPC の中から DB のエンドポイントを名前解決すると、DB のプライベート IP アドレスが返ってくるよ。実践で確かめてみよう。
セキュリティグループで EC2 からだけ許可する



プライベートサブネットに置けば、それだけで安全なのでござるか?
もう一段あるよ。DB インスタンスにもセキュリティグループを付けて、どこからの通信を受け付けるかを決めるんだ。ここでのポイントは、ソースに IP アドレスではなく「EC2 インスタンスのセキュリティグループ」を指定できること。



IP アドレスではなく、セキュリティグループを指定するとどうなるのでござる?
「このセキュリティグループが付いているインスタンスからの通信だけを許可する」という意味になるんだ。Web サーバーが増えたり IP アドレスが変わったりしても、同じセキュリティグループを付けておけばルールを書き直さなくていいんだよ。今回は次の 2 つを用意するね。
| セキュリティグループ | 付ける先 | インバウンドルール |
|---|---|---|
rds-web-sg | Web サーバー(EC2) | なし(Session Manager で接続するため) |
rds-db-sg | DB インスタンス | タイプ MYSQL/Aurora(TCP 3306)、ソース rds-web-sg |





「見張り番の腕章を付けた猿だけ蔵に入ってよい」という決まりにしておけば、見張り番が交代しても決まりを書き直さなくてよいのでござるな!
そういうこと! セキュリティグループの基本は セキュリティグループとネットワーク ACL でアクセスを制御する の記事でも詳しく扱っているよ。
Amazon Aurora との違い



RDS のコンソールを見ると、Aurora というものもあるでござる。RDS と何が違うのでござるか?
Aurora は MySQL・PostgreSQL と互換性のあるフルマネージドのリレーショナルデータベースエンジンで、RDS と同じコンソールから作れるんだ。同等のハードウェアで、標準の MySQL や PostgreSQL の最大 6 倍のスループットが出るとされているよ。一番大きな違いはストレージの仕組みだね。
RDS の DB インスタンスはそれぞれ自分のストレージを持つけど、Aurora は「クラスターボリューム」という共有のストレージを使うんだ。データは 1 つのリージョンの 3 つの AZ にコピーされていて、データ量に合わせて自動で拡張されるよ。読み取り用の Aurora レプリカは最大 15 個まで作れて、プライマリと同じクラスターボリュームにつながるんだ。
| 項目 | RDS(MySQL / PostgreSQL など) | Amazon Aurora |
|---|---|---|
| エンジン | 6 種類から選択 | MySQL 互換 / PostgreSQL 互換 |
| ストレージ | DB インスタンスごとにストレージを割り当てる | クラスターボリューム(3 AZ にコピー、データ量に応じて自動拡張) |
| 読み取りの分散 | リードレプリカ(非同期でコピー) | Aurora レプリカ(最大 15 個。同じクラスターボリュームを共有) |
| 構成単位 | DB インスタンス | DB クラスター(ライター 1 台 + リーダー + クラスターボリューム) |



Aurora Serverless というのも聞いたことがあるでござる。サーバーがないのでござるか?
サーバーを意識しなくていい、という意味だね。Aurora Serverless v2 は、ACU(Aurora キャパシティーユニット)という単位で、負荷に合わせて容量を自動で増減してくれるんだ。使っていないときにゼロまで縮めて一時停止する設定もあるよ。負荷の変動が大きいアプリケーションや、トラフィックが予測しにくいアプリケーションに向いているね。



収穫期だけ大勢の猿が蔵に押し寄せる猿山には、ぴったりでござるな!
ははは、まさにそういうイメージ! 今回は基本を押さえるために、RDS for MySQL の小さな DB インスタンスで実際に手を動かしてみよう。
実践
プライベートサブネットに RDS for MySQL の DB インスタンス(シングル AZ、パブリックアクセスなし)を作成し、パブリックサブネットの Web サーバー(EC2)から mysql クライアントで接続して SQL を実行します。DB 用のセキュリティグループと DB サブネットグループも手順の中で作成します。
前提条件
- リージョン:
ap-northeast-1(東京) - AWS マネジメントコンソールにログイン済みで、IAM ユーザーまたはロールに RDS・EC2・Systems Manager の操作権限があること
- 以下のリソースが作成済みであること
| リソース種別 | リソース名 | 内容 |
|---|---|---|
| VPC | rds-vpc | CIDR 10.0.0.0/16 |
| パブリックサブネット | rds-public-subnet-1a / rds-public-subnet-1c | 10.0.1.0/24(ap-northeast-1a)/ 10.0.2.0/24(ap-northeast-1c)。インターネットゲートウェイへのルートあり |
| プライベートサブネット | rds-private-subnet-1a / rds-private-subnet-1c | 10.0.11.0/24(ap-northeast-1a)/ 10.0.12.0/24(ap-northeast-1c)。インターネットへのルートなし |
| セキュリティグループ | rds-web-sg | Web サーバー用。インバウンドルールなし |
| EC2 インスタンス | rds-web-server | Amazon Linux 2023。rds-public-subnet-1a に配置し、rds-web-sg を付与。mysql クライアント(mariadb105)をインストール済み。AmazonSSMManagedInstanceCore を含むインスタンスプロファイルが付与され、Session Manager で接続できる状態 |
VPC とサブネットの考え方は Amazon VPC で仮想ネットワークを構築しサブネットを設定する、EC2 の基本は Amazon EC2 でインスタンスを起動しSSH接続する を参照してください。
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| セキュリティグループ | rds-db-sg | DB インスタンス用。rds-web-sg からの TCP 3306 のみ許可 |
| DB サブネットグループ | rds-db-subnet-group | DB を置くプライベートサブネット 2 つ(2 AZ)のセット |
| RDS DB インスタンス | rds-handson-db | RDS for MySQL。シングル AZ、パブリックアクセスなし |
DB 用のセキュリティグループを作成する
- AWS マネジメントコンソールにログインし、リージョンが
ap-northeast-1(東京)であることを確認します - 上部の検索バーに
EC2と入力し、表示された「EC2」を選択します - 左側ナビゲーションの「ネットワーク & セキュリティ」→「セキュリティグループ」を選択します
- 右上の「セキュリティグループを作成」をクリックします
- 「基本的な詳細」で以下を入力します
- セキュリティグループ名:
rds-db-sg - 説明:
Security group for rds-handson-db - VPC:
rds-vpc - 「インバウンドルール」セクションで「ルールを追加」をクリックし、以下を入力します
- タイプ:
MYSQL/Aurora(プロトコルTCP、ポート範囲3306が自動で入ります) - ソース:
カスタムのまま、右の検索ボックスにrds-web-sgと入力して候補から選択 - 「アウトバウンドルール」はデフォルトのままにします
- ページ下部の「セキュリティグループを作成」をクリックします


DB サブネットグループを作成する
- 上部の検索バーに
RDSと入力し、表示された「Aurora and RDS」を選択します - 左側ナビゲーションの「サブネットグループ」を選択します
- 「DB サブネットグループを作成」をクリックします
- 「サブネットグループの詳細」で以下を入力します
- 名前:
rds-db-subnet-group - 説明:
Private subnets for rds-handson-db - VPC:
rds-vpc - 「サブネットを追加」で以下を選択します
- アベイラビリティーゾーン:
ap-northeast-1aとap-northeast-1c - サブネット:
10.0.11.0/24(rds-private-subnet-1a)と10.0.12.0/24(rds-private-subnet-1c) - 「作成」をクリックします


サブネットグループの一覧に rds-db-subnet-group が表示されることを確認します。
DB インスタンスを作成する
「データベースの作成」は設定項目が多いため、ここで指定する項目以外はすべてデフォルトのままにします。
- 左側ナビゲーションの「データベース」を選択し、「データベースの作成」をクリックします
- 「データベース作成方法を選択」で
フル設定を選択します - 「エンジンのオプション」の「エンジンのタイプ」で
MySQLを選択します(エンジンバージョンはデフォルトのまま) - 「テンプレート」で
無料利用枠を選択します(無料利用枠を選ぶと、次の「可用性と耐久性」がシングル AZ に、インスタンスクラスがdb.t4g.microに切り替わります) - 「可用性と耐久性」の「デプロイオプション」が
シングル AZ DB インスタンスデプロイ (1 インスタンス)(スタンバイインスタンスを作成しない構成)になっていることを確認します - 「設定」で以下を入力します
- DB インスタンス識別子:
rds-handson-db - マスターユーザー名:
admin - 認証情報管理:
セルフマネージド - マスターパスワード / パスワードを確認: 任意のパスワード(8 文字以上)を入力し、控えておきます
- 「インスタンスの設定」で、
バースト可能クラス (t クラスを含む)が選択され、インスタンスタイプがdb.t4g.microになっていることを確認します - 「ストレージ」はデフォルトのままにします


続けて、同じ画面の「接続」セクションを以下のように設定します。DB をプライベートサブネットに置き、rds-web-sg からの通信だけを受け付けるための設定です。
- コンピューティングリソース:
EC2 コンピューティングリソースに接続しない - Virtual Private Cloud (VPC):
rds-vpc - DB サブネットグループ:
rds-db-subnet-group - パブリックアクセス:
なし - VPC セキュリティグループ (ファイアウォール):
既存の選択を選び、defaultを「×」で外してrds-db-sgを選択 - アベイラビリティーゾーン:
指定なし(デフォルト)


- 「データベース認証」の「データベース認証オプション」は
パスワード認証のままにします - 「追加設定」を開き、「最初のデータベース名」に
handsondbと入力します(その他の項目はデフォルトのまま) - ページ下部の「データベースの作成」をクリックします
データベースの一覧に rds-handson-db が表示されます。作成には少し時間がかかります。ステータスが「利用可能」になるまで待ちます。
rds-handson-dbを選択し、「接続とセキュリティ」タブを開きます- 「接続手順」の
mysql -hに続く値が DB のエンドポイント(rds-handson-db.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.comの形式)です。エンドポイントとポート3306を控えます - 「セキュリティグループのルール」に、
rds-db-sgのインバウンドルール(ソースがrds-web-sgのセキュリティグループ ID)が表示されていることを確認します





DB インスタンスは、使っていなくても起動している間ずっとインスタンス時間の料金がかかるのでござる。一時停止しても 7 日たつと自動で起動するので、練習が終わったら消しておくのが安心でござるな。
EC2 から DB に接続して SQL を実行する
- 上部の検索バーに
EC2と入力し、表示された「EC2」を選択します - 左側ナビゲーションの「インスタンス」を選択し、
rds-web-serverを選択して「接続」をクリックします - 「セッションマネージャー」タブを選択し、「接続」をクリックします
- ブラウザ上にターミナルが開いたら、まず DB のエンドポイントを名前解決します。
<エンドポイント>は控えた値に置き換えてください
getent hosts <エンドポイント>10.0.11.x または 10.0.12.x のプライベート IP アドレスが返り、DB がプライベートサブネットにあることが確認できます。
- mysql クライアントで DB に接続します。パスワードを聞かれたら、作成時に設定したマスターパスワードを入力します
mysql -h <エンドポイント> -P 3306 -u admin -pMySQL [(none)]> のようなプロンプトが表示されれば接続成功です。
- 最初のデータベースとして作成した
handsondbに切り替え、テーブルを作ってデータを入れてみます
USE handsondb;
CREATE TABLE members (id INT PRIMARY KEY, name VARCHAR(50));
INSERT INTO members VALUES (1, 'cloud-osaru'), (2, 'tohi');
SELECT * FROM members;SELECT の結果に 2 行が表示されれば、EC2 からプライベートサブネットの RDS へ接続して読み書きできています。


exitと入力して mysql クライアントを終了します



DB にはパブリック IP もインターネットへの道もないのに、腕章(rds-web-sg)を付けた Web サーバーからだけは話しかけられたのでござる。プライベートサブネット・パブリックアクセスなし・セキュリティグループ参照の 3 つがそろって、この形になるのでござるな。
まとめ
- Amazon RDS は、OS や DB ソフトウェアのパッチ適用、バックアップ、障害検出と復旧などを AWS が引き受けるマネージドのリレーショナルデータベースサービスである
- エンジンは MySQL・PostgreSQL・MariaDB・Oracle・SQL Server・Db2 から選び、性能は DB インスタンスクラスで決まる
- マルチ AZ 配置は可用性のための仕組み(同期レプリケーション、スタンバイは読み取りを処理しない)、リードレプリカは読み取り性能のための仕組み(非同期レプリケーション、読み取り専用)である
- 自動バックアップは保持期間(0〜35 日)内の任意の時点に復元でき、手動スナップショットは削除するまで残る
- DB サブネットグループには 2 つ以上の AZ のサブネットが必要で、パブリックアクセスを「なし」にしてプライベートサブネットに置くのが基本である
- DB 側のセキュリティグループのソースに EC2 のセキュリティグループを指定すると、そのセキュリティグループを持つインスタンスからの通信だけを許可できる
- Amazon Aurora は MySQL / PostgreSQL 互換のエンジンで、3 AZ にコピーされ自動拡張するクラスターボリュームを使う。Aurora Serverless v2 は負荷に応じて容量を自動で増減する
参照先
- Amazon Relational Database Service (Amazon RDS) とは
- Amazon RDS でのマルチ AZ 配置の設定と管理
- Amazon RDS のマルチ AZ DB インスタンスデプロイ
- DB インスタンスのリードレプリカの操作
- バックアップの概要
- バックアップの保存期間
- Amazon RDS のシングル AZ DB インスタンスの DB スナップショットの作成
- VPC 内の DB インスタンスの使用
- セキュリティグループによるアクセス制御
- DB インスタンスの設定
- Amazon RDS DB インスタンスを作成する
- MySQL DB インスタンスの作成と接続
- MySQL コマンドラインクライアントのインストール
- Amazon RDS DB インスタンスの請求
- 一時的に Amazon RDS DB インスタンスを停止する
- Amazon RDS インスタンスのデプロイタイプ変換に関する詳細(AWS re:Post)
- Amazon Aurora とは
- Amazon Aurora DB クラスター
- Amazon Aurora ストレージ
- Aurora serverless の使用
- ステップ 1: Session Manager の前提条件を満たす













