+ 作るログイン
1 / 22
AWS でサービスを作る ― 知識ゼロから、構成を自分で考えられるまで / 全32章

AWS 13:RDS ― データベースをサーバーから分けて預ける

発行
アニメモ公式
版
第2版
改訂
コマ
全22

サーバーを使い捨てにすると、データの置き場が無くなる。データベースをサーバーから分けて1か所にまとめ、その世話を AWS に任せるのが RDS です。プライベートサブネットへの置き方、エンドポイント、別の AZ に待機系を置く Multi-AZ と読み取りを分けるリードレプリカの違い、時刻を指定して戻せるバックアップ、接続数の問題と RDS Proxy、Aurora までを、フォトログの利用者・写真・いいねの表を例に説明します。

サーバーを使い捨てにしたら、データの置き場が無くなった

第12章で、Web サーバーを Auto Scaling に任せました。混めば増え、空けば減り、壊れたら新品に入れ替わります。サーバーは「いつ捨ててもいいもの」になりました。そのために、サーバーの中に大事なものを置かない(ステートレスにする)、という約束もしました。

では、フォトログのデータはどこに置けばいいのでしょうか。データとは、利用者のアカウント、投稿した写真の説明文、誰がどの写真に「いいね」したか、といった情報です。

これまでのように、Web サーバーの中にデータベースを同居させたままだと、図のようなことが起きます。

起きることなぜ困るか
Aさんの投稿は Web 1 の中にしかないALB(第11章)が Web 2 に振った人には、Aさんの投稿が見えない
Auto Scaling が Web 1 を捨てたAさんの投稿がサーバーと一緒に消える
新品の Web 3 が加わったこれまでの投稿を1件も持っていない

台数を増やしたり入れ替えたりするほど、データはばらばらになり、消えていきます。データだけは、捨てられるサーバーの外に出し、全部のサーバーが同じ1か所を見る必要があります。

この章では、そのための部品 RDS を使って、データベースをサーバーから切り離します。

※2026年9月時点の情報です。画面・料金・細部は変わることがあります。

  • AWS でサービスを作る 13 ― RDS:データベース
  • 1 / 22
  • サーバーを使い捨てにしたら、データの置き場が無くなった
  • サーバー
  • Web 1
  • サーバー
  • Web 2
  • サーバー
  • Web 3(入れ替わった新品)
  • 中の DB:Aさんの投稿
  • 中の DB:Bさんの投稿
  • 中の DB:空っぽ
  • NG
  • Aさんの写真は Web 1 の中にしかない。Web 2 に振られた人には見えない
  • NG
  • Auto Scaling が Web 1 を捨てると、Aさんの投稿は一緒に消える
  • NG
  • Web 3 は新品なので、これまでの投稿を1件も持っていない
  • 台数を増やしたり入れ替えたりするほど、データがばらばらになり、消えていく
  • → データだけはサーバーの外に出し、全員で同じ1か所を見る必要がある
  • ひらめき
  • 第12章でサーバーは「いつ捨ててもいいもの」になった。でも、投稿やいいねは捨ててはいけない。

データベースを1か所に分けて、全部のサーバーから同じものを見る

データベース(DB)は、データを整理してしまっておき、必要なものをすばやく探し出すための専用のソフトです。フォトログで使うのはリレーショナルデータベースと呼ばれる種類で、データを「表」の形でしまい、SQL という問い合わせの言葉で読み書きします。

解決策は単純です。データベースを専用の機械に分けて、Web サーバーは全部そこへ読み書きしに行きます。

役割置くもの性格
Web サーバー(黄)アプリの計算何台に増えても、捨てても平気
データベース(緑)投稿・利用者・いいね1か所にまとめ、決して捨てない

図では、AZ-a と AZ-c(第2章)の Web サーバーが、どちらも同じデータベースを見ています。これで、どの Web サーバーに振られても同じ投稿が見え、Web サーバーを捨ててもデータは残ります。

このように「入口(ALB)」「計算(Web)」「データ(DB)」の3つの層に分けた形を、3層構成と呼びます。第16章で完成させる形の骨組みです。

ただし、今度は新しい困りごとが生まれます。データベースが1台しかないなら、それが壊れたときにすべてが止まります。そして、データベースを安全に動かし続けるのは、実はかなり手間のかかる仕事です。次から、その手間を誰が引き受けるのかを見ていきます。

  • AWS でサービスを作る 13 ― RDS:データベース
  • 2 / 22
  • データベースを1か所に分けて、全部のサーバーから同じものを見る
  • VPC(第5章)
  • AZ-a
  • サーバー
  • Web は捨ててよい
  • Web(EC2)
  • データベース
  • データベース
  • 全員で共有
  • DB は捨てない
  • ネットワーク
  • ALB
  • 第11章
  • AZ-c
  • サーバー
  • Web(EC2)
  • ひらめき
  • Web(計算)と DB(しまう)を別の機械にする。Web が何台に増えても、同じ中身を見る。

データベースを自分で運用すると、世話が山ほどある

データベースの専用機は、EC2(第9章)を1台借りて、そこに PostgreSQL や MySQL といったデータベースのソフトを自分で入れても作れます。自由度は最大です。

でも、そうすると次の世話が全部あなたの仕事になります。

世話自分でやる場合RDS の場合
ソフトの導入と更新自分で入れ、セキュリティの修正が出るたびに当てる決めた時間帯(メンテナンスウィンドウ)に AWS が当てる
バックアップ仕組みを作り、保存先を用意し、毎日動いているか見張る毎日自動。保持期間を選ぶだけ
故障への備え予備の機械を用意し、切り替えの仕組みを自分で作るMulti-AZ を選べば、切り替えまで自動
容量の増設ディスクが一杯になる前に気づいて広げる自動で広げる設定ができる
監視何を見るか決めて仕組みを作る主な数値は最初から見られる(第17章)

