← ハンズオン一覧に戻る

AWS Hands-on / Database

データベースを、外から隠したまま使う

マネージド型データベース「RDS」で MySQL のインスタンスをプライベートサブネットに作り、同じ VPC 内の EC2 から接続して SQL を実行します。データベースをインターネットに直接さらさずに使う、実務でも基本となる構成を体験します。

● Lv.3 複数のサービスを組み合わせられる人 ⏱ 所要 60〜90 分 コンソール操作に加えて SSH を使用します
01 — Prerequisites

はじめる前に

  • 必須AWS アカウントを持ち、マネジメントコンソールにサインインできること
  • 必須VPC・サブネットを作成した経験があること
  • 必須EC2 を SSH でログインした経験があること
  • 必須セキュリティグループの基本的な設定経験があること
  • あると良いSQL(SELECTINSERT 程度)の基本構文

※ コンソール操作に加えて、お使いのパソコンのターミナルから、踏み台サーバー経由でのSSH接続(2段階のSSH接続)を使用します。

02 — References

参照する公式ドキュメント

手順に迷ったときや、用語の意味を確かめたいときに開きましょう。

※ リンク切れの場合は、ページタイトルで検索してください。

03 — Background

背景・シナリオ

データベースをインターネットに直接公開してしまうと、世界中からの不正アクセスの対象になってしまいます。データベースをプライベートサブネット(インターネットから直接到達できない区画)に置き、同じ VPC 内のサーバーからだけ接続できるようにすれば、データベース自体は外から見えない状態のまま安全に使えます。今回はその基本構成を組み立てます。

EC2 の MySQL サーバーを自分で立てるのと何が違うの?

RDS はバックアップ、パッチ適用、障害時の自動復旧などを AWS が代わりに管理してくれるマネージドサービスです。オペレーティングシステムやデータベースソフトの管理から解放され、データベースの利用そのものに集中できます。

なぜ EC2 を経由する必要があるの?

RDS をプライベートサブネットに置くと、インターネットから直接到達できません。同じ VPC 内の EC2(パブリックサブネットに置いた踏み台サーバー、またはアプリケーションサーバー)を経由することで、データベースを外部にさらさずに利用できます。

Goal

VPC 内にパブリックサブネットとプライベートサブネットを用意し、プライベートサブネットに RDS for MySQL インスタンスを作成する。パブリックサブネットの EC2(踏み台)経由で RDS に接続し、データベース・テーブルの作成、データの追加・取得(SQL)をひととおり行う。

04 — Architecture

つくる構成

パブリックサブネットに踏み台 EC2 を置き、プライベートサブネットに RDS for MySQL インスタンスを置きます。CIDR は VPC の範囲内で重ならなければ自由に決めて構いません(例の数値は一例です)。

aws AWS Cloud — Region : ap-northeast-1(東京)
VPC : 10.0.0.0/16(例)
インターネットゲートウェイ(パブリックサブネットのみアクセス可能)
public-subnet
ap-northeast-1a
10.0.1.0/24(例)
踏み台 EC2(パブリック IP あり)
ルート: 0.0.0.0/0 → インターネットゲートウェイ
private-subnet
ap-northeast-1c(踏み台と異なる AZ の例)
10.0.2.0/24(例)
RDS for MySQL(パブリックアクセス「なし」)
ルート: インターネットゲートウェイへの経路なし
踏み台 EC2 → RDS への接続(3306 番ポート)
プライベートサブネットの RDS には、インターネットから直接到達できません。同じ VPC 内の踏み台 EC2 だけが、セキュリティグループの許可を通じて 3306 番ポートで接続できます。
※ 数値・アベイラビリティーゾーンは一例です。CIDR は VPC の範囲内で重ならなければ自由に決められます。
05 — Requirements

要件

以下の要件を満たす構成を作り、踏み台 EC2 経由で RDS に接続して SQL を実行できることを確認してください。

No要件
1リージョンは「東京(ap-northeast-1)」を使用する。
2VPC 内にパブリックサブネットとプライベートサブネットを 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 つ作成する(パブリックアクセス「なし」、認証情報は自由に設定)。
5RDS のセキュリティグループで、インバウンドの MySQL/Aurora(3306 番ポート)を踏み台 EC2 のセキュリティグループからのみ許可する。
6踏み台 EC2 に SSH でログインし、mysql クライアントから RDS に接続して、データベース・テーブルの作成、データの追加(INSERT)・取得(SELECT)を行う。
06 — Steps

構築の進め方

