Loading
BLOG 開発者ブログ

2025年7月17日

[Amazon Aurora]Global DatabaseをAPIでスイッチオーバーしてみる


Amazon AuroraのGlobal Databaseには障害発生時のフェイルオーバーだけでなく、計画的にライター(Write)インスタンスをセカンダリリージョンに切り替えるスイッチオーバーが存在します。
スイッチオーバーを使用すると、計画的な切り替えテストだけでなく、システム全体に影響するような障害を検知し、事前にセカンダリリージョンに切り替えるといった用途で使用可能です。

目次

 

はじめに

こんにちは。
クラウドソリューション第二グループのimai.kです。

今回は、Amazon Aurora Global DatabaseのスイッチオーバーをAPIから実行してみたいと思います。

早速

早速ですが、Lambda(JavaScript)からRDSのAPIを実行する前提で、スイッチオーバーを実行してみたいと思います。
なお、事前にGlobal Databaseが構築済みで、プライマリー・セカンダリリージョンでそれぞれクラスターが動作しているものとします。

import { RDSClient, SwitchoverGlobalClusterCommand } from "@aws-sdk/client-rds";

const GLOBAL_CLUSTER_IDENTIFIER = {任意のクラスター名};
const TARGET_CLUSTER_ARN = {スイッチオーバー先のクラスターARN};

const rdsClient = new RDSClient({ region: process.env.AWS_REGION });

const switchCmd = new SwitchoverGlobalClusterCommand({
  GlobalClusterIdentifier: GLOBAL_CLUSTER_IDENTIFIER,
  TargetDbClusterIdentifier: TARGET_CLUSTER_ARN,
});

const switchCmdResult = await rdsClient.send(switchCmd);

以上です。非常に簡単でした。

これだけだと味気ないので、スイッチオーバー実行について、二点気を付けるポイントを紹介したいと思います。

ポイント1

スイッチオーバーは、スイッチオーバー元のリージョンから実行する必要があります。
そのため、例えば大阪リージョン(ap-northeast-3)から東京リージョン(ap-northeast-1)に切り替える場合、
先ほどのコードの場合、RDSClientを生成する際に、’ap-northeast-3’を指定する必要があります。

ポイント2

SwitchoverGlobalClusterCommandの実行は、あくまで「スイッチオーバーを開始してください」という指示を出すところまでです。
そのため、スイッチオーバーが完了しているか正確に把握することには、ワークアラウンド的なアプローチが必要です。

一例ですが、「リーダーインスタンスがどちらのリージョンにあるか」を定期的にチェックすることで、ある程度判別可能だと考えました。
以下に、サンプルコードを記載しておこうと思います。

import { RDSClient, DescribeGlobalClustersCommand, SwitchoverGlobalClusterCommand } from "@aws-sdk/client-rds";

const GLOBAL_CLUSTER_IDENTIFIER = {任意のクラスター名};
const TARGET_CLUSTER_ARN = {スイッチオーバー先のクラスターARN};

const rdsClient = new RDSClient({ region: process.env.AWS_REGION });

const switchCmd = new SwitchoverGlobalClusterCommand({
  GlobalClusterIdentifier: GLOBAL_CLUSTER_IDENTIFIER,
  TargetDbClusterIdentifier: TARGET_CLUSTER_ARN,
});

const switchCmdResult = await rdsClient.send(switchCmd);

const describeCmd = new DescribeGlobalClustersCommand({
  GlobalClusterIdentifier: GLOBAL_CLUSTER_IDENTIFIER,
});

const intervalId = setInterval(() => {
  const describeCmdResult = await rdsClient.send(describeCmd);
  const globalCluster = describeCmdResult.GlobalClusters?.[0];
  // グローバルクラスターからライターインスタンスを取得する
  const writerInstance = globalCluster.GlobalClusterMembers.find(
    (member) => member.IsWriter
  );

  // ライターインスタンスのARNを取得し、スイッチオーバー元のリージョン文字列が含まれていなければ完了とみなす
  if (!writerInstance.DBClusterArn.includes(process.env.AWS_REGION)) {
    clearInterval(intervalId);
  }
}, intervalSeconds * 10000);

さいごに

改めて、APIからAurora Global Databaseのスイッチオーバーを試してみました。
簡素な内容ではありますが、誰かのためになれば嬉しいです。

以上です。


imai.kのブログ