このように、機械やソフトの世話を AWS が引き受けてくれるサービスをマネージドサービスと呼びます。

データベースは、壊れたときの被害がいちばん大きい部品です。Web サーバーは作り直せば戻りますが、データは消えたら戻りません。だからこそ、世話をプロに任せて、あなたは表の設計やアプリの中身に集中するのが、クラウドでの基本の考え方です。

EC2 に自分で入れるのは、RDS が対応していない特別なソフトや設定がどうしても必要な場合に限るのがよいでしょう。

  • AWS でサービスを作る 13 ― RDS:データベース
  • 3 / 22
  • データベースを自分で運用すると、世話が山ほどある
  • 修理
  • EC2 に自分で入れる
  • データベース
  • RDS(マネージド)
  • 自由だが、世話は全部自分
  • 世話は AWS。あなたは中身に集中
  • NG
  • DB ソフトの入れ方と更新
  • OK
  • 更新は決めた時間帯に自動で
  • NG
  • 毎日のバックアップと、戻す練習
  • OK
  • バックアップは毎日自動で
  • NG
  • 壊れたときの予備への切り替え
  • OK
  • 予備への切り替えも自動(Multi-AZ)
  • NG
  • ディスクが一杯になる前の増設
  • OK
  • 容量の自動拡張も選べる
  • ひらめき
  • EC2 に DB を自分で入れることもできる。でも、更新・バックアップ・故障の備えが全部自分の仕事に。

RDS は「データベースの世話」を AWS に任せるサービス

Amazon RDS(Relational Database Service)は、リレーショナルデータベースを借りられるマネージドサービスです。

使えるデータベースのソフトをエンジンと呼びます。

エンジン特徴
PostgreSQL無料で使える高機能な DB。この本のフォトログはこれを使う
MySQL / MariaDB無料で使える、Web で昔から広く使われている DB
Oracle / SQL Server / Db2企業でよく使われる商用の DB。ライセンスの扱いに注意
AuroraAWS が作り直した MySQL・PostgreSQL 互換の DB(後で説明)

RDS で DB を作るときに、あなたが決めるのは主に次のことです。

決めること意味
インスタンスクラスDB が動く機械の大きさ。db.t4g.micro のように db. で始まる。読み方は EC2 のインスタンスタイプ(第9章)と同じ
ストレージデータをしまうディスク。容量と種類(gp3 など。第10章の EBS と同じ仲間)
置き場所どの VPC のどのサブネットに置くか、どのセキュリティグループを付けるか
Multi-AZ別の AZ に予備を置くかどうか
バックアップ何日分さかのぼれるようにするか

逆に、OS にはログインできません。RDS の中の機械は AWS が管理していて、あなたが触れるのはデータベースの入口だけです。これは不便に見えますが、触れないから壊せない、という安心でもあります。

  • AWS でサービスを作る 13 ― RDS:データベース
  • 4 / 22
  • RDS は「データベースの世話」を AWS に任せるサービス
  • あなたが決めること
  • データベース
  • Amazon RDS
  • エンジン
  • PostgreSQL・MySQL など
  • Relational Database Service
  • インスタンスクラス
  • CPU とメモリの大きさ
  • 選べるエンジン
  • ストレージ
  • 容量とディスクの種類
  • PostgreSQL
  • MySQL
  • MariaDB
  • 置き場所
  • VPC とサブネット・SG
  • Oracle
  • SQL Server
  • Db2
  • Multi-AZ
  • 別の AZ に予備を置くか
  • + AWS 独自の Aurora(後で説明)
  • バックアップ
  • 何日分さかのぼれるか
  • ひらめき
  • エンジン(DB の種類)・大きさ・置く場所・予備の有無を決めれば、あとの世話は AWS がする。

DB はプライベートサブネットに置き、扉は Web からだけ開ける

データベースには、利用者がインターネットから直接つなぐ必要は一切ありません。利用者はいつも Web サーバーを通してデータを読み書きします。だから DB は、インターネットから届かない場所に置きます。

設定値理由
置くサブネットプライベートサブネット(第6章)インターネットゲートウェイへの道が無い
パブリックアクセスなしDB にパブリック IP を付けない
セキュリティグループdb-sg:5432 番を app-sg からだけ許すWeb サーバー以外は門前払い(第8章)

ポートは、1台の機械の中で「どのソフト宛てか」を区別する番号でした(第8章)。PostgreSQL は既定で 5432 番、MySQL は 3306 番を使います。

db-sg の許可の相手に IP アドレスではなく app-sg(Web サーバーの SG)そのものを指定するのがポイントです。Auto Scaling で Web サーバーが増えても減っても、app-sg を付けている限り自動で通れます。

もう1つ、RDS には DB サブネットグループという設定があります。「この DB はこれらのサブネットに置いてよい」という名簿です。2つ以上の AZ のサブネットを登録する決まりになっていて、後で見る Multi-AZ の待機系はこの名簿の中の別 AZ に置かれます。フォトログでは、AZ-a と AZ-c に DB 用のプライベートサブネットを1つずつ作って登録します。

  • AWS でサービスを作る 13 ― RDS:データベース
  • 5 / 22
  • DB はプライベートサブネットに置き、扉は Web からだけ開ける
  • VPC(第5章)
  • AZ-a
  • 盾
  • db-sg(門番)
  • サーバー
  • Web(EC2)
  • データベース
  • RDS 本体
  • 5432 番を
  • 外から見えない
  • app-sg からだけ
  • ネットワーク
  • ALB
  • 第11章
  • AZ-c
  • DB サブネット
  • サーバー
  • インターネット
  • NG
  • Web(EC2)
  • グループに
  • 外の世界
  • 2つの AZ を登録
  • ひらめき
  • DB はインターネットから触れる必要が無い。見えない場所に置き、Web の SG からだけ受け付ける。

