[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のスイッチオーバーを試してみました。
簡素な内容ではありますが、誰かのためになれば嬉しいです。
以上です。