こんにちは、クラウドインテグレーション事業部の佐藤優太です。

本記事はアイレット25卒社員によるAWSブログリレーのAmazon RDS編です。

執筆にあたり、Japan AWS Top Engineers であるクラウドインテグレーション事業部 ソリューション開発セクション 畠山 大治さんに監修いただきました。

はじめに

RDSインスタンスをVPC内の特定のサブネットに設置したい場合、

DBサブネットグループをあらかじめ指定し、特定の VPC を指定する

という方法が一般的です。

しかし、DBサブネットグループをデフォルトのまま作成してしまい、作成後に変更をしたいというケースもあるかと思います(社内で用意されている新卒トレーニングでの自分がまさにそれでした)。

RDSインスタンスを配置するサブネットを間違えた時の対処法としては、下記のような方法があります。

  1. DB スナップショットからの Amazon RDS DB インスタンスの復元
  2. RDSインスタンスの再作成
  3. マルチAZ構成のオン/オフを繰り返し、スタンバイインスタンスを削除して使用していたサブネットを空ける

本記事では、RDSの重要な機能である「マルチ AZ 配置」と「DBサブネットグループ」について説明した上で、『3.マルチAZ構成のオン/オフを繰り返し、スタンバイインスタンスを削除して使用していたサブネットを空ける』方法について説明します。

マルチ AZ 配置

マルチAZ配置とは、DBインスタンスを複数のアベイラビリティゾーン(AZ)で実行するためのオプション機能です。

この機能を有効にすると、プライマリDBインスタンスとは別のAZに、予備のスタンバイDBインスタンスを作成・管理してくれます。プライマリインスタンスのデータは、常にこのスタンバイインスタンスへコピー(レプリケート)されます。

マルチAZ配置のメリット

  • データの冗長性と障害時の自動切り替え(フェイルオーバー)
    万が一の障害発生時も、データを失うことなく運用を継続できます。
  • I/Oフリーズの回避
    データベースへの書き込みなどが一時的に停止する現象を防ぎます。
  • バックアップ中のパフォーマンス低下を最小化
    システムバックアップ取得時に発生しがちな遅延を抑えられます。
  • 読み込み負荷の分散
    (マルチAZ DBクラスターの場合)スタンバイインスタンスも読み込み処理を行えるため、データベースの負荷を分散できます。

【補足】マルチAZとリードレプリカについて
マルチAZとリードレプリカの主な違いは、利用目的にあります。
マルチAZは高可用性の実現、リードレプリカは読み取り性能の向上を目的としています。

参考:Amazon Relational Database Service (Amazon RDS) とは

DBサブネットグループ

DBサブネットグループとは、VPC内に作成したサブネット(通常はプライベート)の集まりのことで、RDSのDBインスタンスをどこに配置するかを指定するために使います。

DBインスタンスを作成する際には、このサブネットグループを選択する必要があります。するとRDSは、そのグループの中から最適なサブネットとIPアドレスを自動で選び出し、DBインスタンスを配置します。

主な役割と要件

  • 配置場所の指定
    DBインスタンスを起動するVPC内のサブネットを指定します。これにより、セキュリティや運用ルールに基づいてリソースをグループ化できます。
  • 高可用性の確保
    各DBサブネットグループには、最低2つ以上のアベイラビリティゾーン(AZ)にまたがるサブネットを含める必要があります。これは、障害発生時に別のアベイラビリティゾーンで新しいスタンバイインスタンスを起動できるようにするためです(マルチAZフェイルオーバー)。
  • パブリック/プライベート接続の制御
    グループ内のサブネットがすべてパブリックであればDBインスタンスを外部からアクセス可能にできますが、通常はセキュリティのためにプライベートサブネットを使用します。

参考:VPC 内の DB インスタンスの使用

(ここから本題)RDSインスタンスを配置するサブネットを間違えた時の対処法

現状の整理

  • サブネットグループを作成せず、デフォルトのままRDSインスタンスを作成してしまった
  • RDSインスタンスは、セキュリティの観点からインターネットから直接アクセスできないプライベートサブネットに配置したい
  • RDSインスタンスは再作成せずに、既存インスタンスを移動したい