接続先は IP アドレスではなく「エンドポイント」という名前

アプリが DB につなぐとき、接続先に IP アドレスは書きません。RDS が作るエンドポイントという名前を書きます。図の下の板のような、長い名前です。

名前をどうやって IP アドレスに直すかは第14章で詳しく見ますが、ここでは「名前を問い合わせると、今の DB の住所が返ってくる」と考えてください。

なぜ IP アドレスを直接書かないのでしょうか。

起きることIP を書いていたらエンドポイントなら
DB の中の機械が入れ替わる(後で見る切り替え)古い住所を叩き続けるRDS が名前の行き先を付け替える
DB を大きいクラスに変える住所が変わるかもしれない名前は同じまま

アプリの設定には、エンドポイント・ポート・DB 名・ユーザー名・パスワードを書きます。ただしパスワードはソースコードに直接書かないこと。この章の後半で、RDS にパスワードを作らせて、AWS の金庫(Secrets Manager)にしまう方法を紹介します(詳しくは第20章)。

postgresql://photolog:(金庫から読む)@photolog-db.xxxxxxxx.ap-northeast-1.rds.amazonaws.com:5432/photolog

図の小包「SQL」は、Web サーバーから DB への問い合わせを表しています。Web サーバーは、どの AZ にいても、同じエンドポイントに向けて問い合わせを送ります。

  • AWS でサービスを作る 13 ― RDS:データベース
  • 6 / 22
  • 接続先は IP アドレスではなく「エンドポイント」という名前
  • VPC(第5章)
  • AZ-a
  • サーバー
  • Web(EC2)
  • データベース
  • RDS 本体
  • 読み書きする
  • SQL
  • ネットワーク
  • ALB
  • 第11章
  • AZ-c
  • サーバー
  • Web(EC2)
  • DATABASE_HOST=photolog-db.xxxxxxxx.ap-northeast-1.rds.amazonaws.com
  • DATABASE_PORT=5432 # PostgreSQL の既定。MySQL なら 3306
  • ひらめき
  • アプリには名前だけを書く。中の機械が入れ替わっても、名前の行き先を RDS が付け替える。

DB が1台だけだと、その AZ が止まったら全部止まる

ここまでで、データは1か所にまとまりました。でも、その1か所が1台の機械だとしたらどうでしょう。

第2章で見たように、AZ(アベイラビリティーゾーン)は独立した電源や回線を持つデータセンターのまとまりです。まれですが、AZ ごと調子が悪くなることがあります。

図では AZ-a に障害が起き、そこにある Web サーバーと DB が止まりました。

部品どうなったか
Web サーバーAZ-c の Web は無事。ALB は無事なほうにだけ振る(第11章)
DBAZ-a の1台だけなので、止まった
結果Web は動いているのに、データが読めないので「エラー」しか返せない

せっかく Web サーバーを2つの AZ に分けても、DB が1台なら意味が半減します。このように、そこが止まると全体が止まる1か所を単一障害点と呼びます。構成を考えるときは、いつも「単一障害点はどこか」を探します(第29章で詳しく扱います)。

AZ の障害でなくても、DB の機械の故障、ディスクの故障、ソフトの更新のための再起動など、1台が止まる理由はいくつもあります。次に、これを防ぐ Multi-AZ を見ます。

  • AWS でサービスを作る 13 ― RDS:データベース
  • 7 / 22
  • DB が1台だけだと、その AZ が止まったら全部止まる
  • VPC(第5章)
  • AZ-a
  • サーバー
  • Web(EC2)
  • データベース
  • RDS 本体
  • 止まった
  • ネットワーク
  • ALB
  • 第11章
  • NG
  • AZ-c
  • サーバー
  • Web は生きているのに、データが
  • Web(EC2)
  • 読めないので「エラー」しか返せない
  • ひらめき
  • Web を2つの AZ に分けても、DB が片方に1台だけなら、そこが単一障害点になる。

Multi-AZ:別の AZ に待機系を置き、書き込みを同時に写す

Multi-AZ(マルチ AZ)は、本体とは別の AZ に待機系(スタンバイ)の DB を置く設定です。作るときにチェックを1つ入れるだけで、RDS が用意してくれます。

図の小包は、Web サーバーからの書き込みです。書き込みは本体に届き、同時に待機系にも写されます。

性質内容
写し方同期。本体と待機系の両方に書けてから「完了」を返す
待機系の中身いつも本体と同じ最新の状態
待機系を読めるか読めない。ただ控えているだけ
アプリから見た接続先本体と同じエンドポイント1つ。待機系を意識しない

同期とは、「写し終わるまで待ってから次へ進む」やり方です。少しだけ書き込みが遅くなる代わりに、本体が突然倒れても、完了と返した書き込みは待機系に必ず残っています。

待機系は読めないので、「予備があるから読み取りも速くなる」わけではありません。Multi-AZ の目的は止まらないことだけです。読み取りを増やす方法は、この後のリードレプリカで見ます。

また、DB の更新のための再起動も、Multi-AZ なら待機系を先に更新して切り替えることで、止まる時間を短くできます。本番のデータベースは Multi-AZ にするのが基本です。

  • AWS でサービスを作る 13 ― RDS:データベース
  • 8 / 22
  • Multi-AZ:別の AZ に待機系を置き、書き込みを同時に写す
  • VPC(第5章)
  • AZ-a
  • サーバー
  • Web(EC2)
  • データベース
  • RDS 本体
  • 読み書きする
  • 書き込み
  • ネットワーク
  • ALB
  • 第11章
  • AZ-c
  • サーバー
  • Web(EC2)
  • データベース
  • 待機系
  • 本体から待機系へ
  • 読めない控え
  • 同期で写す
  • ひらめき
  • 書き込みは本体と待機系の両方に届いてから「完了」になる(同期)。待機系はいつも最新。

