はじめる前に
- 必須AWS アカウントを持ち、マネジメントコンソールにサインインできること
- 必須VPC・サブネットを作成した経験があること
- 必須EC2 を SSH でログインした経験があること
- 必須セキュリティグループの基本的な設定経験があること
- あると良いSQL(
SELECT、INSERT程度)の基本構文
※ コンソール操作に加えて、お使いのパソコンのターミナルから、踏み台サーバー経由でのSSH接続(2段階のSSH接続)を使用します。
参照する公式ドキュメント
手順に迷ったときや、用語の意味を確かめたいときに開きましょう。
※ リンク切れの場合は、ページタイトルで検索してください。
背景・シナリオ
データベースをインターネットに直接公開してしまうと、世界中からの不正アクセスの対象になってしまいます。データベースをプライベートサブネット(インターネットから直接到達できない区画)に置き、同じ VPC 内のサーバーからだけ接続できるようにすれば、データベース自体は外から見えない状態のまま安全に使えます。今回はその基本構成を組み立てます。
EC2 の MySQL サーバーを自分で立てるのと何が違うの?
RDS はバックアップ、パッチ適用、障害時の自動復旧などを AWS が代わりに管理してくれるマネージドサービスです。オペレーティングシステムやデータベースソフトの管理から解放され、データベースの利用そのものに集中できます。
なぜ EC2 を経由する必要があるの?
RDS をプライベートサブネットに置くと、インターネットから直接到達できません。同じ VPC 内の EC2(パブリックサブネットに置いた踏み台サーバー、またはアプリケーションサーバー)を経由することで、データベースを外部にさらさずに利用できます。
VPC 内にパブリックサブネットとプライベートサブネットを用意し、プライベートサブネットに RDS for MySQL インスタンスを作成する。パブリックサブネットの EC2(踏み台)経由で RDS に接続し、データベース・テーブルの作成、データの追加・取得(SQL)をひととおり行う。
つくる構成
パブリックサブネットに踏み台 EC2 を置き、プライベートサブネットに RDS for MySQL インスタンスを置きます。CIDR は VPC の範囲内で重ならなければ自由に決めて構いません(例の数値は一例です)。
※ 数値・アベイラビリティーゾーンは一例です。CIDR は VPC の範囲内で重ならなければ自由に決められます。
要件
以下の要件を満たす構成を作り、踏み台 EC2 経由で RDS に接続して SQL を実行できることを確認してください。
| No | 要件 |
|---|---|
| 1 | リージョンは「東京(ap-northeast-1)」を使用する。 |
| 2 | VPC 内にパブリックサブネットとプライベートサブネットを 1 つずつ用意する(既存の VPC を使ってもよい)。CIDR は自由(例:パブリック 10.0.1.0/24、プライベート 10.0.2.0/24)。 |
| 3 | パブリックサブネットに EC2(踏み台用、SSH はマイ IP のみ許可)を 1 台起動する。 |
| 4 | プライベートサブネットを含む DB サブネットグループを作成し、RDS for MySQL の DB インスタンスを 1 つ作成する(パブリックアクセス「なし」、認証情報は自由に設定)。 |
| 5 | RDS のセキュリティグループで、インバウンドの MySQL/Aurora(3306 番ポート)を踏み台 EC2 のセキュリティグループからのみ許可する。 |
| 6 | 踏み台 EC2 に SSH でログインし、mysql クライアントから RDS に接続して、データベース・テーブルの作成、データの追加(INSERT)・取得(SELECT)を行う。 |
構築の進め方
「ネットワークを整える → 踏み台を置く → RDS を作る → 接続して SQL を実行する」の順に積み上げます。各ステップで「なぜそうするのか」を意識すると理解が定着しやすくなります。
-
マネジメントコンソールにサインインし、リージョンを東京に合わせる
ブラウザで AWS マネジメントコンソールにサインインし、画面右上のリージョンが「アジアパシフィック(東京)ap-northeast-1」になっていることを確認します。
-
VPC 内にパブリックサブネットとプライベートサブネットを用意する
既存の VPC があれば利用してよく、新しく作る場合は VPC を 1 つ用意し(例:
10.0.0.0/16)、その中にパブリックサブネットとプライベートサブネットを 1 つずつ作ります。CIDR は重ならないように決めます(例:10.0.1.0/24と10.0.2.0/24)。アベイラビリティーゾーンを意識しておくこのあと作成する DB サブネットグループには、異なるアベイラビリティーゾーンに属するサブネットが 2 つ以上必要になります。プライベートサブネットを複数のアベイラビリティーゾーンに用意しておくと、後の手順がスムーズです。
-
パブリックサブネットに踏み台 EC2 を 1 台起動する
EC2 を 1 台起動します(例:Amazon Linux 2023・無料利用枠対象タイプ)。パブリックサブネットに配置し、パブリック IP の自動割り当てを有効にします。セキュリティグループは、インバウンドの SSH(22)を「マイ IP」からのみ許可する設定にします。
-
RDS 用のセキュリティグループを作成する
EC2 コンソールの「セキュリティグループ」で、RDS 用のセキュリティグループを 1 つ作成します(例:
rds-sg)。インバウンドルールでタイプ「MySQL/Aurora」(3306 番ポート)を、ソースに手順 3 で作成した踏み台 EC2 のセキュリティグループを指定して許可します。ソースは IP アドレスではなくセキュリティグループ送信元を IP アドレスで指定すると、踏み台 EC2 の IP が変わった際に設定し直しが必要になります。セキュリティグループ同士を参照させておくと、インスタンスを入れ替えても設定を変えずに済みます。
-
DB サブネットグループを作成する
RDS コンソールの「サブネットグループ」→「DB サブネットグループを作成」から、手順 2 で用意した VPC を選び、プライベートサブネットを含めます。
異なるアベイラビリティーゾーンが 2 つ以上必要DB サブネットグループには、異なるアベイラビリティーゾーンに属するサブネットが 2 つ以上必要というルールがあります。プライベートサブネットが 1 つしかない場合は、もう 1 つ別のアベイラビリティーゾーンに追加で作成しておきましょう。
-
RDS for MySQL の DB インスタンスを作成する
RDS コンソールの「データベースの作成」から、次のように設定します。
エンジンの種類 MySQL テンプレート 自由(例:開発/テスト) DB インスタンス識別子・認証情報 自由に設定(パスワードは忘れないようメモしておく) VPC・DB サブネットグループ 手順 2 の VPC ・手順 5 で作成したサブネットグループ パブリックアクセス なし VPC セキュリティグループ 手順 4 で作成した rds-sg作成には数分かかるDB インスタンスの作成には数分かかります。ステータスが「利用可能」になるまで、他の作業を進めながら待ちましょう。
-
踏み台 EC2 に SSH でログインし、mysql クライアントをインストールする
ローカルのターミナルから踏み台 EC2 にログインし、mysql クライアントをインストールします。
# ローカルから踏み台 EC2 へ ssh -i my-key.pem ec2-user@<踏み台のパブリック IP> # 踏み台の中で、mysql クライアントをインストール(Amazon Linux の場合) sudo dnf install -y mariadb105
MySQL 互換のクライアントを使うAmazon Linux では、MySQL と互換性のある MariaDB のクライアントパッケージに含まれる
mysqlコマンドを使って接続します。OS のバージョンによってパッケージ名が異なる場合があるため、見つからない場合はパッケージ名を確認してみてください。 -
RDS のエンドポイントを使って接続する
RDS コンソールの DB インスタンスの詳細から「エンドポイント」をコピーし、踏み台 EC2 の中から接続します。
# RDS のエンドポイントを指定して接続(ユーザー名は作成時に設定したもの) mysql -h <RDS のエンドポイント> -u <ユーザー名> -pパスワードの入力を求められたら、DB インスタンス作成時に設定したパスワードを入力します。
mysql>プロンプトが表示されれば接続成功です。 -
データベース・テーブルを作成し、データの追加・取得を確認する
接続できたら、データベースとテーブルを 1 つ作成し、データを追加・取得してみます。
-- データベースを作成して使用する(名前は自由、例:handson_db) CREATE DATABASE handson_db; USE handson_db; -- テーブルを作成する(列構成は自由、例として簡単なものを示す) CREATE TABLE items ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), price INT ); -- データを2〜3件追加する INSERT INTO items (name, price) VALUES ('apple', 150); INSERT INTO items (name, price) VALUES ('banana', 100); -- 追加したデータを確認する SELECT * FROM items;
SELECTの結果に、追加した行が表示されれば成功です。
つまずきポイント
初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。
「mysql コマンドを実行しても、応答がないまま止まってしまう」
確認したい点がいくつかあります。①RDS のセキュリティグループのインバウンドルールが、踏み台 EC2 のセキュリティグループを正しく参照しているか、②DB インスタンスのステータスがまだ「作成中」で利用可能になっていない可能性——のいずれかが多い原因です。順に見直してみましょう。
「サブネットグループを保存しようとすると、エラーメッセージが表示される」
RDS の DB サブネットグループには、異なるアベイラビリティーゾーンに属するサブネットが 2 つ以上必要という制約があります。プライベートサブネットが 1 つのアベイラビリティーゾーンにしかない場合は、別のアベイラビリティーゾーンにもう 1 つ追加してみましょう。
完了チェック
要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。RDS コンソール・EC2 コンソール・ターミナルを順に確かめましょう。
- RDS の DB インスタンスの一覧で、作成したインスタンスのステータスが「利用可能」になっている。
- そのインスタンスの詳細画面で、パブリックアクセスが「なし」になっている。
- 踏み台 EC2 に SSH でログインでき、そこから
mysqlコマンドで RDS のエンドポイントに接続できる。 - 作成したテーブルが
SHOW TABLES;の結果に表示される。 INSERTしたデータが、SELECT * FROM items;の結果に表示される。- ローカルの端末から RDS のエンドポイントに直接
mysqlで接続しようとすると、到達できない(プライベートサブネットに隠れていることの裏付け)。
考えてみよう
手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。
- RDS をパブリックアクセス可能にして直接インターネットから接続できるようにする方法と比べて、今回の構成はどんな点で安全でしょうか。
ヒント
パブリックアクセス可能にすると、世界中から接続を試行できる状態になり、ID・パスワードの推測やソフトウェアの脆弱性を狙った攻撃の対象になります。プライベートサブネットに置くことで、そもそも接続の経路自体を絶てる、という点に注目してみましょう。 - 踏み台 EC2 が停止していたら、RDS への接続はどうなるでしょうか。
ヒント
RDS 自体は動作を続けますが、接続できるのは同じ VPC 内のリソース経由だけです。踏み台 EC2 が停止していると、その経路が失われ、外部の端末からは接続できなくなります。「接続できないこと」自体は安全性の裏返しでもある、という視点で考えてみましょう。 - 複数のアプリケーションサーバーから同じ RDS に接続したい場合、セキュリティグループの設定はどう考えればよいでしょうか。
ヒント
サーバーが増えるたびに IP アドレスを 1 つずつ許可リストに追加していくのは管理が大変です。アプリケーションサーバーを共通のセキュリティグループに所属させ、RDS 側ではそのセキュリティグループからの接続を許可する、という形にしておくと管理がシンプルになります。
後片づけ
課金が大きい RDS から先に片づけましょう。次の順で進めます。
- RDS インスタンスを削除する:DB インスタンスを選び「アクション」→「削除」。削除時に最終スナップショットを作成するかどうかの選択があります。今後使う予定がなければ不要ですが、迷う場合は作成しておくと安心です。
- DB サブネットグループを削除する:RDS インスタンスの削除が完了したあとに削除します。
- EC2 を終了する:踏み台用に起動したインスタンスを選び「インスタンスの状態」→「インスタンスを終了」。
- セキュリティグループを削除する:踏み台用・RDS 用、それぞれこのハンズオン専用に作成したものを削除します。
削除するのは、このハンズオンで自分が作ったものだけ
既存の VPC を利用した場合、VPC やサブネット自体は削除しないでください。デフォルト VPC やデフォルトのリソースも、他の用途で使われている可能性があるため削除しないようにしましょう。
コストに関する注意: RDS インスタンスは起動している時間に応じて料金が発生します。無料利用枠の対象となるインスタンスクラスがある場合がありますが、対象かどうかは事前に確認が必要です。EC2 インスタンス(踏み台用)の料金もかかります。VPC・サブネット・ルートテーブル・セキュリティグループ・DB サブネットグループ自体には料金はかかりません。検証が終わったら、上の「後片づけ」を参考にRDS インスタンスと EC2 インスタンスの両方を削除することをおすすめします。最新の料金は AWS の公式料金ページで確認してください。