← ハンズオン一覧に戻る

AWS Hands-on / Database

ある時点の状態に、データベースを戻す

RDS のスナップショットを手動で取得し、そこから新しい DB インスタンスを復元します。「今の状態を保存しておき、必要になったらその時点に戻す」というバックアップ運用の基本を、実際にデータを変化させながら体験します。

● Lv.4 設計や運用を意識できる人 ⏱ 所要 50〜70 分 コンソール操作+コマンドラインからの SQL 実行
01 — Prerequisites

はじめる前に

  • 必須AWS アカウントを持っていること
  • 必須マネジメントコンソールにサインインできること
  • 必須RDS で DB インスタンスを作成した経験があること
  • 必須基本的な SQL の実行経験があること(INSERTSELECTDELETE
  • あると良い「バックアップ」「復元」という言葉のイメージがある

※ コンソール操作に加えて、ローカルのターミナルから mysql クライアントで SQL を実行します。RDS をパブリックアクセス可能にして、ローカルから直接接続します。

02 — References

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

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

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

03 — Background

背景・シナリオ

データを誤って削除してしまった、想定外の更新で内容が壊れてしまった——こうした事態は、運用していればいつか起こり得ます。そのときに備えて、データベースの状態をある時点で保存しておく「スナップショット」が役立ちます。

今回は手動でスナップショットを取得し、その後データを変化させてから、スナップショット取得時点の状態を持つ新しい DB インスタンスとして復元します。「保存しておいた時点に戻す」という、バックアップ運用のもっとも基本的な動きを、実際に手を動かして体験します。

スナップショットを取ったら、元のデータベースの今の状態も変わるの?

変わりません。スナップショットは「その時点のコピー」を別に保存するだけで、元のデータベースはそのまま動き続けます。

復元すると、元のデータベースの内容が書き換わるの?

いいえ。スナップショットからの復元は、元のインスタンスとは別の「新しい DB インスタンス」が作られます。元のインスタンスのデータが上書きされるわけではないので、両方を比較することもできます。

Goal

RDS for MySQL インスタンスを作成し、データを登録した状態でスナップショットを手動取得する。その後データを変更・削除し、スナップショットから新しい DB インスタンスを復元して、削除前の状態が復元先に残っていることを確認する。

04 — Architecture

つくる構成

データを登録 → スナップショットを取得 → データを削除 → スナップショットから復元、という 4 段階の流れで状態が変化していきます。それぞれの段階で「どちらのインスタンスがどんな状態か」を意識しながら進めましょう。

  1. 1

    データを登録する

    RDS for MySQL インスタンスにテーブルを作成し、データを 3 件以上 INSERT します。この時点では、まだスナップショットは存在しません。

  2. 2

    スナップショットを取得する(この時点の状態が保存される)

    手動でスナップショットを取得します。ここでデータベースの「今の状態」がコピーとして別に保存され、以後の変更とは無関係に残ります。

  3. 3

    データを削除する(元のインスタンスでは消える)

    元のインスタンスに対して DELETE を実行します。元のインスタンスでは、このデータは以後ずっと無くなったままです。一方、手順 2 で保存したスナップショットの中身はこの影響を受けません。

  4. 4

    スナップショットから復元する(新しいインスタンスに③の前の状態が残っている)

    スナップショットから新しい DB インスタンスを復元します。復元先には、手順 3 で削除するの状態(つまり手順 2 の時点の状態)がそのまま残っています。

元のインスタンスと復元先のインスタンスは、エンドポイント(接続先のアドレス)が異なる別々のインスタンスとして同時に存在します。
05 — Requirements

要件

以下の要件を満たす構成を作り、削除前の状態が復元先に残っていることを確認してください。

No要件
1リージョンは「東京(ap-northeast-1)」を使用する。
2RDS for MySQL インスタンスを1 つ作成する(パブリックアクセス「あり」、セキュリティグループのインバウンドはマイ IP のみ許可)。
3テーブルを1 つ作成し、データを3 件以上 INSERT する。
4このDB インスタンスの手動スナップショット1 つ取得する(スナップショット名は自由に決める)。
5スナップショット取得後にデータを1 件以上 DELETE し、そのスナップショットから新しい DB インスタンスを復元する。復元先に接続し、削除前の状態(削除したデータが残っている)になっていることを確認する。
06 — Steps

構築の進め方

「作る → 入れる → 保存する → 壊す → 戻す → 確かめる」という順番で進みます。各ステップで、自分がどちらのインスタンスを操作しているかを意識しましょう。

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

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

  2. RDS for MySQL インスタンスを作成する

    RDS コンソールの「データベースの作成」から、エンジンの種類で「MySQL」を選びます。次の点に注意して設定しましょう。

    DB インスタンス識別子自由に決める(例:snapshot-demo-db
    マスターユーザー名・パスワード自由に決める(忘れないようメモしておく)
    DB インスタンスクラス無料利用枠の対象、または検証用の小さいクラスを選ぶ
    パブリックアクセスあり
    VPC セキュリティグループ新規作成し、インバウンドで MySQL/Aurora(3306)をマイ IP のみから許可
    なぜパブリックアクセス「あり」にするの?

    今回はローカルのターミナルから直接 mysql クライアントで接続して SQL を実行するため、パブリックアクセスを有効にします。インバウンドをマイ IP のみに絞ることで、自分の接続元以外からはアクセスできない状態にしています。

  3. mysql クライアントから接続し、テーブルを作成してデータを登録する

    DB インスタンスのステータスが「利用可能」になったら、エンドポイント(接続先のアドレス)を確認し、ローカルのターミナルから接続します。

    ターミナル — 接続とデータ登録
    # 元のインスタンスのエンドポイントへ接続する
    mysql -h <元のインスタンスのエンドポイント> -u <マスターユーザー名> -p
    
    -- テーブルを作成し、データを3件以上登録する(例)
    CREATE DATABASE demo;
    USE demo;
    CREATE TABLE notes (id INT PRIMARY KEY, content VARCHAR(100));
    INSERT INTO notes VALUES (1, '1件目のメモ');
    INSERT INTO notes VALUES (2, '2件目のメモ');
    INSERT INTO notes VALUES (3, '3件目のメモ');
    SELECT * FROM notes;
    テーブル名・内容は自由

    テーブル名や列構成、登録する内容は自由に決めて構いません。あとで「削除前の状態に戻っているか」を見比べやすいよう、内容が分かりやすいものにしておくと確認がしやすくなります。

  4. このDB インスタンスのスナップショットを取得する

    RDS コンソールで対象の DB インスタンスを選び、「アクション」→「スナップショットの取得」を行います。スナップショット名は自由に決めます(例:snapshot-demo-db-before-delete)。

    この時点の状態が保存される

    スナップショットの取得が完了すると、手順 3 で登録したデータを含む「今の状態」が、元のインスタンスとは別にコピーとして保存されます。この後、元のインスタンスでどんな変更が起きても、保存されたスナップショットの内容は変わりません。

  5. スナップショットのステータスが「利用可能」になったら、データを削除する

    スナップショットの一覧でステータスが「利用可能」になったことを確認したら、再度 mysql クライアントから元のインスタンスに接続し、登録したデータのうち 1 件以上を DELETE します。

    ターミナル — データの削除
    -- 元のインスタンスに接続したまま、1件以上削除する(例)
    DELETE FROM notes WHERE id = 1;
    SELECT * FROM notes;
    -- → id=1 の行が無くなっていることを確認
  6. スナップショットから新しい DB インスタンスを復元する

    「スナップショット」の一覧から手順 4 で取得したスナップショットを選び、「アクション」→「スナップショットを復元」します。次の点を設定します。

    新しい DB インスタンス識別子自由に決める(例:snapshot-demo-db-restored)。元のインスタンスとは別の名前になる
    パブリックアクセスあり
    VPC セキュリティグループ元のインスタンスと同様の設定にする(手順 2 で作成したセキュリティグループ、または同等の設定)
    復元先は「別の新しいインスタンス」

    復元によって作られるのは、元のインスタンスとは独立した新しい DB インスタンスです。元のインスタンスは何も変更されず、削除したデータも削除されたままです。

  7. 復元先のDB インスタンスのステータスが「利用可能」になるまで待つ

    復元には数分かかります。RDS コンソールの一覧で、復元先のインスタンスのステータスが「利用可能」になるまで待ちましょう。

  8. 復元先へ接続し、削除前の状態が残っていることを確認する

    復元先のDB インスタンスのエンドポイントを確認し、mysql クライアントから接続します。手順 5 で削除したはずのデータが残っていることを確認します。あわせて、元のインスタンスでは削除されたままであることも見比べておきましょう。

    ターミナル — 復元先での確認
    # 復元先のエンドポイントへ接続する(元のインスタンスとはアドレスが異なる)
    mysql -h <復元先のエンドポイント> -u <マスターユーザー名> -p
    
    USE demo;
    SELECT * FROM notes;
    -- → id=1 を含む、削除前の3件すべてが残っていることを確認
    2つのエンドポイントを見比べる

    同じ SELECT 文を、元のインスタンスと復元先のインスタンスそれぞれに対して実行し、結果が異なることを確認すると、「スナップショット取得時点に戻っている」ことがより実感できます。

07 — Pitfalls

つまずきポイント

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

Pitfall 01 — 復元したDB インスタンスに接続できない

「復元先のエンドポイントに mysql クライアントで接続できない」

復元時に、セキュリティグループの設定が元のインスタンスと同じように引き継がれない場合があります。復元先に割り当てられているセキュリティグループを確認し、元のインスタンスと同じ(またはマイ IP からの 3306 番ポートを許可する同等の)設定になっているかを見直しましょう。パブリックアクセスの設定も合わせて確認してください。

Pitfall 02 — 復元先と元のインスタンスを見間違える

「どちらに接続しているのか分からなくなる」

元のインスタンスと復元先のインスタンスは、見た目が似た設定の別々のインスタンスです。エンドポイントのアドレスは必ず異なります。接続するたびに、自分がどちらのエンドポイントを指定しているかを確認する習慣をつけましょう。

08 — Checklist

完了チェック

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

  • 「スナップショット」の一覧で、手動取得したスナップショットのステータスが「利用可能」になっている。
  • 「データベース」の一覧に、復元先の DB インスタンスが新しい識別子で表示されている。
  • 元のインスタンスに接続して SELECT すると、該当データが削除されたままになっている。
  • 復元先のインスタンスに接続して SELECT すると、削除前のデータが残っている
  • 元のインスタンスと復元先のインスタンスのエンドポイントが、それぞれ異なるアドレスになっている。
09 — Think

考えてみよう

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

  1. 自動バックアップ(毎日決まった時間に自動で取得される)と、今回行った手動スナップショットでは、それぞれどんな場面で使い分けるとよさそうでしょうか。
    ヒント
    自動バックアップは「いつ問題が起きるか分からない」日常的な備えに向いています。一方、手動スナップショットは「これから大きな変更をする直前」など、特定のタイミングの状態を確実に残したい場面に向いています。両者の取得タイミングの違いから考えてみましょう。
  2. 復元先の DB インスタンスは「別の新しいインスタンス」として作られることは、運用上どんな利点と、どんな注意点があるでしょうか。
    ヒント
    利点としては、元のインスタンスを止めずに、復元先の内容を確認したり比較したりできる点があります。注意点としては、復元先・元のインスタンスの両方が同時に稼働するため、エンドポイントを混同しないようにする必要があることや、不要になったら両方を片づける必要があることが挙げられます。
  3. スナップショットを取得する頻度を増やすと、復元できる状態の選択肢は増えますが、何かトレードオフはあるでしょうか。
    ヒント
    スナップショットはストレージに保存されるため、数や保持期間が増えるほど保存にかかる料金が増えます。また、取得や復元には時間がかかるため、頻度を増やすことと運用の手間・コストのバランスを考える必要があります。
10 — Clean up

後片づけ

今回は元のインスタンス・復元先のインスタンス・スナップショットの3 つが残っています。次の順番で片づけましょう。

  1. 復元先の DB インスタンスを削除する:「データベース」一覧から復元先のインスタンス(例:snapshot-demo-db-restored)を選び、削除します。
  2. 元のDB インスタンスを削除する:「データベース」一覧から元のインスタンス(例:snapshot-demo-db)を選び、削除します。削除時に「最終スナップショットを作成するか」を選べますが、これ以上スナップショットを残す必要がなければ作成しない選択もできます(必要であれば作成してください)。
  3. 手動で取得したスナップショットを削除する:「スナップショット」一覧から、手順 4 で取得したスナップショット(および手順 2 で「最終スナップショット」を作成した場合はそれも)を選び、削除します。
  4. セキュリティグループを削除する:EC2 コンソールの「セキュリティグループ」から、今回作成したものを選び、削除します(他で使っていないことを確認してから)。
Caution — 必要なスナップショットを誤って削除しない

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

スナップショットは一度削除すると元に戻せません。一覧に他の検証で作成したスナップショットが並んでいる場合は、このハンズオンのために付けた名前のものだけを選んで削除してください。

コストに関する注意: このハンズオンでは、元のインスタンスと復元先のインスタンスという 2 台の RDS インスタンスが同時に稼働する時間が発生するため、その分の料金がかかります。また、手動で取得したスナップショットの保存にもストレージ料金がかかります。検証が終わったら、上の「後片づけ」の手順に沿って、インスタンス・スナップショットともに削除することを忘れないようにしましょう。VPC・セキュリティグループ自体には料金はかかりません。最新の料金は AWS の公式料金ページで確認してください。