🖥

AWS RDS でデータベースのバックアップ(スナップショット)からデータを復元してアプリケーションから接続する

2024/07/12に公開

STEP 1. DBスナップショットでバックアップを作っておく

( 自動バックアップから復元したり「特定時点への復元」をする場合はこの手順は不要 )

  • DBクラスタを選ぶ
  • てきとうな名前をつけてスナップショットを作成する

CleanShot 2024-07-01 at 11 24 50@2x

STEP2. 復元する

仕組み

AWS RDS の仕組みとして、復元操作をしても元となったDBの状態が上書きされるわけではなく、いったん別のDBクラスタが作成される。

このため、この復元操作以外にも作業が必要だが、それは次の STEP 3で説明する。

方法A. 手動スナップショットからの復元

注意

元のスナップショットから全ての設定を復元してくれるわけではなく

  • セキュリティグループの設定
  • スペックの設定

など、選び直さなければばいけないものもあるので、注意して適切なものを選び直す

既存DBクラスタ・インスタンスの設定と見比べてから復元した方が良いかもしれない

手順

  • スナップショットを選んで復元する
  • 適当なRDSクラスタ名をつけて復元する ( ここでは例として recover という名前を付けたこととする )

方法B. 特定地点からの復元

  • 日時を選んで復元できる
  • 手動でバックアップしていなくても復元できるし、復元したいポイントが日時で分かっている場合は非常に助かる
  • 手動での復元とは違って、セキュリティグループやスペックも当時のまま保持してくれているようだ

STEP 3. アプリケーション 対 DB 間の接続の調整

何らかの形で、アプリケーションが復旧後のDBに紐付くエンドポイントを参照するようにする。

方法A - アプリケーションが参照するDBエンドポイントを変更する

DB復元後に生成されたクラスタ、インスタンス、DBエンドポイントをそのままアプリケーションから利用する方法。

この方法ではDB切断が発生しない。

まずはアプリケーションが接続するDBエンドポイントを、復元後のDBのものに差し替える。

たとえば

  • BEFORE now.cluster-*********.<region>.rds.amazonaws.com
  • AFTER recover.cluster-*********.<region>.rds.amazonaws.com

のように変更する。

アプリケーションの構成やデプロイの仕組みにもよるかもしれないが、この場合はアプリケーションの再デプロイ / 再起動などが必要なはずだ。なので必要があればアプリケーションの再デプロイ / 再起動をする。

ただし Terraform で AWS構築をしている場合など、RDS設定とインフラコードに差分が生じてしまう場合は、インフラコードでもつじつまを合わせるための調整が必要になる。

方法B - AWS で DBエンドポイントを差し替える

AWS RDS でDBの「クラスタ識別子」(またはインスタンス識別子)の命名を付け直すことで、DBに紐づくエンドポイントも入れ替えることが出来て、正しい状態に戻せる。

「アプリケーションの接続先のDBエンドポイントのパス」自体は変えずに、DBエンドポイント 対 DB の対応を変える方法。

ただしこの場合、DBクラスタ識別子を変更している最中には「アプリケーションからの接続先のDBエンドポイントが存在しない時間」が発生してしまい、DBの切断が発生する。

手順

たとえば RDSの DB クラスター識別子が次の命名だった場合

  • now (以前から利用していたクラスター識別子)
  • recover (バックアップから復元したクラスター識別子)

次のように名前をつけ直せば、

  • now -> old
  • recover -> now

DBエンドポイントもそれぞれ以下のように変わる

  • now.cluster-*********.<region>.rds.amazonaws.com
  • old.cluster-*********.<region>.rds.amazonaws.com

すなわち、以前から利用していたDBエンドポイントのパス自体は変えずに、DBを復元後の状態に入れ替えることができる

この方法ではアプリケーションの再デプロイは必要ない

NOTE

アプリケーションが「インスタンス識別子を使ったDBエンドポイント」を利用している場合は、インスタンス識別子の方を変更する必要がある

  • DBクラスタ識別子 のエンドポイントの例: db.cluster-********.<region>.rds.amazonaws.com
  • DBインスタンス識別子のエンドポイントの例: db.********.<region>.rds.amazonaws.com

STEP 4. 復元前のRDSクラスタ・インスタンスを削除する

  • DBが起動したままだとかなりお金がかかるので、きちんと削除する。
  • 削除保護を無効化してから削除しよう。

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

プロフィール・経歴

https://github.com/YumaInaura/YumaInaura

公開日時

2024-07-02

https://qiita.com/YumaInaura/items/c896dae7ac08b96228e6

Discussion