本体が倒れたら、待機系が本体に昇格する(フェイルオーバー)

AZ-a に障害が起きたときの動きです。

順番起きること
1RDS が本体の異常に気づく
2待機系を新しい本体に昇格させる
3エンドポイントの行き先を、新しい本体に付け替える
4アプリが同じエンドポイントにつなぎ直すと、新しい本体につながる

この切り替えをフェイルオーバーと呼びます。AWS の説明では、Multi-AZ の DB インスタンスの切り替えはふつう1〜2分(60〜120秒)ほどかかります。その間、DB への接続は切れます。

アプリの側で気をつけることは2つです。

気をつけること理由
接続が切れたら、つなぎ直す切れた接続を持ったままだと、切り替え後もエラーが続く
DB の住所を覚え込まない名前の問い合わせ結果を長く覚えていると、古い住所に行き続ける

切り替わった後、RDS は壊れた側の AZ が戻ると、そちらに新しい待機系を作り直します。人が夜中に起きて作業する必要はありません。

ここまでで、データが1か所にまとまり、しかも AZ が1つ止まっても動き続けるDB ができました。

  • AWS でサービスを作る 13 ― RDS:データベース
  • 9 / 22
  • 本体が倒れたら、待機系が本体に昇格する(フェイルオーバー)
  • VPC(第5章)
  • AZ-a
  • NG
  • サーバー
  • Web(EC2)
  • データベース
  • RDS 本体
  • 切り替えは
  • 止まった
  • ふつう1〜2分
  • ネットワーク
  • ALB
  • 第11章
  • AZ-c
  • サーバー
  • Web(EC2)
  • データベース
  • 新しい本体
  • 昇格した
  • SQL
  • ひらめき
  • エンドポイントの行き先が自動で付け替わる。アプリの設定は1文字も変えなくてよい。

読む人が増えたら、リードレプリカで「読み取り」を分ける

フォトログが人気になると、DB への問い合わせの大半は「読む」ものになります。タイムラインを開くたび、写真の一覧を読むからです。書く(投稿する・いいねする)回数よりずっと多くなります。

読み取りで本体が忙しくなったら、リードレプリカを足します。本体の変更を後から写した、読み取り専用の複製です。

性質内容
写し方非同期。本体は写し終わりを待たない。そのぶん少し遅れる
読めるか読める。書き込みはできない
接続先本体とは別の、リードレプリカ専用のエンドポイント
数PostgreSQL・MySQL・MariaDB では1つの本体に最大15個まで

非同期とは「写すのは後でいい、先へ進む」やり方です。だから、投稿した直後にリードレプリカを読むと、まだ写っていないことがあります。

アプリの側で「書く処理と、投稿直後の自分の画面は本体へ」「他人のタイムラインの一覧はリードレプリカへ」と振り分ける必要があります。勝手には分かれない点に注意してください。

リードレプリカは別のリージョン(第2章)にも置けます。遠くの利用者に近い場所から読ませたり、災害時の備えにしたりできます(第29章)。

  • AWS でサービスを作る 13 ― RDS:データベース
  • 10 / 22
  • 読む人が増えたら、リードレプリカで「読み取り」を分ける
  • VPC(第5章)
  • AZ-a
  • サーバー
  • Web(EC2)
  • データベース
  • RDS 本体
  • データベース
  • レプリカ
  • 読み書きする
  • 読み取り専用
  • ネットワーク
  • ALB
  • 第11章
  • AZ-c
  • レプリカへは非同期
  • サーバー
  • Web(EC2)
  • データベース
  • 待機系
  • 読めない控え
  • (少し遅れる)
  • 専用の名前で読む
  • ひらめき
  • 本体の変更を後から写した、読み取り専用の複製。一覧のような読むだけの処理を回す。

Multi-AZ とリードレプリカは、目的がまったく違う

どちらも「DB の写しをもう1つ持つ」ので、初めは混同しがちです。表で比べます。

Multi-AZ(待機系)リードレプリカ
目的故障しても止まらない(可用性)読み取りの負荷を分ける(性能)
写し方同期非同期
読めるか読めない読める(書けない)
本体が倒れたら自動で昇格する自動では昇格しない(手で昇格はできる)
接続先本体と同じエンドポイント専用のエンドポイント

可用性とは「使いたいときに使える度合い」のことです。

両方を組み合わせることもできます。前の図のように、本体+待機系(Multi-AZ)に、読み取り用のリードレプリカを足す形です。

もう1つの形として、Multi-AZ DB クラスターがあります。待機系を2つ持ち、しかもその2つが読める形です。AWS の説明では、切り替えもふつう35秒未満と、1つの待機系を持つ形より速くなります。ただし使えるエンジンやクラスに制限があるので、使うときは公式の説明で確かめてください。

判断の問いはこうです。「止まると困るのか(→ Multi-AZ)」「読み取りが重いのか(→ リードレプリカ)」。困りごとが違えば、部品も違います。

  • AWS でサービスを作る 13 ― RDS:データベース
  • 11 / 22
  • Multi-AZ とリードレプリカは、目的がまったく違う
  • Multi-AZ(待機系)
  • リードレプリカ
  • 目的
  • 故障しても止まらない
  • 読み取りの負荷を分ける
  • 複製のしかた
  • 同期(書き込みと同時)
  • 非同期(少し遅れる)
  • 読めるか
  • 読めない(控えるだけ)
  • 読める(書けない)
  • 故障のとき
  • 自動で昇格する
  • 自動では昇格しない
  • 接続先
  • 本体と同じエンドポイント
  • 専用のエンドポイント
  • 置く場所
  • 同じリージョンの別 AZ
  • 別 AZ・別リージョンも可
  • ※「読める待機系を2つ持つ Multi-AZ DB クラスター」という形もある(切り替えがより速い)。まずは上の2つの違いを押さえる
  • ひらめき
  • Multi-AZ は「止まらない」ため、リードレプリカは「読み取りをさばく」ため。混同しないこと。

