Amazon Global Aurora PostgreSQL クラスターの使用

Amazon Global Aurora PostgreSQL クラスターは、シングルサイトまたはマルチサイト構成の Keycloak の基盤となるデータベースとして使用できます。現在、これは ROSA 上の Keycloak デプロイメントでのみサポートされています。

Aurora グローバルデータベースは複数の AWS リージョンにまたがり、AWS リージョン全体の停止からの災害復旧を可能にします。Aurora は、プライマリー AWS リージョンから各セカンダリーリージョンへのすべてのデータと更新のレプリケーションを自動的に処理します。

Aurora クラスターのデプロイ

Aurora クラスターは、次の環境変数を設定して ./provision/aws/rds/aurora_create_global_db.sh を実行することにより、複数の AWS リージョンにデプロイできます。

AURORA_GLOBAL_REGIONS= # A list of AWS regions for the Aurora cluster to span. The first region in the list is where the Primary cluster is hosted.
AURORA_GLOBAL_CLUSTER= # The name of the Global Aurora cluster
AURORA_INSTANCES= # The number of Aurora db instances to create in each region, defaults to 1.

これにより、リージョンごとに Aurora クラスターが作成され、それらがグローバル Aurora クラスター $AURORA_GLOBAL_CLUSTER に関連付けられます。スクリプトは、すべてのリージョンクラスターとそのインスタンスが利用可能になるまで待機してから戻ります。グローバルクラスターが既に存在する場合、これを示すメッセージが表示され、スクリプトは終了コード 1 で失敗します。

Aurora Global DB クラスターは、複数のリージョンクラスターで構成されており、各リージョンクラスターには専用の Writer および Reader エンドポイントがあります。これを抽象化するために、Keycloak インスタンスがデータベースへの接続に使用する必要がある Route53 CNAME エントリを作成します。Route53 エントリは、$AURORA_GLOBAL_CLUSTER.aurora-global.keycloak-benchmark.com で Aurora プライマリークラスターのライターエンドポイントを公開します。

前述の Route53 エントリがフェイルオーバー後のプライマリークラスターのライターエンドポイントを反映するようにするために、$AURORA_GLOBAL_REGIONS のそれぞれに AWS Lambda 関数をデプロイします。この関数は、新しいプライマリークラスターのリージョンでグローバルフェイルオーバーイベントが完了するとトリガーされ、最新のライターエンドポイントを指すように CNAME エントリを更新します。

指定された AURORA_GLOBAL_CLUSTER は、AWS アカウントごとに一意であり、「DB クラスター識別子」 に概説されている規約に従う必要があります。

ROSA クラスターと Aurora クラスターの接続

ROSA クラスターと個々の Aurora クラスターの間でピアリング接続を確立する必要があります。

このような接続を構成するには、次の環境変数を設定して ./provision/aws/rds/aurora_create_global_peering_connections.sh を実行します。

AURORA_GLOBAL_CLUSTER= # The name of the Global Aurora cluster
CLUSTER_NAME= # The name of the ROSA cluster to establish the peering connectin with

Keycloak のデプロイ

さまざまな task ファイルを介して Keycloak をデプロイする場合、正しい DB エンドポイントが構成されるように、次の環境変数を設定する必要があります。

AURORA_GLOBAL_CLUSTER= # The name of the Global Aurora cluster
KC_DATABASE_URL=$AURORA_GLOBAL_CLUSTER.aurora-global.keycloak-benchmark.com
KC_DATABASE=aurora-postgres

クラスターフェイルオーバーのシミュレーション

プライマリーからセカンダリー Aurora クラスターへのフェイルオーバーは、failover-global-cluster コマンドを実行することでトリガーできます。

aws rds failover-global-cluster \
  --global-cluster-identifier ${AURORA_GLOBAL_CLUSTER} \
  --target-db-cluster-identifier ${AURORA_CLUSTER_IDENTIFIER} \
  --allow-data-loss

ここで、AURORA_CLUSTER_IDENTIFIER は、プライマリーにしたいセカンダリークラスターの ARN です。次のコマンドは、グローバル Aurora クラスターのすべてのメンバーの ARN を出力します。

aws rds describe-global-clusters \
  --query "GlobalClusters[?GlobalClusterIdentifier=='${AURORA_GLOBAL_CLUSTER}'].GlobalClusterMembers[*].DBClusterArn"

ROSA クラスターと Aurora クラスターの切断

ROSA と Aurora VPC 間のピアリング接続を削除するには、次の環境変数を設定して ./provision/aws/rds/aurora_delete_global_peering_connection.sh を実行します。

AURORA_GLOBAL_CLUSTER= # The name of the Global Aurora cluster
CLUSTER_NAME= # The name of the ROSA cluster to remove the peering connection from

Aurora クラスターの削除

Aurora クラスターを削除する前に、ROSA クラスターと確立されたすべてのピアリング接続を削除する必要があります。

Aurora クラスターを削除するには、次の環境変数を設定して ./provision/aws/rds/aurora_delete_global_db.sh を実行します。

AURORA_GLOBAL_CLUSTER= # The name of the Global Aurora cluster