作業の概略

  1. デフォルトのサブネットグループから不要なサブネットを削除
  2. 作成済RDSインスタンスのマルチAZ配置をオフ
  3. サブネットグループから、スタンバイインスタンスのあったサブネットを削除
  4. マルチAZ配置をオンにして再起動
  5. マルチAZ配置をオフにし、サブネットグループから不要なサブネットを削除
  6. マルチAZ配置をオン

目指す構成
RDSインスタンスはセキュリティの観点から、プライベートサブネットに配置したい

本記事での構成は、社内で用意されている新卒トレーニングで使用した下図の3層構造を元にしています。
Protected Subnetは、EC2インスタンスをインターネットから直接アクセスできないように隔離し、セキュリティを強化することを目的としています。

作業1:デフォルトのサブネットグループから不要なサブネットを削除

※移動したい先のサブネットは残す
※インスタンスのあるサブネットは削除できない

サブネットグループ名をコピーし、サブネットグループに移動

対象のサブネットグループを指定し、『編集』を押下

プライベートサブネットを残し、削除可能な2つのサブネットの選択を解除

サブネットグループの変更が完了

作業1終了時点での構成
サブネットグループから2つのサブネットを削除した状態

作業2:作成済RDSインスタンスのマルチAZ配置をオフ

対象インスタンスを選択し、変更から可用性と耐久性の項目へ移動
スタンバイインスタンスを作成しないでくださいを選択

変更のスケジュールすぐに適用にチェックして、DBインスタンスを変更を押下

作業2終了時点での構成
スタンバイインスタンスを削除した状態

作業3:サブネットグループから、スタンバイインスタンスのあったサブネットを削除

削除手順は1と同様。public-aが削除可能

作業3終了時点での構成
サブネットグループから1つのサブネットを削除した状態

作業4:マルチAZ配置をオンにして再起動

対象インスタンスを選択し、『変更』から『可用性と耐久性』の項目へ移動

スタンバイインスタンスを作成する(本番稼働環境向けに推奨)』を選択

変更のスケジュール』で、『すぐに適用』を押下

続いて、スタンバイインスタンスからの再起動を行う
対象インスタンスを選択し、『アクション』から『再起動』の項目へ移動

『フェイルオーバーで再起動しますか?』にチェックを入れて再起動

作業4終了時点での構成
前半の作業でプライベートサブネットにスタンバイインスタンスが作成され、後半の作業でプライベートサブネットのインスタンスがプライマリインスタンスになった状態

作業5:マルチAZ配置をオフにし、サブネットグループから不要なサブネットを削除

作業内容は過去の手順と重複するため、省略
サブネットグループをプライベートサブネットのみに変更することができた

作業5終了時点での構成

作業6:マルチAZ配置をオン

サブネットグループの設定は完了しているため、マルチAZ配置をオンにすることで作業は完了

おわりに

本記事でのまとめとしては、

  • マルチAZ配置のオンオフ
  • フェイルオーバーからの再起動

この2点を組み合わせることで、RDSインスタンスを配置するサブネットを移動することができます。

また、作業において重要なのは、プライマリインスタンスとスタンバイインスタンスがどのサブネットに存在しているかを把握することです。
どのように動作するかを理解することで、様々なケースに対応できると思います。

ただし、記事冒頭でも触れたように、再起動を繰り返すこの方法にはかなりの時間がかかります。

そのため、DBサブネットグループを作成した上でRDSインスタンスの再作成を行うか、既存インスタンスを移動するのか、については作業前に考慮する必要があります。

本記事が、トラブルシューティングの一助となれば幸いです。
最後までお読みいただき、ありがとうございました。

また、Amazon RDSについて同じく25卒社員の梅田 芳護さんも公開予定ですのでこちらも是非お読みください!
AWSブログリレー:RDS(ローカルから踏み台EC2経由でDBにログインしてみた)

記事作成にあたっての参考
Amazon RDS DB インスタンスをパブリックサブネットから同じ VPC 内のプライベートサブネットに移動する方法を教えてください。