自動バックアップ:毎日の丸ごとと、細かい記録で「時刻を指定して戻す」

Multi-AZ は機械の故障には強いですが、間違った操作には無力です。アプリのバグで全員の投稿を消してしまったら、その削除は待機系にも同期で写ります。予備ごと消えるのです。

そこでバックアップが要ります。RDS の自動バックアップは、2つの仕組みを組み合わせています。

仕組み内容
自動スナップショット(図の緑)1日1回、決めた時間帯に DB を丸ごと写す
変更の記録(図の黄)その後の変更を細かく記録し、数分ごとに保存する

戻したい時刻を指定すると、RDS は「その直前の丸ごと」から始めて、「その後の記録を指定の時刻まで」再生して DB を作ります。これをポイントインタイムリカバリ(時刻指定の復元)と呼びます。保持期間の中なら、好きな秒に戻せます(直近の数分は除く)。

設定内容
保持期間0〜35日。コンソールから作ると既定は7日(CLI や API から作ると既定は1日)
0 にすると自動バックアップが止まる。本番では絶対にしない
バックアップの時間帯利用者が少ない深夜などを選べる

図の赤い旗は「木曜 14:32:05、誤って消す直前に戻したい」という例です。

  • AWS でサービスを作る 13 ― RDS:データベース
  • 12 / 22
  • 自動バックアップ:毎日の丸ごとと、細かい記録で「時刻を指定して戻す」
  • 木曜 14:32:05 に戻したい
  • 旗
  • ディスク
  • ディスク
  • ディスク
  • ディスク
  • ディスク
  • 月曜
  • 火曜
  • 水曜
  • 木曜
  • 金曜
  • 緑=毎日の丸ごと(自動スナップショット)
  • 黄=変更の記録(数分ごとに S3 へ)
  • 戻すときは「直前の丸ごと」+「その後の記録を指定の時刻まで再生」で作る
  • 保持期間は 0〜35日(画面から作ると既定は7日)。0 にすると自動バックアップが止まる
  • ひらめき
  • 毎日の丸ごと(スナップショット)と変更の記録を組み合わせ、保持期間内の好きな秒に戻せる。

復元は「新しい DB を作る」こと。元の DB は上書きされない

RDS で復元すると、今の DB が上書きされるのではなく、新しい DB が別の名前で生まれます。エンドポイントも新しくなります。

順番やること
1戻したい時刻(またはスナップショット)を選び、新しい名前を付けて復元する
2新しい DB の中身が正しいか確かめる
3アプリの接続先を、新しいエンドポイントに切り替える
4古い DB は、しばらく残してから消す

元の DB を残したまま戻せるので、「戻してみたら違った」ときもやり直せます。一方で、接続先の切り替えは自分でする必要があります。SG・パラメータの設定なども、復元時に指定し直すのを忘れないようにします。

自動バックアップとは別に、手動スナップショットも撮れます。

自動バックアップ手動スナップショット
作られ方毎日自動+変更の記録自分で好きなときに撮る
消えるとき保持期間を過ぎたものから順に自分で消すまで残る
向いている用途「昨日の昼に戻したい」大きな変更の前、長期の保管

いちばん大事なのは、一度は実際に戻してみることです。戻したことのないバックアップは、いざというときに戻せるかわかりません。

  • AWS でサービスを作る 13 ― RDS:データベース
  • 13 / 22
  • 復元は「新しい DB を作る」こと。元の DB は上書きされない
  • データベース
  • 今の DB
  • 間違って消した直後
  • 時刻を指定
  • データベース
  • 復元した DB
  • サーバー
  • アプリ
  • photolog-db-restored
  • 接続先を切り替える
  • 自動バックアップ
  • 手動スナップショット
  • 作られ方
  • 毎日自動+変更の記録
  • 自分で好きなときに撮る
  • 消えるとき
  • 保持期間を過ぎたら順に
  • 自分で消すまで残る
  • 向いている用途
  • 「昨日の昼に戻したい」
  • 大きな変更の前・長期保管
  • ひらめき
  • 戻した DB は別の名前・別のエンドポイントで生まれる。確かめてから、アプリの接続先を切り替える。

サーバーが増えると、DB への「接続」が足りなくなる

アプリが DB と話すには、まず接続を張ります。電話をかけてつながった状態のようなものです。つなぐたびに手間がかかるので、アプリはふつう何本かの接続をつないだまま持っておき、使い回します(コネクションプール)。

ところが、DB が同時に受け付けられる接続の数には上限があります(PostgreSQL・MySQL では max_connections という設定)。接続1本ごとに DB のメモリを使うので、小さいクラスほど上限は低くなります。

Web サーバーの数1台が持つ接続DB への接続の合計
2台20本40本
6台20本120本
20台(大混雑)20本400本

Auto Scaling で Web サーバーが増えるほど、接続の合計も増えます。上限に達すると、新しい接続は断られ、利用者にはエラーが返ります。混雑している一番大事なときに、です。

対策は3つあります。

対策内容
1台あたりの接続を減らすアプリのプールの大きさを見直す
DB のクラスを上げるメモリが増え、上限も上がる
接続をまとめる仕組みを挟む次に見る RDS Proxy
  • AWS でサービスを作る 13 ― RDS:データベース
  • 14 / 22
  • サーバーが増えると、DB への「接続」が足りなくなる
  • サーバー
  • Web 1
  • サーバー
  • Web 2
  • サーバー
  • Web 3
  • データベース
  • サーバー
  • Web 4
  • RDS
  • 接続の上限に達した
  • サーバー
  • Web 5
  • サーバー
  • Web 6
  • 1台が 20本ずつ接続を持つと、6台で 120本。増えるたびに DB のメモリを食う
  • ひらめき
  • DB が同時に受けられる接続の数には上限がある。Web が増えるほど、接続を取り合う。

