リレーショナルDBの決定版!RDSでセキュアなデータベース環境を構築・運用
こんにちは!現役エンジニアのakrです。
「【AWSプロフェッショナルへの道】現役エンジニアが贈るクラウド実践ガイド」の第7回です。前回はELBとAuto Scalingを組み合わせることで、Webアプリケーションの高可用性とスケーラビリティを向上させる方法を学びました。これで、アプリケーションのフロントエンドはかなり堅牢になりましたね。
今回は、Webアプリケーションの心臓部とも言える「データベース」に焦点を当てます。特に、リレーショナルデータベースをAWS上で簡単に構築・運用できるマネージドサービス、Amazon RDS (Relational Database Service) を徹底的に解説します。
「データベースの運用は専門知識が必要で大変...」「バックアップや冗長化ってどうすればいいの?」といった悩みを、RDSがどのように解決してくれるのかを学びましょう。本記事では、RDSインスタンスの作成から、セキュリティ、高可用性、バックアップ、そして基本的な運用までを網羅的に学び、実践的なデータベース環境を構築するスキルを身につけます。
1. データベース運用の課題とRDSのメリット
オンプレミスでデータベースを運用する場合、サーバーの調達、OSのインストール、データベースソフトウェアのセットアップ、パッチ適用、バックアップ、レプリケーション設定、障害監視、性能チューニングなど、多岐にわたる複雑な作業が伴います。これには専門的な知識と多くの時間が必要です。
Amazon RDSは、これらのデータベース運用管理の多くをAWSが代行してくれるマネージドサービスです。これにより、開発者はデータベースのインフラ管理から解放され、アプリケーション開発に集中できるようになります。
RDSが解決する課題と提供するメリット
- 簡単なセットアップ: 数クリックで希望するデータベースインスタンスを起動できます。
- フルマネージド: OSのパッチ適用、データベースソフトウェアのバージョンアップ、バックアップ、復元、障害検知、フェイルオーバーなどをAWSが自動または半自動で行ってくれます。
-
多様なデータベースエンジンのサポート:
- Amazon Aurora: AWSが開発したMySQL/PostgreSQL互換の高性能データベース。
- MySQL: 最も普及しているオープンソースのリレーショナルデータベース。
- PostgreSQL: 高度な機能と信頼性を持つオープンソースのリレーショナルデータベース。
- MariaDB: MySQLから派生したオープンソースデータベース。
- Oracle: 商用データベース。
-
SQL Server: Microsoftの商用データベース。
これらのエンジンから、用途や既存のシステムに合わせて選択できます。
- 高可用性 (Multi-AZ): 異なるアベイラビリティゾーン (AZ) にスタンバイインスタンスを自動的にプロビジョニングし、プライマリインスタンスに障害が発生した場合に自動でフェイルオーバーします。これにより、ダウンタイムを最小限に抑えられます。
- リードレプリカ (Read Replica): 読み取り専用のレプリカインスタンスを作成し、読み込み処理を分散させることで、データベースのパフォーマンスを向上させます。
- スケーラビリティ: インスタンスタイプやストレージ容量を簡単に変更できます。
- セキュリティ: VPC内でのプライベートな配置、VPCセキュリティグループによるアクセス制御、暗号化機能(保存データ、通信)など、高いセキュリティを提供します。
- コスト効率: 必要な時に必要なだけリソースを利用できる従量課金制です。リザーブドインスタンスやSavings Plansを利用することで、コストをさらに最適化できます。
2. RDSの主要な構成要素と概念
RDSインスタンスを構築・運用する上で理解すべき重要な概念を見ていきましょう。
2.1. DBインスタンスとDBエンジン
- DBインスタンス: RDSでプロビジョニングする単一のデータベース環境の単位です。例えば、MySQLデータベースを動かすための仮想サーバーのようなものです。
- DBエンジン: DBインスタンス上で動作させるリレーショナルデータベースの種類です(例: Aurora MySQL, PostgreSQL, MySQLなど)。
2.2. インスタンスクラス
DBインスタンスのCPU、メモリ、ネットワーク性能などのスペックを定義するものです(例: db.t3.micro
, db.r6g.large
など)。アプリケーションの負荷や要件に合わせて選択します。EC2インスタンスタイプと似た考え方です。
2.3. ストレージとIOPS
DBインスタンスのデータが保存されるストレージです。
- 汎用 SSD (gp2/gp3): Webアプリケーションなど、幅広い用途に適したコスト効率の良いSSDストレージです。
- プロビジョンド IOPS SSD (io1/io2): 高いI/O性能が常に求められるトランザクション量の多いデータベースに適したSSDストレージです。
- マグネティック (Standard): 旧世代のHDDベースストレージで、ほとんど推奨されません。
ストレージの容量とタイプによって、提供されるIOPS (Input/Output Operations Per Second) が変わります。
2.4. DBサブネットグループ
RDSインスタンスはVPC内のサブネットに配置されますが、特定のアベイラビリティゾーン (AZ) に属するサブネットをまとめて「DBサブネットグループ」として定義します。Multi-AZ配置を行う際に、RDSが異なるAZにスタンバイインスタンスをプロビジョニングするために必要となります。
- 重要: DBサブネットグループには、少なくとも2つ以上のアベイラビリティゾーンにまたがるサブネットを含める必要があります。これにより、RDSが自動的にMulti-AZ配置を実現できます。通常はプライベートサブネットを指定します。
2.5. パラメータグループとオプショングループ
- DBパラメータグループ: データベースエンジン固有の設定(例: キャッシュサイズ、接続タイムアウト、文字コードなど)を管理するものです。データベースのパフォーマンスチューニングに不可欠です。
- オプショングループ: DBインスタンスに追加機能(例: OracleのAPEX、SQL ServerのTransparent Data Encryptionなど)を付与するために使用します。
3. 実践!セキュアなRDSデータベース環境を構築しよう
それでは、実際にAWSマネジメントコンソールを使って、Webアプリケーションで利用するMySQL互換のAuroraデータベースインスタンスを構築してみましょう。前回までに作成したVPCのプライベートサブネットに配置し、セキュリティグループでアクセスを制限します。
3.1. DB用セキュリティグループの作成
データベースはインターネットに直接公開すべきではありません。Webサーバーやアプリケーションサーバーからのみアクセスできるように、専用のセキュリティグループを作成します。
- AWSマネジメントコンソールにサインインし、「EC2」サービスに移動します(セキュリティグループはEC2サービスから作成します)。
- 左のナビゲーションペインから「セキュリティグループ」を選択し、「セキュリティグループを作成」をクリックします。
-
基本情報:
-
セキュリティグループ名:
rds-sg
-
説明:
Allow access to RDS from web/app servers
-
VPC: 前回作成した
my-web-app-vpc
を選択します。
-
セキュリティグループ名:
-
インバウンドルール:
- 「ルールを追加」をクリックします。
-
タイプ:
MySQL/Aurora (3306)
(または利用するDBエンジンのポート番号) -
ソースタイプ: 「カスタム」を選択し、前回作成したWebサーバー用セキュリティグループ(
web-server-sg
)のIDを入力します。これにより、web-server-sg
に紐付けられたEC2インスタンスからのみ、このRDSインスタンスへのアクセスが許可されます。- 重要: ここで「どこでも (0.0.0.0/0)」を設定してしまうと、インターネットからのアクセスが許可されてしまい、セキュリティリスクとなります。
- アウトバウンドルール: デフォルトの「すべてのトラフィックを許可」のままで問題ありません。
- 「セキュリティグループを作成」をクリック。
3.2. DBサブネットグループの作成
RDSをプライベートサブネットに配置し、Multi-AZ構成にできるようにDBサブネットグループを作成します。
- AWSマネジメントコンソールで「RDS」サービスに移動します。
- 左のナビゲーションペインから「サブネットグループ」を選択し、「DBサブネットグループを作成」をクリックします。
-
名前:
my-web-app-db-subnet-group
-
説明:
Subnet group for web app RDS
-
VPC:
my-web-app-vpc
を選択します。 -
アベイラビリティゾーン:
ap-northeast-1a
,ap-northeast-1c
など、異なるAZの2つ以上のAZを選択します。 -
サブネット: 選択したAZに対応するプライベートサブネット(例:
10.0.2.0/24
)を選択します。前回の記事でプライベートサブネットを1つしか作成していない場合は、もう1つのAZに新しいプライベートサブネットを作成してください。- (※プライベートサブネット追加手順の補足)
- VPCコンソールに戻り、「サブネット」で「サブネットを作成」をクリック。
- VPC ID:
my-web-app-vpc
- アベイラビリティゾーン:
ap-northeast-1c
(選択したAZ) - サブネット名:
my-web-app-private-subnet-c
- IPv4 CIDRブロック:
10.0.3.0/24
(既存と重複しないように) - 作成後、DBサブネットグループの作成に戻り、この新しいプライベートサブネットも選択します。
- (※プライベートサブネット追加手順の補足)
- 「作成」をクリック。
3.3. RDSインスタンス (Aurora DBクラスター) の作成
いよいよデータベースインスタンスを作成します。今回はAurora MySQL互換を選択します。
- RDSコンソールで左のナビゲーションペインから「データベース」を選択し、「データベースを作成」をクリックします。
- 作成方法の選択: 「標準作成」を選択します。
-
エンジンのオプション:
- エンジンのタイプ: 「Amazon Aurora」
- エディション: 「Amazon Aurora MySQL 互換エディション」
- バージョン: 最新の推奨バージョンを選択します。
- テンプレート: 「開発/テスト」を選択します。(本番環境では「本番稼働用」を選択)
-
DBクラスターの識別子:
my-web-app-db
-
認証情報:
-
マスターユーザー名:
admin
など、任意のユーザー名を指定します。 - マスターパスワード: 強固なパスワードを設定します。
-
マスターユーザー名:
-
DBインスタンスの設定:
-
DBインスタンスクラス: 「バースト可能クラス (t インスタンス)」から「
db.t3.medium
」または「db.t4g.medium
」を選択します。(無料枠対象はdb.t3.micro
ですが、Auroraはt3.medium
以上が推奨されます)
-
DBインスタンスクラス: 「バースト可能クラス (t インスタンス)」から「
-
可用性とスケーラビリティ:
- 「マルチAZ DBクラスターを作成」で「異なるアベイラビリティゾーンにレプリカを作成」を選択します。これにより、プライマリとスタンバイインスタンスが異なるAZに配置され、高可用性が確保されます。
-
接続:
-
仮想プライベートクラウド (VPC):
my-web-app-vpc
を選択します。 -
サブネットグループ: 先ほど作成した
my-web-app-db-subnet-group
を選択します。 - パブリックアクセス: 「なし」を選択します。非常に重要です! インターネットから直接アクセスできないようにします。
-
既存のVPCセキュリティグループ: 先ほど作成した
rds-sg
を選択します。
-
仮想プライベートクラウド (VPC):
-
追加設定:
-
初期データベース名:
webapp_db
など、任意のデータベース名を指定します。 -
DBクラスターポート:
3306
(MySQLの標準ポート) -
バックアップ:
-
バックアップ保持期間:
7日間
など、任意の期間を設定します。(AWSが自動的にバックアップを取得・保持してくれます) - 暗号化: 「暗号化を有効にする」にチェックを入れます。これにより、保管中のデータが暗号化されます。
-
バックアップ保持期間:
- モニタリング: 「強化されたモニタリング」を有効にすると、より詳細なメトリクスが取得できます。
- ログのエクスポート: 必要に応じてCloudWatch Logsにエクスポートするログを選択します。
- 自動マイナーバージョンアップグレード: 「有効にする」推奨。
- 削除保護: 本番環境では「有効にする」を強く推奨します。誤ってDBが削除されるのを防ぎます。今回は学習のためオフでも可。
-
初期データベース名:
- 「データベースを作成」をクリックします。
データベースクラスターの作成には10分〜20分、またはそれ以上かかる場合があります。ステータスが「利用可能」になるまで待ちましょう。
3.4. EC2インスタンスからRDSに接続してみる
DBインスタンスが「利用可能」になったら、前回作成したWebサーバー用EC2インスタンスからRDSに接続できるか確認してみましょう。
- RDSコンソールで、作成したDBクラスター (
my-web-app-db
) を選択します。 - 「接続とセキュリティ」タブの「エンドポイント」と「ポート」を控えます。
- WebサーバーのEC2インスタンスにSSHで接続します。
- MySQLクライアントをインストールします(Amazon Linuxの場合)。
sudo yum install -y mysql
- MySQLクライアントを使ってRDSに接続します。
例:
mysql -h <RDSエンドポイント> -P <ポート番号> -u <マスターユーザー名> -p
mysql -h my-web-app-db.cluster-xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -P 3306 -u admin -p
- パスワードを求められるので、マスターパスワードを入力します。
- 接続に成功すると、MySQLのプロンプトが表示されます。
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | webapp_db | +--------------------+ 5 rows in set (0.00 sec) mysql> exit
webapp_db
が表示されていれば成功です!これで、EC2インスタンス上のアプリケーションからこのデータベースに接続できるようになります。
4. RDSの運用管理とベストプラクティス
RDSを利用することで、データベース運用が大幅に楽になりますが、いくつかの重要な運用管理とベストプラクティスを意識しましょう。
-
Multi-AZの活用:
- 本番環境では、必ずMulti-AZ構成を有効にしましょう。これにより、単一のAZ障害から自動的に復旧し、高い可用性を確保できます。
-
リードレプリカの活用:
- 読み込みが多いアプリケーションでは、リードレプリカを作成して読み込み処理を分散させることで、プライマリDBインスタンスの負荷を軽減し、パフォーマンスを向上させます。
-
バックアップと復元:
- RDSは自動的にバックアップ(スナップショットとトランザクションログ)を取得します。バックアップ保持期間を適切に設定し、必要に応じて特定の時点に復元できることを確認しましょう。
- 手動スナップショットも必要に応じて取得しましょう。
-
セキュリティグループによるアクセス制御:
- データベースへのアクセスは、必要最小限のソース(Web/Appサーバーのセキュリティグループなど)に限定し、インターネットからの直接アクセスは厳禁です。
- 定期的にセキュリティグループの設定を見直しましょう。
-
暗号化の有効化:
- 保存中のデータ(ストレージ)と転送中のデータ(SSL/TLS)の両方で暗号化を有効にしましょう。
-
パラメータグループによるチューニング:
- アプリケーションの要件に合わせて、DBパラメータグループでデータベースの設定を最適化しましょう。ただし、誤った設定はパフォーマンス低下や不安定化を招くため、十分な知識とテストが必要です。
-
モニタリングとアラート:
- CloudWatchを使ってRDSインスタンスのCPU、メモリ、ディスクIOPS、接続数などのメトリクスを監視し、異常を検知した際にアラートが通知されるように設定しましょう。
-
コスト管理:
- 不要なDBインスタンスは削除し、稼働時間を最適化しましょう。
- 長期利用を計画している場合は、リザーブドインスタンスやSavings Plansの利用を検討し、コストを削減しましょう。
まとめ
今回は、AWSのマネージド型リレーショナルデータベースサービスであるAmazon RDSについて、そのメリット、主要な構成要素、そしてセキュアなデータベース環境の構築手順を学びました。
- RDSは、データベース運用管理の手間を大幅に削減し、開発者はアプリケーション開発に集中できます。
- DBサブネットグループ、Multi-AZ、リードレプリカは、高可用性とパフォーマンスの鍵となります。
- セキュリティグループを使ってデータベースへのアクセスを厳密に制御し、パブリックアクセスを無効化することが極めて重要です。
- 実際にAurora MySQL互換クラスターを作成し、EC2インスタンスからの接続を確認しました。
これで、あなたのWebアプリケーションは、堅牢でスケーラブルなデータベース基盤を持つことができました。RDSは非常に強力なサービスですが、その設定や運用には慎重さが求められます。今回の内容を参考に、ご自身のアプリケーションに最適なデータベース環境を構築してください。
この記事が皆さんのAWS学習の一助となれば幸いです。
もしこの記事が役に立ったと感じたら、ぜひ「いいね」👍をお願いします!励みになります!