「ネットワークを整える → 踏み台を置く → RDS を作る → 接続して SQL を実行する」の順に積み上げます。各ステップで「なぜそうするのか」を意識すると理解が定着しやすくなります。

  1. マネジメントコンソールにサインインし、リージョンを東京に合わせる

    ブラウザで AWS マネジメントコンソールにサインインし、画面右上のリージョンが「アジアパシフィック(東京)ap-northeast-1」になっていることを確認します。

  2. VPC 内にパブリックサブネットとプライベートサブネットを用意する

    既存の VPC があれば利用してよく、新しく作る場合は VPC を 1 つ用意し(例:10.0.0.0/16)、その中にパブリックサブネットとプライベートサブネットを 1 つずつ作ります。CIDR は重ならないように決めます(例:10.0.1.0/2410.0.2.0/24)。

    アベイラビリティーゾーンを意識しておく

    このあと作成する DB サブネットグループには、異なるアベイラビリティーゾーンに属するサブネットが 2 つ以上必要になります。プライベートサブネットを複数のアベイラビリティーゾーンに用意しておくと、後の手順がスムーズです。

  3. パブリックサブネットに踏み台 EC2 を 1 台起動する

    EC2 を 1 台起動します(例:Amazon Linux 2023・無料利用枠対象タイプ)。パブリックサブネットに配置し、パブリック IP の自動割り当てを有効にします。セキュリティグループは、インバウンドの SSH(22)を「マイ IP」からのみ許可する設定にします。

  4. RDS 用のセキュリティグループを作成する

    EC2 コンソールの「セキュリティグループ」で、RDS 用のセキュリティグループを 1 つ作成します(例:rds-sg)。インバウンドルールでタイプ「MySQL/Aurora」(3306 番ポート)を、ソースに手順 3 で作成した踏み台 EC2 のセキュリティグループを指定して許可します。

    ソースは IP アドレスではなくセキュリティグループ

    送信元を IP アドレスで指定すると、踏み台 EC2 の IP が変わった際に設定し直しが必要になります。セキュリティグループ同士を参照させておくと、インスタンスを入れ替えても設定を変えずに済みます。

  5. DB サブネットグループを作成する

    RDS コンソールの「サブネットグループ」→「DB サブネットグループを作成」から、手順 2 で用意した VPC を選び、プライベートサブネットを含めます。

    異なるアベイラビリティーゾーンが 2 つ以上必要

    DB サブネットグループには、異なるアベイラビリティーゾーンに属するサブネットが 2 つ以上必要というルールがあります。プライベートサブネットが 1 つしかない場合は、もう 1 つ別のアベイラビリティーゾーンに追加で作成しておきましょう。

  6. RDS for MySQL の DB インスタンスを作成する

    RDS コンソールの「データベースの作成」から、次のように設定します。

    エンジンの種類MySQL
    テンプレート自由(例:開発/テスト)
    DB インスタンス識別子・認証情報自由に設定(パスワードは忘れないようメモしておく)
    VPC・DB サブネットグループ手順 2 の VPC ・手順 5 で作成したサブネットグループ
    パブリックアクセスなし
    VPC セキュリティグループ手順 4 で作成した rds-sg
    作成には数分かかる

    DB インスタンスの作成には数分かかります。ステータスが「利用可能」になるまで、他の作業を進めながら待ちましょう。

  7. 踏み台 EC2 に SSH でログインし、mysql クライアントをインストールする

    ローカルのターミナルから踏み台 EC2 にログインし、mysql クライアントをインストールします。

    ローカル → 踏み台 EC2
    # ローカルから踏み台 EC2 へ
    ssh -i my-key.pem ec2-user@<踏み台のパブリック IP>
    
    # 踏み台の中で、mysql クライアントをインストール(Amazon Linux の場合)
    sudo dnf install -y mariadb105
    MySQL 互換のクライアントを使う

    Amazon Linux では、MySQL と互換性のある MariaDB のクライアントパッケージに含まれる mysql コマンドを使って接続します。OS のバージョンによってパッケージ名が異なる場合があるため、見つからない場合はパッケージ名を確認してみてください。

  8. RDS のエンドポイントを使って接続する

    RDS コンソールの DB インスタンスの詳細から「エンドポイント」をコピーし、踏み台 EC2 の中から接続します。

    踏み台 EC2 の中で実行
    # RDS のエンドポイントを指定して接続(ユーザー名は作成時に設定したもの)
    mysql -h <RDS のエンドポイント> -u <ユーザー名> -p

    パスワードの入力を求められたら、DB インスタンス作成時に設定したパスワードを入力します。mysql> プロンプトが表示されれば接続成功です。

  9. データベース・テーブルを作成し、データの追加・取得を確認する

    接続できたら、データベースとテーブルを 1 つ作成し、データを追加・取得してみます。

    mysql プロンプトの中で実行
    -- データベースを作成して使用する(名前は自由、例: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 の結果に、追加した行が表示されれば成功です。

07 — Pitfalls

つまずきポイント

初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。

Pitfall 01 — EC2 から RDS に接続できない(タイムアウトする)

「mysql コマンドを実行しても、応答がないまま止まってしまう」

確認したい点がいくつかあります。①RDS のセキュリティグループのインバウンドルールが、踏み台 EC2 のセキュリティグループを正しく参照しているか②DB インスタンスのステータスがまだ「作成中」で利用可能になっていない可能性——のいずれかが多い原因です。順に見直してみましょう。

Pitfall 02 — DB サブネットグループの作成でエラーになる

「サブネットグループを保存しようとすると、エラーメッセージが表示される」

RDS の DB サブネットグループには、異なるアベイラビリティーゾーンに属するサブネットが 2 つ以上必要という制約があります。プライベートサブネットが 1 つのアベイラビリティーゾーンにしかない場合は、別のアベイラビリティーゾーンにもう 1 つ追加してみましょう。

08 — Checklist

完了チェック

要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。RDS コンソール・EC2 コンソール・ターミナルを順に確かめましょう。

  • RDS の DB インスタンスの一覧で、作成したインスタンスのステータスが「利用可能」になっている。
  • そのインスタンスの詳細画面で、パブリックアクセスが「なし」になっている。
  • 踏み台 EC2 に SSH でログインでき、そこから mysql コマンドで RDS のエンドポイントに接続できる。
  • 作成したテーブルが SHOW TABLES; の結果に表示される。
  • INSERT したデータが、SELECT * FROM items; の結果に表示される。
  • ローカルの端末から RDS のエンドポイントに直接 mysql で接続しようとすると、到達できない(プライベートサブネットに隠れていることの裏付け)。
09 — Think

考えてみよう

手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。

  1. RDS をパブリックアクセス可能にして直接インターネットから接続できるようにする方法と比べて、今回の構成はどんな点で安全でしょうか。
    ヒント
    パブリックアクセス可能にすると、世界中から接続を試行できる状態になり、ID・パスワードの推測やソフトウェアの脆弱性を狙った攻撃の対象になります。プライベートサブネットに置くことで、そもそも接続の経路自体を絶てる、という点に注目してみましょう。
  2. 踏み台 EC2 が停止していたら、RDS への接続はどうなるでしょうか。
    ヒント
    RDS 自体は動作を続けますが、接続できるのは同じ VPC 内のリソース経由だけです。踏み台 EC2 が停止していると、その経路が失われ、外部の端末からは接続できなくなります。「接続できないこと」自体は安全性の裏返しでもある、という視点で考えてみましょう。
  3. 複数のアプリケーションサーバーから同じ RDS に接続したい場合、セキュリティグループの設定はどう考えればよいでしょうか。
    ヒント
    サーバーが増えるたびに IP アドレスを 1 つずつ許可リストに追加していくのは管理が大変です。アプリケーションサーバーを共通のセキュリティグループに所属させ、RDS 側ではそのセキュリティグループからの接続を許可する、という形にしておくと管理がシンプルになります。
10 — Clean up

後片づけ

課金が大きい RDS から先に片づけましょう。次の順で進めます。

  1. RDS インスタンスを削除する:DB インスタンスを選び「アクション」→「削除」。削除時に最終スナップショットを作成するかどうかの選択があります。今後使う予定がなければ不要ですが、迷う場合は作成しておくと安心です。
  2. DB サブネットグループを削除する:RDS インスタンスの削除が完了したあとに削除します。
  3. EC2 を終了する:踏み台用に起動したインスタンスを選び「インスタンスの状態」→「インスタンスを終了」。
  4. セキュリティグループを削除する:踏み台用・RDS 用、それぞれこのハンズオン専用に作成したものを削除します。
Caution — 既存の VPC やデフォルトリソースは消さない

削除するのは、このハンズオンで自分が作ったものだけ

既存の VPC を利用した場合、VPC やサブネット自体は削除しないでください。デフォルト VPC やデフォルトのリソースも、他の用途で使われている可能性があるため削除しないようにしましょう。

コストに関する注意: RDS インスタンスは起動している時間に応じて料金が発生します。無料利用枠の対象となるインスタンスクラスがある場合がありますが、対象かどうかは事前に確認が必要です。EC2 インスタンス(踏み台用)の料金もかかります。VPC・サブネット・ルートテーブル・セキュリティグループ・DB サブネットグループ自体には料金はかかりません。検証が終わったら、上の「後片づけ」を参考にRDS インスタンスと EC2 インスタンスの両方を削除することをおすすめします。最新の料金は AWS の公式料金ページで確認してください。