RDS Proxy:接続をまとめて、DB に渡す本数を減らす

RDS Proxy は、アプリと DB の間に立って、接続をまとめる係です。

区間接続の本数
アプリ → Proxy多くてもよい。Web が増えてもここで受け止める
Proxy → DB少ない本数を使い回す(上限は DB の上限に対する割合で決める)

図では、たくさんの Web サーバーの線が Proxy に集まり、Proxy から DB へは3本だけになっています。これを接続プーリングと呼びます。

もう1つの利点は、フェイルオーバーのときです。Proxy がアプリからの接続を受け止めたまま、新しい本体へつなぎ直してくれるので、アプリから見た切り替えの影響が小さくなります。

向いている場面理由
Auto Scaling で Web の台数が大きく変わる接続の合計が読めない
Lambda(第22章)から DB を使う関数が一度に大量に動き、接続が爆発しやすい
切り替えの影響を小さくしたいProxy が接続を受け止める

RDS Proxy には別に料金がかかります。フォトログの最初の規模(Web が2〜4台)なら、まずはアプリのプールの大きさを見直せば足ります。接続数が困りごとになってから足せばよい部品です。

  • AWS でサービスを作る 13 ― RDS:データベース
  • 15 / 22
  • RDS Proxy:接続をまとめて、DB に渡す本数を減らす
  • サーバー
  • Web 1
  • サーバー
  • Web 2
  • サーバー
  • Web 3
  • 更新
  • データベース
  • サーバー
  • Web 4
  • RDS Proxy
  • RDS
  • 接続を使い回す
  • 少ない接続で済む
  • サーバー
  • Web 5
  • サーバー
  • Web 6
  • Web が急に増える Auto Scaling や、Lambda(第22章)と組み合わせるときに効く
  • ひらめき
  • アプリは Proxy に何本つないでもよい。Proxy が少ない接続を使い回して DB に渡す。

Aurora:クラウド向けに作り直された、AWS 独自のデータベース

RDS の中には、Amazon Aurora という特別なエンジンがあります。MySQL や PostgreSQL と互換(同じ SQL・同じ接続方法で使える)ですが、中身はクラウド向けに作り直されています。

いちばんの違いは、計算とディスクが分かれていることです。

部分ふつうの RDSAurora
ディスク機械ごとに自分のディスク全員で1つの共有ストレージを見る
データの写し本体と待機系で2つ3つの AZ に合計6つの写しを自動で持つ
読み取り役リードレプリカ(非同期で写す)同じディスクを見るので遅れが小さい。最大15台
切り替え待機系が昇格読み取り役の1台が書き込み役に昇格

図の下の緑の帯が共有ストレージです。3つの AZ に2つずつ、合わせて6つの写しがあり、どれかが壊れても自動で直されます。

さらに Aurora Serverless v2 を選ぶと、負荷に合わせて計算の大きさが自動で伸び縮みします。使われていない時間は計算の料金をゼロ近くまで下げる設定もできます。

どちらを選ぶか目安
RDS(PostgreSQL・MySQL)小さく始めたい、仕組みを素直に理解したい
Aurora止まらないこと・読み取りの多さ・伸び縮みを重視する

料金の数え方は RDS とは違い、ストレージや入出力の数え方にいくつか選択肢があります。この本では仕組みを学ぶために、フォトログはまず RDS for PostgreSQL で作ります。

  • AWS でサービスを作る 13 ― RDS:データベース
  • 16 / 22
  • Aurora:クラウド向けに作り直された、AWS 独自のデータベース
  • AZ-a
  • AZ-c
  • AZ-d
  • データベース
  • 書き込み役
  • データベース
  • 読み取り役
  • データベース
  • 読み取り役
  • 1台
  • 最大15台まで足せる
  • 本体が倒れたら昇格
  • 共有ストレージ(全員が同じディスクを見る)
  • ディスク
  • ディスク
  • ディスク
  • ディスク
  • ディスク
  • ディスク
  • ひらめき
  • MySQL・PostgreSQL と互換。データは3つの AZ に6つの写しで持ち、計算とディスクが分かれている。

作り方:6つの決めごとで DB ができる

コンソールでは、RDS の画面の「データベースの作成」から作ります。図の番号の順に決めていきます。

順番決めることフォトログでの値
1DB サブネットグループAZ-a と AZ-c の DB 用プライベートサブネット
2セキュリティグループdb-sg:5432 番を app-sg からだけ許可
3エンジンと大きさPostgreSQL、練習なら小さなクラス、gp3 で 20GB
4可用性本番は Multi-AZ。練習なら単一 AZ でもよい
5認証情報「Secrets Manager で管理」を選び、RDS に作らせる
6接続と保護パブリックアクセスなし、削除保護オン、バックアップ7日

同じことを CLI(第1章の CloudShell で使える)で書くと、次のようになります。

bash
aws rds create-db-instance \
  --db-instance-identifier photolog-db \
  --engine postgres --db-instance-class db.t4g.micro \
  --allocated-storage 20 --storage-type gp3 \
  --master-username photolog --manage-master-user-password \
  --db-subnet-group-name photolog-db-subnets \
  --vpc-security-group-ids sg-0123456789abcdef0 \
  --no-publicly-accessible --multi-az \
  --backup-retention-period 7 --deletion-protection

