Amazon RDS(Aurora を含む)を本番運用する際の設計・運用上のベストプラクティスを、領域ごとに整理したドキュメントです。
目次
- エンジン・インスタンス選定
- 高可用性(HA)と耐障害性
- バックアップとリカバリ
- セキュリティ
- ネットワーク設計
- パフォーマンス
- ストレージ
- 監視・アラート
- メンテナンス・アップグレード
- コスト最適化
- 運用・IaC
- チェックリスト
1. エンジン・インスタンス選定
| 観点 | 推奨 |
|---|
| エンジン | 高い可用性・読み取りスケールが必要なら Aurora、互換性やコスト重視なら RDS for MySQL / PostgreSQL |
| インスタンスファミリー | 汎用は m 系、メモリ集約は r 系。開発・検証用途以外で t 系(バースト)を本番に使わない |
| アーキテクチャ | Graviton(g 付き、例: r7g) は同等スペックの x86 より価格性能比が高いことが多い |
| サイジング | ワーキングセット(頻繁に参照されるデータ+インデックス)がメモリに収まるサイズを選ぶ |
| 変動負荷 | 負荷変動が大きい/予測しにくい場合は Aurora Serverless v2 を検討 |
ポイント
t 系はCPUクレジット枯渇で突然性能が落ちる。本番で使う場合は CPUCreditBalance を必ず監視する。
- 最初は小さめに始め、CloudWatch / Performance Insights の実測値をもとにスケールする。
2. 高可用性(HA)と耐障害性
Multi-AZ
- 本番環境では必ず Multi-AZ を有効化する。
- Multi-AZ インスタンス配置: スタンバイ1台(読み取り不可)、同期レプリケーション
- Multi-AZ DB クラスター(MySQL/PostgreSQL): 読み取り可能なスタンバイ2台、フェイルオーバーが高速
- Aurora: クラスターボリュームが3AZに6重複製。リーダーインスタンスを別AZに置くことでフェイルオーバー先を確保
フェイルオーバーに強いアプリケーション
- 接続先は IP ではなく エンドポイント(DNS名) を使う。
- アプリ側の DNS キャッシュ TTL を短く(例: JVM の
networkaddress.cache.ttl)。
- 接続断を前提とした リトライ(指数バックオフ) を実装する。
- RDS Proxy を使うとフェイルオーバー時間の短縮とコネクション維持が期待できる。
- Aurora では AWS が提供するドライバ(AWS Advanced JDBC Wrapper 等)でフェイルオーバー検知を高速化できる。
リードレプリカ
- 読み取り負荷の分散に使う(HAの代替ではない点に注意。※Auroraのリーダーはフェイルオーバー先にもなる)。
- レプリカラグ(
ReplicaLag / AuroraReplicaLag)を監視し、整合性が必要な読み取りはライターへ向ける。
DR(災害対策)
| 要件 | 選択肢 |
|---|
| RPO/RTO が緩い | スナップショットのクロスリージョンコピー、AWS Backup |
| 中程度 | クロスリージョンリードレプリカ |
| 厳しい(Aurora) | Aurora Global Database(リージョン間レプリケーションが低遅延) |
- フェイルオーバー/DR 手順は定期的に訓練する(
reboot --force-failover 等で検証)。
3. バックアップとリカバリ
- 自動バックアップを有効化し、保持期間は要件に合わせて設定(本番は 7〜35 日が目安)。
- ポイントインタイムリカバリ(PITR) が使えることを確認する。
- 長期保存やコンプライアンス要件には AWS Backup でポリシー管理(別アカウント・別リージョンへのコピーも可能)。
- 削除保護(Deletion Protection)を有効化する。
- 削除時に最終スナップショットを取得する設定にする(IaC では
skip_final_snapshot = false)。
- 重大な変更(メジャーアップグレード、スキーマ変更)の前に手動スナップショットを取得する。
- リストア手順を定期的にテストする(リストア所要時間=実際の RTO を把握する)。
- Aurora MySQL では Backtrack による短時間の巻き戻しも選択肢。
4. セキュリティ
暗号化
- 保管時の暗号化(KMS)を作成時に有効化する(後から有効化できないため、既存の非暗号化DBはスナップショットを暗号化コピーして復元する必要がある)。
- 要件に応じてカスタマーマネージドキー(CMK)を使い、キーポリシーでアクセスを制御する。
- 転送中の暗号化(TLS)を強制する。
- PostgreSQL:
rds.force_ssl = 1
- MySQL:
require_secure_transport = ON
- CA 証明書の更新期限を把握し、計画的にローテーションする。
認証・認可
- マスターユーザーのパスワードは AWS Secrets Manager で管理(RDS 統合による自動ローテーション)。
- アプリケーション用に 最小権限の DB ユーザーを個別に作成し、マスターユーザーをアプリで使わない。
- IAM データベース認証を活用すると、パスワードレスで短期トークンによる接続が可能。
- IAM ポリシーで RDS API 操作(削除・変更など)を制限する。
監査・検知
- CloudTrail で RDS API 操作を記録する。
- DB の監査ログを有効化し CloudWatch Logs へ出力する。
- PostgreSQL:
pgaudit
- MySQL / MariaDB: Audit プラグイン
- Amazon GuardDuty RDS Protection で不審なログイン(Aurora 対象)を検知する。
- AWS Config ルールで設定の逸脱(パブリックアクセス、暗号化なし等)を検出する。
- Security Hub でセキュリティ基準への準拠状況を確認する。
5. ネットワーク設計
- プライベートサブネットに配置し、
PubliclyAccessible = false にする。
- DB サブネットグループは 複数 AZ のサブネットで構成する。
- セキュリティグループはアプリケーション層のSGからのみ、必要なポートだけを許可(CIDR 全開放はしない)。
- 運用者のアクセスは踏み台ではなく SSM Session Manager のポートフォワーディング などを使い、SSH 鍵管理や公開ポートを避ける。
- Lambda など接続数が急増しやすいワークロードからは RDS Proxy 経由で接続する。
6. パフォーマンス
パラメータ管理
- デフォルトのパラメータグループは変更できないため、カスタムパラメータグループを作成して使う。
- 変更は検証環境で効果を確認してから本番に適用する。動的/静的パラメータ(再起動要否)を区別する。
接続管理
- アプリ側で コネクションプーリングを使う。
max_connections を意識し、接続数が多い場合は RDS Proxy を導入する。
クエリ・インデックス
- Performance Insights で待機イベント・上位 SQL を分析する。
- スロークエリログを有効化(
slow_query_log / log_min_duration_statement)して定期的に確認する。
- 実行計画(
EXPLAIN / EXPLAIN ANALYZE)でインデックスの効き具合を確認する。
- PostgreSQL では
autovacuum の設定と、テーブル肥大化(bloat)を監視する。
読み取りのスケール
- 読み取り中心のワークロードはリードレプリカ/Aurora リーダーへ分散する。
- 頻繁に読まれるデータは ElastiCache 等でキャッシュする。
その他
- I/O 集約で読み取りが多い場合、ローカル NVMe を使う Optimized Reads(対応インスタンス)を検討。
- Aurora で I/O コストが大きい場合は Aurora I/O-Optimized を検討。
7. ストレージ
- 汎用用途は gp3 を推奨(gp2 よりベースライン性能を独立に設定でき、コスト効率が良いことが多い)。
- 高く安定した IOPS が必要なら io1 / io2 Block Express。
- ストレージの自動スケーリングを有効化し、最大ストレージを設定してディスクフルを防ぐ。
FreeStorageSpace を監視し、閾値でアラートを出す。
- 注意: RDS のストレージは 縮小できない(縮小には新規作成+移行が必要)。
8. 監視・アラート
有効化すべき機能
| 機能 | 用途 |
|---|
| CloudWatch メトリクス | 基本的なリソース監視 |
| 拡張モニタリング(Enhanced Monitoring) | OS レベル(プロセス、メモリ等)の詳細メトリクス |
| Performance Insights / Database Insights | DB 負荷・待機イベント・SQL 分析 |
| CloudWatch Logs エクスポート | エラーログ、スロークエリログ、監査ログ |
| RDS イベント通知(EventBridge / SNS) | フェイルオーバー、メンテナンス、バックアップ失敗等の通知 |
主要なアラーム対象メトリクス
| メトリクス | 確認ポイント |
|---|
CPUUtilization | 継続的な高負荷 |
FreeableMemory | メモリ不足・スワップの兆候 |
SwapUsage | 0 から増えていないか |
FreeStorageSpace | 残容量(%で閾値設定) |
DatabaseConnections | max_connections に近づいていないか |
ReadLatency / WriteLatency | ストレージ性能の劣化 |
ReadIOPS / WriteIOPS | プロビジョニング上限への接近 |
ReplicaLag / AuroraReplicaLag | レプリカの遅延 |
CPUCreditBalance | t 系インスタンスのクレジット枯渇 |
DiskQueueDepth | I/O 待ちの滞留 |
- DevOps Guru for RDS を使うと、異常検知と原因の示唆が得られる。
9. メンテナンス・アップグレード
- メンテナンスウィンドウとバックアップウィンドウを業務影響の少ない時間帯に設定し、両者が重ならないようにする。
- マイナーバージョン自動アップグレードは、検証プロセスと合わせて方針を決める(検証環境で先行適用するのが望ましい)。
- メジャーバージョンのサポート終了(EoS)を計画的に管理する。サポート終了後は RDS 延長サポート(有料) に自動で移行し、追加料金が発生するため注意。
- メジャーアップグレードや大きな変更には Blue/Green Deployments を使い、ダウンタイムとリスクを最小化する。
- 適用待ちのメンテナンス(
Pending maintenance)を定期的に確認する。
10. コスト最適化
- 長期稼働の本番 DB は リザーブドインスタンス(RI) を検討する。
- Graviton インスタンスへの移行で価格性能比を改善する。
- 開発・検証環境は 夜間・休日に停止する(RDS の停止は最大 7 日で自動起動されるため、スケジュール停止を組む)。
- 使われていないインスタンス、古い手動スナップショットを定期的に棚卸しする。
- Compute Optimizer / Trusted Advisor で過剰サイズのインスタンスを特定する。
- Aurora は I/O コスト比率に応じて Standard と I/O-Optimized を選択する。
- 旧バージョンを放置して延長サポート料金が発生していないか確認する。
11. 運用・IaC
- RDS 構成は Terraform / CloudFormation / CDK でコード管理し、手動変更を避ける。
- タグ付け規約(
Environment, Owner, Project, CostCenter など)を定めてコスト配分と管理に活用する。
- 環境ごと(本番・ステージング・開発)にアカウントまたは VPC を分離する。
- 本番データを開発環境で使う場合は マスキング・匿名化を行う。
- スキーマ変更はマイグレーションツール(Flyway, Liquibase 等)で管理し、大規模テーブルの変更はオンライン DDL 手法(
pt-online-schema-change, gh-ost 等)を検討する。
- 障害対応・フェイルオーバー・リストアの Runbook を整備する。
12. チェックリスト
可用性・バックアップ
セキュリティ
パフォーマンス・監視
運用・コスト
参考資料