自前運用(EC2)かマネージドサービス(RDS)か
初めてデータベースをクラウドに移行する際、コストを抑えるためにEC2にMySQLやPostgreSQLを自分でインストールするか、それとも運用を楽にするためにRDSを使うかで迷うことでしょう。その答えは、予算を優先するか、それとも「安眠」を優先するかによります。
1. EC2上での自前データベース運用(セルフマネージド)
- メリット: OSや設定ファイルを完全に制御可能です。コスト面では、同じ構成であればEC2はRDSより30〜50%ほど安くなるのが一般的です。
- デメリット: 運用の負担が非常に大きいです。バックアップ、高可用性(HA)のためのレプリケーション構成、毎月のセキュリティパッチ適用(OSパッチ)などをすべて自力で行う必要があります。
2. AWS RDS의 利用(マネージドサービス)
- メリット: AWSがインフラ全体を管理します。数クリックでMulti-AZ(障害時の自動フェイルオーバー)を有効化でき、ダウンタイムなしでストレージ容量の拡張も可能です。
- デメリット: コストが大幅に高くなります。また、データベースサーバーへのルートアクセス権限はありません。
実戦的なアドバイス: 中小規模のプロジェクト(SME)やテスト環境であれば、EC2は良い選択肢です。しかし、本番環境(Production)でデータがビジネスの生命線であるなら、RDSを選びましょう。以前、深夜2時にEC2のファイルシステムが破損した現場に立ち会ったことがあります。DevOpsチームが復旧に6時間を費やした一方で、RDSなら復旧ポイント(Point-in-time recovery)を選んでリストアボタンを押すだけで完了したはずです。
RDSの設定:無駄な出費やトラブルを避けるために
RDSの設定自体は難しくありませんが、パラメータの選択を誤るとAWSの請求額が跳ね上がったり、システムのボトルネックを引き起こしたりします。
インスタンスクラスの選択:Tシリーズの乱用に注意
t3/t4g(バースト可能)シリーズは非常に安価で、開発環境に適しています。しかし、これらはCPUクレジットに基づいて動作します。重いクエリが続いてクレジットを使い果たすと、パフォーマンスは5〜10%まで制限されてしまいます。本番環境では、24時間365日常に安定したパフォーマンスを確保するために、m5やr5シリーズを優先的に選ぶべきです。
ストレージ:今すぐgp2からgp3へ移行を
これは最も簡単なコスト削減方法です。gp2では、読み書きの速度(IOPS)がディスク容量に依存していました(容量を大きくしないと速くならない)。対してgp3では、容量とは独立してIOPSをカスタマイズできます。gp3へ移行するだけで、パフォーマンスを維持(あるいは向上)させつつ、ストレージコストを即座に約20%削減できます。
# AWS CLIを使用してストレージをgp2からgp3にアップグレードする
aws rds modify-db-instance \
--db-instance-identifier prod-db-server \
--storage-type gp3 \
--allocated-storage 200 \
--apply-immediately
バックアップと高可用性(HA)戦略
障害が発生してから慌ててデータ復旧の方法を探すのでは遅すぎます。RDSにおける2つの主要な保護メカニズムを理解しておく必要があります。
Multi-AZデプロイメント
Multi-AZを有効にすると、AWSは別の可用性ゾーン(AZ)にスタンバイインスタンスを作成します。データは同期(Synchronous)レプリケーションされます。メインのインスタンス(Primary)に障害が発生すると、AWSは60秒以内に自動的にトラフィックをスタンバイに切り替えます。ユーザーは、システムが完全にダウンするのではなく、一瞬わずかな遅延を感じる程度で済みます。
自動バックアップとスナップショット
- 自動バックアップ(Automated Backups): RDSは毎日自動的にデータベースのスナップショットを取得します。私は通常、保存期間(Retention Period)をステージング環境で7日間、本番環境で30日間に設定しています。
- 手動スナップショット(Manual Snapshots): これは手動で作成するバックアップです。削除するまで永久に保持されます。大規模なスキーママイグレーションを行う前には、必ずスナップショットを作成しておきましょう。
パフォーマンスの最適化:データベースの負荷が高まってきたら
ユーザー数が急増したとき、データベースが最初のボトルネックになることが多いです。以下は私がよく適用する3つの解決策です:
1. リードレプリカ(Read Replicas)の活用
アプリケーションの読み取り(Read)比率が80%を超える場合は、リードレプリカを作成しましょう。SELECTクエリをレプリカに振り分け、マスターはINSERT/UPDATE処理に専念させます。これにより、高価なメインインスタンスをアップグレードすることなく、システムの負荷耐性を大幅に向上させることができます。
2. Performance Insightsによるモニタリング
この機能は非常に価値があります。どのクエリがCPUを消費しているのか、あるいは待機イベント(Wait events)を引き起こしているのかを正確に可視化してくれます。推測に頼るのではなく、どこにインデックスを貼るべきか、どのクエリを最適化すべきかが一目でわかります。
3. パラメーターグループの微調整
RDSのデフォルト設定は安全ですが、必ずしも最適ではありません。大規模なデータベースでは、既存のRAMを最大限に活用するために、max_connectionsを調整したり、work_mem(PostgreSQLの場合)を増やしたりすることがよくあります。
実戦から学んだ教訓
以前、100GBのデータをMySQLからPostgreSQLへマイグレーションする必要がありました。リスクの高い手動のdump/restoreではなく、AWS DMS (Database Migration Service)を使用しました。このツールによりデータを継続的に同期でき、ダウンタイムを数時間からエンドポイントを切り替えるだけの数分間に短縮できました。
最後に、必ず削除保護(Deletion Protection)を有効にしてください。本番データベースを誤って削除してしまうと、取り返しのつかないことになります。作成時の小さなチェックボックス一つが、あなたのキャリアを守る最良の保険になります。