--manage-master-user-password を付けると、RDS がパスワードを作って Secrets Manager にしまいます。既定では7日ごとに自動で取り替えられます。アプリは起動時に金庫から読み出します。

  • AWS でサービスを作る 13 ― RDS:データベース
  • 17 / 22
  • 作り方:6つの決めごとで DB ができる
  • ネットワーク
  • DB サブネットグループ
  • 盾
  • SG を作る
  • データベース
  • エンジンと大きさ
  • 2つの AZ の置き場所
  • app-sg から 5432 だけ
  • PostgreSQL・小さいクラス
  • 更新
  • Multi-AZ を選ぶ
  • 鍵
  • パスワードを任せる
  • 錠
  • 公開アクセス:なし
  • 本番なら必ず
  • Secrets Manager で管理
  • 削除保護:オン
  • 作り終わるまで 10〜20分ほどかかる。「利用可能」になったら、エンドポイントをアプリの設定に書く
  • パスワードを自分で決めてコードに書かない。RDS に作らせて Secrets Manager(第20章)に置く
  • ひらめき
  • コンソールの「データベースの作成」で、上から順に決めていく。迷ったら「外に出さない・予備を置く」。

フォトログでは:利用者・写真・いいねを RDS に置く

フォトログのデータを、3つの表にしまいます。

表1行が表すもの主な列
users1人の利用者id、username、created_at
photos1枚の投稿id、user_id(誰の投稿か)、s3_key、caption、created_at
likes1回のいいねuser_id(誰が)、photo_id(どの写真に)、created_at

表どうしは番号でつながります。photos の user_id は users の id を指し、likes は「誰が」「どの写真に」を2つの番号で持ちます。これがリレーショナル(関係のある)データベースの名前の由来です。

大事なのは、写真の画像そのものは DB に入れないことです。写真は数 MB と大きく、DB に入れるとディスクもバックアップも膨らみ、読み書きも遅くなります。DB には s3_key として、写真の置き場所の名前(例:uploads/2026/09/abc.jpg)だけを書きます。画像そのものの置き場所は第15章の S3 です。

置くもの置き場所
利用者・投稿の説明・いいね(小さくて、探したい)RDS
写真の画像(大きくて、丸ごと渡すだけ)S3(第15章)
ログイン中かどうかの情報(セッション)サーバーの中に置かない。第12章の約束どおり DB やキャッシュ(第25章)へ

「何をどこに置くか」を決めるのも、構成を考える大事な判断です。

  • AWS でサービスを作る 13 ― RDS:データベース
  • 18 / 22
  • フォトログでは:利用者・写真・いいねを RDS に置く
  • users
  • photos
  • likes
  • id
  • id
  • user_id
  • username
  • user_id
  • photo_id
  • created_at
  • s3_key
  • created_at
  • caption
  • created_at
  • users・photos・likes の3つの表。「誰が」「どの写真に」いいねしたかを、表どうしの番号でつなぐ
  • s3_key には「uploads/2026/09/abc.jpg」のような S3 の中の名前だけを書く
  • ひらめき
  • DB に置くのは文字と数字だけ。写真そのものは置かず、置き場所の名前(キー)だけを書く(第15章)。

お金:動いている時間・ディスクの容量・予備の分

RDS の料金は、主に次のものに対してかかります。

課金されるもの単位目安の考え方
インスタンス動いている時間。クラスごとに単価が違うMulti-AZ は待機系のぶん、ほぼ2倍
ストレージ確保した容量(GB)× 月使っていなくても、確保したぶんは払う
バックアップGB × 月DB の容量と同じくらいまでは追加料金なし(それを超えると課金)
手動スナップショットGB × 月消すまでずっと課金される
データ転送AZ やリージョンをまたぐ通信などリードレプリカの置き場所で変わる
延長サポート標準のサポートが終わった古いバージョンを使い続けると追加バージョンは早めに上げる

DB は24時間動き続けるので、起動している時間の料金がいちばん大きくなります。Web サーバーのように「夜は減らす」ことができないからです。

節約の考え方は次のとおりです。

考え方内容
練習では単一 AZ・小さいクラス本番の設計を学ぶときだけ Multi-AZ を試し、すぐ消す
使わない時間は停止ただし停止は最長7日。過ぎると自動で起動する
長く使うと決まったら割引リザーブドインスタンスなどの割引(第4章)

無料枠の条件は変わることがあるので、第4章の考え方で、料金ページと Pricing Calculator を必ず確かめてください。

  • AWS でサービスを作る 13 ― RDS:データベース
  • 19 / 22
  • お金:動いている時間・ディスクの容量・予備の分
  • 課金されるもの
  • 単位
  • 目安の考え方
  • インスタンス
  • 動いている時間(クラスごとに単価)
  • Multi-AZ はほぼ2倍
  • ストレージ
  • 確保した GB × 月
  • 使っていなくても確保分
  • バックアップ
  • GB × 月
  • DB の容量ほどまでは追加なし
  • 手動スナップショット
  • GB × 月
  • 消すまで課金が続く
  • データ転送
  • AZ をまたぐ通信など
  • リードレプリカの位置で変わる
  • 延長サポート
  • 古いバージョンを使い続けると追加
  • 早めに上げる
  • 単価はリージョン・エンジン・クラスで違う。必ず料金ページと Pricing Calculator(第4章)で確かめる
  • ひらめき
  • DB は24時間動き続けるので、起動している時間の料金がいちばん大きい。Multi-AZ は台数が倍になる。

よくある落とし穴

DB の事故は、取り返しがつかないことが多いのが特徴です。よくある6つを挙げます。

事故何が起きるか防ぎ方
パブリックアクセスを「あり」で作る世界中からパスワードを試される「なし」にし、プライベートサブネットに置く
パスワードをコードに書いて公開する誰でも DB に入れるSecrets Manager に任せる(第20章)
停止したまま忘れる7日後に自動で起動し、課金が再開する使わないなら消す。停止は短期間だけ
ディスクが一杯になる書き込みが止まり、投稿できなくなるストレージの自動拡張を付ける。容量を見張る(第17章)
戻す練習をしていないいざというとき戻し方がわからない、戻せない定期的に別の名前で復元してみる
アプリが再接続しないMulti-AZ で切り替わったのに、エラーが続く切れたらつなぎ直す作りにする

もう1つ、DB の SG に `0.0.0.0/0`(どこからでも)を許可してしまう事故もよく起きます。第8章で見たとおり、許可の相手は必ず app-sg にします。

また、DB の設定を変えるとき、変更によっては「すぐに適用」か「次のメンテナンスウィンドウで適用」かを選べます。すぐに適用すると再起動が入るものもあります。利用者が多い時間に変更しないのが安全です。

  • AWS でサービスを作る 13 ― RDS:データベース
  • 20 / 22
  • よくある落とし穴
  • NG
  • 「パブリックアクセス:あり」で作り、世界中から接続を試される
  • NG
  • パスワードをソースコードに書いて、GitHub に上げてしまう
  • NG
  • 停止した DB が7日後に自動で起動し、知らないうちに課金が再開
  • NG
  • ディスクが一杯になって書き込めなくなる(容量の自動拡張を付けておく)
  • NG
  • バックアップはあるが、一度も戻したことがない(いざというとき戻せない)
  • NG
  • Multi-AZ なのに、アプリが再接続しないので切り替え後もエラーのまま
  • ひらめき
  • DB の事故は取り返しがつかない。「外に出さない」「消せないようにする」「戻す練習」の3つ。

片付け:消す前に「最後の写し」を撮るか決める

練習で作った DB は、終わったら消します。DB は動いているだけで課金され続けるからです。

順番やること補足
1削除保護を外す「変更」から削除保護のチェックを外して適用
2最後のスナップショットを撮るか選ぶ削除の画面で聞かれる。練習なら撮らなくてよい
3削除する確認のため、指定された文字を入力する

削除の画面では「自動バックアップを残すか」も聞かれます。残すと保持期間が過ぎるまで残り、そのぶん課金されます。練習なら残さなくて大丈夫です。

CLI で消す場合は次のとおりです。

bash
aws rds modify-db-instance --db-instance-identifier photolog-db \
  --no-deletion-protection --apply-immediately
aws rds delete-db-instance --db-instance-identifier photolog-db \
  --skip-final-snapshot --delete-automated-backups

DB を消した後に、残りものがないか確かめます。

確かめるもの理由
スナップショットの一覧手動で撮った写しは、消すまで課金される
DB サブネットグループ・SG料金はかからないが、散らかる
Secrets Manager の秘密RDS に管理させた秘密は DB と一緒に消える。自分で作った秘密は残る
翌日の請求(Cost Explorer)RDS の料金が止まったか
  • AWS でサービスを作る 13 ― RDS:データベース
  • 21 / 22
  • 片付け:消す前に「最後の写し」を撮るか決める
  • 開いた錠
  • 削除保護を外す
  • カメラ
  • 最後の写しを撮るか
  • バツ
  • 削除する
  • 変更 → 削除保護のチェック
  • 練習なら「撮らない」でよい
  • 確認の文字を入力
  • OK
  • スナップショットの一覧に、撮った写しが残っていないか
  • OK
  • DB サブネットグループ・SG・Secrets Manager の秘密も不要なら消す
  • OK
  • 翌日、請求の画面(Cost Explorer)で RDS の料金が止まったか
  • ひらめき
  • 削除保護を外す → 最後の写しを撮るか選ぶ → 削除。残した写しも課金されるので後で消す。

まとめ:データは RDS に預け、止まらないように予備を置く

この章で見たことをまとめます。

項目内容
DB を分ける理由Web サーバーは使い捨て、データは捨てない。全員で同じ1か所を見る
RDSDB の世話(更新・バックアップ・切り替え)を AWS に任せるマネージドサービス
置き場所プライベートサブネット。扉は Web の SG からだけ開ける
エンドポイント接続先は名前で書く。中の機械が変わっても名前は同じ
Multi-AZ別 AZ の待機系に同期で写し、倒れたら自動で昇格(ふつう1〜2分)
リードレプリカ非同期の読み取り専用の複製。読み取りを分ける
バックアップ保持期間内の好きな秒に戻せる。戻すと新しい DB ができる
接続数上限がある。Web が大きく増えるなら RDS Proxy
Aurora6つの写しを持つ、クラウド向けの AWS 独自 DB

これでフォトログは、入口(ALB)・計算(Web サーバー)・データ(RDS)の3層がそろいました。

でも、利用者がフォトログを開くには、まだ photolog-alb-1234567890.ap-northeast-1.elb.amazonaws.com のような長い名前を打たなければなりません。しかも通信は暗号化されておらず、カフェの Wi-Fi でパスワードを盗み見られるかもしれません。

次の第14章では、example.com のような覚えやすい名前を付け(Route 53)、通信に鍵をかけます(HTTPS)。

  • AWS でサービスを作る 13 ― RDS:データベース
  • 22 / 22
  • まとめ:データは RDS に預け、止まらないように予備を置く
  • DB を分ける理由
  • Web は使い捨て、データは捨てない。全員で同じ1か所を見る
  • RDS
  • DB の世話(更新・バックアップ・切り替え)を AWS に任せる
  • 置き場所
  • プライベートサブネット、扉は Web の SG からだけ
  • Multi-AZ
  • 別 AZ の待機系に同期で写し、倒れたら自動で昇格
  • リードレプリカ
  • 非同期の読み取り専用の複製。読み取りを分ける
  • バックアップ
  • 保持期間内の好きな秒に戻せる。戻すと新しい DB
  • 接続数
  • 上限がある。増えるなら RDS Proxy
  • Aurora
  • 6つの写しを持つ AWS 独自の DB
  • ひらめき
  • 次の第14章:利用者は長い ALB の名前でアクセスし、通信は暗号化されていない。名前と鍵を付ける。

0 件のコメント

読み込み中…

権利侵害・不適切な内容の連絡: [email protected]