[AWS CDK] Aurora PostgreSQL 15.2 の Aurora Global Database を作ってみた

Aurora PostgreSQL 15.2 の Global Databaseは作成できる
2023.06.30

Aurora PostgreSQL 15.2のAurora Global Databaseは作れるのかな

こんにちは、のんピ(@non____97)です。

皆さんはAurora PostgreSQL 15.2のAurora Global Databaseは作れるのか気になったことはありますか? 私はあります。

AWS公式ドキュメントにはAurora PostgreSQL による Aurora Global Databaseが使用可能なリージョンとエンジンのバージョンは以下と記載がありました。

リージョン Aurora PostgreSQL 14 Aurora PostgreSQL 13 Aurora PostgreSQL 12 Aurora PostgreSQL 11
米国東部 (オハイオ) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
米国東部 (バージニア北部) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
米国西部 (北カリフォルニア) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
米国西部 (オレゴン) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
アフリカ (ケープタウン) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
アジアパシフィック (香港) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
アジアパシフィック (ハイデラバード) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
アジアパシフィック (ジャカルタ) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
アジアパシフィック (メルボルン) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
アジアパシフィック (ムンバイ) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
アジアパシフィック (大阪) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
アジアパシフィック (ソウル) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
アジアパシフィック (シンガポール) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
アジアパシフィック (シドニー) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
アジアパシフィック (東京) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
カナダ (中部) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
中国 (北京) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
中国 (寧夏) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
欧州 (フランクフルト) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
欧州 (アイルランド) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
欧州 (ロンドン) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
欧州 (ミラノ) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
欧州 (パリ) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
欧州 (スペイン) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
欧州 (ストックホルム) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
欧州 (チューリッヒ) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
中東 (バーレーン) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
中東 (アラブ首長国連邦) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
南米 (サンパウロ) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
AWS GovCloud (米国東部) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降
AWS GovCloud (米国西部) バージョン 14.3 以降 バージョン 13.4 以降 バージョン 12.8 以降 バージョン 11.9 とバージョン 11.13 以降

抜粋 : Aurora Global Database - Amazon Aurora

Aurora PostgreSQL 15についての言及はありませんね。

一方で、マネジメントコンソールからAurora PostgreSQLの利用可能なバージョンを確認すると、15.2 (グローバル互換)と表記がありました。

グローバルデータベースでプロビジョニング済み

どちらを信じたら良いのでしょう。

悩んでも時間がもったいないので実際にAurora PostgreSQL 15.2のGlobal Databaseを作ります。

いきなりまとめ

  • Aurora PostgreSQL 15.2のGlobal Databaseは作成可能
  • 計画的フェイルオーバーも可能
  • Global Databaseを作成する際は以下に注意
    • Secrets Managerとの統合をしている場合、Global Databaseに登録できない
    • db.t4g.medium などt系のインスタンスクラスは、Global Databaseで使用できない
    • セカンダリクラスター作成時はKMSキーを明示的に指定する必要がある
  • aws rds describe-orderable-db-instance-optionsでAurora Global Databaseに対応しているDBエンジンやインスタンスクラスを確認することも可能

検証環境

検証環境は以下の通りです。

Aurora PostgreSQL 15.2 の Global Database を作ってみた検証環境構成図

Aurora PostgreSQL 15.2のGlobal Databaseを作成します。プライマリはus-east-1、セカンダリはus-east-2としています。

環境はAWS CDKでデプロイしました。使用したコードは以下リポジトリに保存しています。

やってみた

Global Databaseの作成

それでは実際にやってみます。

まず、プライマリリージョンであるus-east-1からデプロイします。

デプロイ後のAurora DBクラスターを確認すると、以下のようにプライマリクラスターとしてGlobal Databaseに登録されていました。

Global Databaseの作成

そのままセカンダリリージョンであるus-east-2でもデプロイします。

デプロイ後のAurora DBクラスターを確認すると、以下のようにセカンダリリージョンのDBクラスターもセカンダリクラスターとしてGlobal Databaseに登録されていました。

Global Database

セカンダリクラスターのエンドポイントを確認すると、クラスターエンドポイントがinactiveになっていますね。

クラスターエンドポイントがinactiveになっている

また、Global Databaseの詳細を確認すると、しっかりエンジンバージョンは15.2となっていました。

Global Databaseの詳細

Aurora PostgreSQL 15.2のGlobal Databaseも問題なく作成できますね。

つまづいたポイント

つまづいたポイントは以下3つです。

  1. Secrets Managerとの統合をしている場合、Global Databaseに登録できない
  2. db.t4g.medium などt系のインスタンスクラスは、Global Databaseで使用できない
  3. セカンダリクラスター作成時はKMSキーを明示的に指定する必要がある

Secrets Managerとの統合をしている場合、Global Databaseに登録できない

Secrets Managerとの統合をしているAurora DBクラスターをGlobal Databaseに登録しようとすると、Secrets Manager は、グローバルクラスターの作成機能をサポートしていません。この DB インスタンスにグローバルクラスターを作成するには、まず、この DB インスタンスを変更して Secrets Manager の統合をオフにする必要があります。と言うメッセージが出力されます。

Secrets Manager は、グローバルクラスターの作成機能をサポートしていません。

そのため、Lambda関数を使わずにマスターユーザーのパスワードをローテーションさせることはできません。

db.t4g.medium などt系のインスタンスクラスは、Global Databaseで使用できない

AWS公式ドキュメントにはDBインスタンスクラスについて、以下のような記載があります。

DB インスタンスクラスの要件-Aurora Global Database には、メモリを大量に消費するアプリケーションに最適化された DB インスタンスクラスが必要です。メモリ最適化 DB インスタンスクラスの詳細については、DB インスタンスクラスを参照してください。db.r5 以上のインスタンスクラスを使用することを推奨します。

Amazon Aurora Global Database のスタート方法 - Amazon Aurora

「あくまで推奨であって、db.t4g.medium でも問題なく使えるでしょ!」と思いましたが、デプロイしようとすると以下のように「Global Databaseでは db.t4g.medium はサポートしていないぞ」とエラーが出力されます。

16:50:46 | CREATE_FAILED        | AWS::RDS::GlobalCluster                     | GlobalDatabase
Resource handler returned message: "Instance db-instance has an instance class that is not supported by Global Databa
ses: db.t4g.medium (Service: Rds, Status Code: 400, Request ID: 30477de2-fcb1-4016-9a8a-9237ecf80b3a)" (RequestToken: d
5d3011d-7a08-50e1-b150-1598a1384684, HandlerErrorCode: InvalidRequest)

db.t4g.medium だけでなく、 db.t4g.large を指定した際もThe requested instance class is not supported by global databases- db.t4g.largeと怒られたので、t系のインスタンスクラスはGlobal Databaseで使用することはできないようです。

The requested instance class is not supported by global databases- db.t4g.large

ちなみにプライマリクラスターだけでなく、セカンダリクラスターのDBインスタンスでも同様に db.t4g.medium、db.t4g.large を指定すると怒られました。

対応として今回はAurora Serverless v2を使用しました。

セカンダリクラスター作成時はKMSキーを明示的に指定する必要がある

プライマリクラスターを作成する際はKMSキーを明示的に指定する必要はありませんが、セカンダリクラスター作成時には明示的に指定する必要があります。

指定しない場合は以下のような「KMSキーを指定しろ」と言うエラーが出力されます。

17:49:51 | CREATE_FAILED        | AWS::rds::DBCluster                         | Aurora2CBAB212
Resource handler returned message: "For encrypted cross-region replica, kmsKeyId should be explicitly specified (Servic
e: Rds, Status Code: 400, Request ID: 036553ec-ea36-4071-8a58-700c1e7285f8)" (RequestToken: ee52eafe-e76b-4c0b-2a94-f3b
118bec122, HandlerErrorCode: InvalidRequest)

対応として以下のようにKMSキーを指定してあげましょう。

今回はAWSマネージドのKMSキーalias/aws/rdsを指定しました。

./lib/constructs/aurora.ts

      storageEncryptionKey: cdk.aws_kms.Alias.fromAliasName(
        this,
        "DefaultRdsKey",
        "alias/aws/rds"
      ),

なお、上述のcdk.aws_kms.Alias.fromAliasName()cdk synthの際に本当に該当のエイリアスのKMSキーがあるのかチェックしません。

一方で、以下のcdk.aws_kms.Key.fromLookup()cdk synthの際に指定したエイリアスのKMSキーがあるのかチェックします。

      storageEncryptionKey: cdk.aws_kms.Key.fromLookup(this, "DefaultRdsKey", {
        aliasName: "alias/aws/rds",
      }),

KMSキーが存在しない場合、以下のようなエラーを出力します。

[Error at /AuroraSecondaryStack/Aurora] Could not find any key with alias named alias/aws/rds

Found errors

事前にチェックしてくれるのはありがたいですが、初めてそのリージョンにリソースをデプロイする時などAWSマネージドキーがまだ存在しない場合は使いにくいです。

状況に応じて使い分けましょう。

レプリケーションされているかの確認

それでは実際にストレージがレプリケーションされており、プライマリクラスターで書き込んだ内容がセカンダリクラスターで取得できるか確認します。

まず、プライマリクラスターに接続します。

# 認証情報の取得
$ get_secrets_value=$(aws secretsmanager get-secret-value \
    --secret-id AuroraSecret7ACECA7F-EZlGncuM4Jsv \
    --region us-east-1 \
    | jq -r .SecretString)

# 環境変数に埋め込み
$ export PGHOST=$(echo "${get_secrets_value}" | jq -r .host)
$ export PGPORT=$(echo "${get_secrets_value}" | jq -r .port)
$ export PGDATABASE=$(echo "${get_secrets_value}" | jq -r .dbname)
$ export PGUSER=$(echo "${get_secrets_value}" | jq -r .username)
$ export PGPASSWORD=$(echo "${get_secrets_value}" | jq -r .password)

# プライマリクラスターへの接続
$ psql
psql (15.0, server 15.2)
SSL connection (protocol: TLSv1.2, cipher: AES256-GCM-SHA384, compression: off)
Type "help" for help.

testDB=>

接続完了後、テーブルを適当に作成します。

# テーブルが存在しないことを確認
testDB=> \dt
Did not find any relations.

# テーブルの作成
testDB=> CREATE TABLE test (
  id integer,
  name varchar(10)
);
CREATE TABLE

# テーブルが作成できたことを確認
testDB=> \dt
        List of relations
 Schema | Name | Type  |  Owner
--------+------+-------+----------
 public | test | table | postgres
(1 row)

次に、セカンダリクラスターに接続します。

試しにinactiveになっているクラスターエンドポイントを指定してみます。

$ get_secrets_value=$(aws secretsmanager get-secret-value \
    --secret-id AuroraSecret7ACECA7F-EZlGncuM4Jsv \
    --region us-east-1 \
    | jq -r .SecretString)

# 環境変数に埋め込み
$ export PGHOST='db-cluster-secondary.cluster-cy14ft6ffvhw.us-east-2.rds.amazonaws.com'
$ export PGPORT=$(echo "${get_secrets_value}" | jq -r .port)
$ export PGDATABASE=$(echo "${get_secrets_value}" | jq -r .dbname)
$ export PGUSER=$(echo "${get_secrets_value}" | jq -r .username)
$ export PGPASSWORD=$(echo "${get_secrets_value}" | jq -r .password)

# セカンダリクラスターのクラスターエンドポイントに接続
$ psql
psql: error: could not translate host name "db-cluster-secondary.cluster-cy14ft6ffvhw.us-east-2.rds.amazonaws.com" to address: Name or service not known

# セカンダリクラスターのクラスターエンドポイントを名前解決
$ dig db-cluster-secondary.cluster-cy14ft6ffvhw.us-east-2.rds.amazonaws.com +short

名前解決できず、接続に失敗しましたね。

それでは、セカンダリクラスターのReaderエンドポイントに変更して接続してみます。

# セカンダリクラスターのReaderエンドポイントを名前解決
$ dig db-cluster-secondary.cluster-ro-cy14ft6ffvhw.us-east-2.rds.amazonaws.com +short
db-instance-secondary.cy14ft6ffvhw.us-east-2.rds.amazonaws.com.
10.1.1.112

# セカンダリクラスターのReaderエンドポイントを指定
export PGHOST='db-cluster-secondary.cluster-ro-cy14ft6ffvhw.us-east-2.rds.amazonaws.com'

# セカンダリクラスターのReaderエンドポイントに接続
$ psql
psql (15.0, server 15.2)
SSL connection (protocol: TLSv1.2, cipher: AES256-GCM-SHA384, compression: off)
Type "help" for help.

testDB=>

接続できましたね。

プライマリクラスターで書き込んだテーブルの情報が取得できるか確認します。

testDB=> \dt
        List of relations
 Schema | Name | Type  |  Owner
--------+------+-------+----------
 public | test | table | postgres
(1 row)

取得できました。

ついでにaurora_replica_status()や、aurora_global_db_instance_status()aurora_global_db_status()でGlobal Databaseの情報を確認してみます。

# すべての Aurora PostgreSQL リーダーノードのステータス
testDB=> SELECT * FROM aurora_replica_status();
       server_id       |              session_id              | durable_lsn | highest_lsn_rcvd | current_read_lsn | cur_replay_latency_in_usec | active_txns | is_current | last_transport_error | last_error_timestamp | last_update_timestamp  | feedback_xmin | feedback_epoch | replica_lag_in_msec | log_stream_speed_in_kib_per_second | log_buffer_sequence_number | oldest_read_view_trx_id | oldest_read_view_lsn | pending_read_ios | read_ios | iops |    cpu
-----------------------+--------------------------------------+-------------+------------------+------------------+----------------------------+-------------+------------+----------------------+----------------------+------------------------+---------------+----------------+---------------------+------------------------------------+----------------------------+-------------------------+----------------------+------------------+----------+------+-----------
 db-instance           | MASTER_SESSION_ID                    |   145802610 |                  |                  |                            |             | t          |                    0 |                      | 2023-06-30 01:44:30+00 |               |                |                     |                                  0 |                       5882 |                         |                      |                0 |      674 |    0 | 24.742268
 db-instance-secondary | 61718fac-67b0-46d4-ab4b-69be82c7f06c |   145802619 |        145802622 |        145802619 |                     997908 |           0 | t          |                    0 |                      |                        |         46751 |              0 |                2809 |                 1.7488070153693605 |                       4470 |                       0 |            145802616 |                0 |        0 |    0 |         0
(2 rows)

# Global Databaseのレイテンシーの情報
testDB=> SELECT * FROM aurora_global_db_status();
 aws_region | highest_lsn_written | durability_lag_in_msec | rpo_lag_in_msec | last_lag_calculation_time  | feedback_epoch | feedback_xmin
------------+---------------------+------------------------+-----------------+----------------------------+----------------+---------------
 us-east-1  |           145802688 |                     -1 |              -1 | 1970-01-01 00:00:00+00     |              0 |             0
 us-east-2  |           145802688 |                    527 |               0 | 2023-06-30 01:44:45.869+00 |              0 |         46767
(2 rows)

# Global Databaseに登録されているAurora DBインスタンスのステータス
testDB=> SELECT * FROM aurora_global_db_instance_status();
       server_id       |              session_id              | aws_region | durable_lsn | highest_lsn_rcvd | feedback_epoch | feedback_xmin | oldest_read_view_lsn | visibility_lag_in_msec
-----------------------+--------------------------------------+------------+-------------+------------------+----------------+---------------+----------------------+------------------------
 db-instance           | MASTER_SESSION_ID                    | us-east-1  |   145802712 |                  |                |               |                      |
 db-instance-secondary | 61718fac-67b0-46d4-ab4b-69be82c7f06c | us-east-2  |   145802700 |        145802709 |              0 |         46777 |            145802697 |                     47
(2 rows)

確かにus-east-2のdb-instance-secondaryがGlobal Databaseとして登録されていることがわかりますね。

フェイルオーバーさせてみる

次にGlobal Databseの計画的なフェイルオーバー(計画済みのフェイルオーバー)をさせてみます。

AWS公式ドキュメントにはAurora PostgreSQL 15.2が計画的なフェイルオーバーをできるのか言及されていません。

  • Aurora Global Database の管理された計画済みのフェイルオーバーには、次のいずれかの Aurora データベースエンジンが必要です。
    • Aurora MySQL (MySQL 8.0 と互換)、バージョン 3.01.0 以上
    • MySQL 5.7 互換の Aurora MySQL、バージョン 2.09.1 以上
    • Aurora PostgreSQL バージョン 13.3 以降、12.4 以降、11.9 以降、および 10.14 以降

Amazon Aurora Global Database の使用 - Amazon Aurora

Global Databaseのフェイルオーバーの詳細は以下記事とAWS公式ドキュメントをご覧ください。

マネジメントコンソールからフェイルオーバーさせます。

Global Databaseを選択してアクション-グローバルデータベースをフェイルオーバーをクリックします。

グローバルデータベースをフェイルオーバー

フェイルオーバー先のDBクラスターを選択してグローバルデータベースをフェイルオーバーをクリックします。

global-database グローバルデータベースをフェイルオーバーしますか

フェイルオーバーが開始すると以下のようにGlobal Databaseのステータスがフェイルオーバーになります。

フェイルオーバー開始

しばらく待ってセカンダリクラスターのエンドポイントを確認すると、クラスターエンドポイントがinactiveから利用可能に変わってました。

フェイルオーバー中のセカンダリクラスター

このタイミングで、セカンダリクラスターには接続し続けていたのでクエリを叩いてみると、以下のように接続が切れてしまいました。

testDB=> SELECT * FROM aurora_global_db_instance_status();
WARNING:  terminating connection because of crash of another server process
DETAIL:  The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.
HINT:  In a moment you should be able to reconnect to the database and repeat your command.
SSL SYSCALL error: EOF detected
The connection to the server was lost. Attempting reset: Failed.
The connection to the server was lost. Attempting reset: Failed.

!?> SELECT * FROM aurora_global_db_instance_status();
You are currently not connected to a database.

# セカンダリクラスターのクラスターエンドポイントの名前解決
$ dig db-cluster-secondary.cluster-cy14ft6ffvhw.us-east-2.rds.amazonaws.com +short
db-instance-secondary.cy14ft6ffvhw.us-east-2.rds.amazonaws.com.
10.1.1.74

# セカンダリクラスターのクラスターエンドポイントを指定
$ export PGHOST='db-cluster-secondary.cluster-cy14ft6ffvhw.us-east-2.rds.amazonaws.com'

# 接続
$ psql
psql: error: connection to server at "db-cluster-secondary.cluster-cy14ft6ffvhw.us-east-2.rds.amazonaws.com" (10.1.1.74), port 5432 failed: Connection refused
        Is the server running on that host and accepting TCP/IP connections?

なお、プライマリクラスターのエンドポイントを確認すると、クラスターエンドポイントが利用可能からinactiveに変わってました。

フェイルオーバー中のプライマリリクラスター

15分ほどでGlobal Databaseおよび、各DBクラスターのステータスが利用可能に変わりました。

フェイルオーバー後のGlobal Database

フェイルオーバー時の旧プライマリクラスターのイベントは以下の通りです。

June 30, 2023, 10:54 (UTC+09:00)
Global failover to DB cluster db-cluster-secondary in Region us-east-2 started.

June 30, 2023, 10:56 (UTC+09:00)
Waiting for data synchronization across global cluster members. Current lags behind primary db cluster: DbClusterArn=arn:aws:rds:us-east-2:984900217833:cluster:db-cluster-secondary,ReplicaLag=20714.

June 30, 2023, 10:57 (UTC+09:00)
Old primary DB cluster db-cluster in Region us-east-1 successfully shut down.

June 30, 2023, 10:58 (UTC+09:00)
New primary DB cluster db-cluster-secondary in Region us-east-2 was successfully promoted.

June 30, 2023, 11:07 (UTC+09:00)
Global failover to DB cluster db-cluster-secondary in Region us-east-2 completed.

フェイルオーバー時の旧セカンダリクラスターのイベントは以下の通りです。

June 30, 2023, 10:54 (UTC+09:00)
Global failover to DB cluster db-cluster-secondary in Region us-east-2 started.

June 30, 2023, 10:57 (UTC+09:00)
Old primary DB cluster db-cluster in Region us-east-1 successfully shut down.

June 30, 2023, 10:58 (UTC+09:00)
New primary DB cluster db-cluster-secondary in Region us-east-2 was successfully promoted.

June 30, 2023, 11:07 (UTC+09:00)
Global failover to DB cluster db-cluster-secondary in Region us-east-2 completed.

June 30, 2023, 11:07 (UTC+09:00)
Promoting previous primary again: db-instance-secondary

June 30, 2023, 11:08 (UTC+09:00)
Completed failover to DB instance: db-instance-secondary

旧セカンダリクラスターのクラスターエンドポイントに接続します。

$ psql
psql (15.0, server 15.2)
SSL connection (protocol: TLSv1.2, cipher: AES256-GCM-SHA384, compression: off)
Type "help" for help.

testDB=>

接続できましたね。

Global Databaseの諸々の情報を確認してみます。

testDB=> SELECT * FROM aurora_replica_status();
       server_id       |    session_id     | durable_lsn | highest_lsn_rcvd | current_read_lsn | cur_replay_latency_in_usec | active_txns | is_current | last_transport_error | last_error_timestamp | last_update_timestamp | feedback_xmin | feedback_epoch | replica_lag_in_msec | log_stream_speed_in_kib_per_second | log_buffer_sequence_number | oldest_read_view_trx_id | oldest_read_view_lsn | pending_read_ios | read_ios | iops |    cpu
-----------------------+-------------------+-------------+------------------+------------------+----------------------------+-------------+------------+----------------------+----------------------+-----------------------+---------------+----------------+---------------------+------------------------------------+----------------------------+-------------------------+----------------------+------------------+----------+------+-----------
 db-instance-secondary | MASTER_SESSION_ID |   167808575 |                  |                  |                            |             | t          |                    0 |                      |                       |               |                |                     |                                  0 |                        212 |                         |                      |                0 |      666 |    0 | 26.943005
(1 row)

testDB=> SELECT * FROM aurora_global_db_status();
 aws_region | highest_lsn_written | durability_lag_in_msec | rpo_lag_in_msec | last_lag_calculation_time  | feedback_epoch | feedback_xmin
------------+---------------------+------------------------+-----------------+----------------------------+----------------+---------------
 us-east-2  |           167808612 |                     -1 |              -1 | 1970-01-01 00:00:00+00     |              0 |             0
 us-east-1  |           167808612 |                      0 |               0 | 2023-06-30 02:10:48.371+00 |              0 |             0
(2 rows)

testDB=> SELECT * FROM aurora_global_db_instance_status();
       server_id       |              session_id              | aws_region | durable_lsn | highest_lsn_rcvd | feedback_epoch | feedback_xmin | oldest_read_view_lsn | visibility_lag_in_msec
-----------------------+--------------------------------------+------------+-------------+------------------+----------------+---------------+----------------------+------------------------
 db-instance-secondary | MASTER_SESSION_ID                    | us-east-2  |   167808647 |                  |                |               |                      |
 db-instance           | 51140c2f-6e3d-47bb-9445-86d3a4b75e3c | us-east-1  |   167808633 |        167808647 |              0 |         49366 |            167808627 |                      0
(2 rows)

旧セカンダリクラスターのDBインスタンスdb-instance-secondarysession_idMASTER_SESSION_IDであることからプライマリインスタンスと判断できます。

書き込みできるかも確認してみましょう。

# 現在のテーブル一覧
testDB=> \dt
        List of relations
 Schema | Name | Type  |  Owner
--------+------+-------+----------
 public | test | table | postgres
(1 row)

# テーブルの追加
testDB=> CREATE TABLE test2 (
  id_2 integer,
  name varchar(10)
);
CREATE TABLE

# テーブルが追加されたことを確認
testDB=> \dt
         List of relations
 Schema | Name  | Type  |  Owner
--------+-------+-------+----------
 public | test  | table | postgres
 public | test2 | table | postgres
(2 rows)

テーブルの追加ができました。

旧プライマリクラスターのReaderエンドポイントにも接続してみましょう。

# Readerエンドポイントを指定
$ export PGHOST='db-cluster.cluster-ro-cicjym7lykmq.us-east-1.rds.amazonaws.com'

# 接続
$ psql
psql (15.0, server 15.2)
SSL connection (protocol: TLSv1.2, cipher: AES256-GCM-SHA384, compression: off)
Type "help" for help.

# テーブル一覧の確認
testDB=> \dt
         List of relations
 Schema | Name  | Type  |  Owner
--------+-------+-------+----------
 public | test  | table | postgres
 public | test2 | table | postgres
(2 rows)

接続および、旧セカンダリクラスターで作成したテーブルを確認できましたね。

Aurora Global DatabaseをサポートするDBエンジン一覧をAWS CLIから確認

AWS CLI aws rds describe-orderable-db-instance-optionsでもAurora Global DatabaseをサポートするDBエンジンを確認できることを教えてもらいました。

実際に試してみます。

まずは、DBエンジンがAurora PostgreSQL 15.2で、DBインスタンスクラスがdb.r6g.largeの情報を確認します。

> aws rds describe-orderable-db-instance-options --engine aurora-postgresql --engine-version 15.2 --db-instance-class db.r6g.large
{
    "OrderableDBInstanceOptions": [
        {
            "Engine": "aurora-postgresql",
            "EngineVersion": "15.2",
            "DBInstanceClass": "db.r6g.large",
            "LicenseModel": "postgresql-license",
            "AvailabilityZones": [
                {
                    "Name": "us-east-1a"
                },
                {
                    "Name": "us-east-1b"
                },
                {
                    "Name": "us-east-1c"
                },
                {
                    "Name": "us-east-1d"
                },
                {
                    "Name": "us-east-1f"
                }
            ],
            "MultiAZCapable": false,
            "ReadReplicaCapable": false,
            "Vpc": true,
            "SupportsStorageEncryption": true,
            "StorageType": "aurora",
            "SupportsIops": false,
            "SupportsEnhancedMonitoring": true,
            "SupportsIAMDatabaseAuthentication": true,
            "SupportsPerformanceInsights": true,
            "AvailableProcessorFeatures": [],
            "SupportedEngineModes": [
                "provisioned"
            ],
            "SupportsKerberosAuthentication": true,
            "OutpostCapable": false,
            "SupportedActivityStreamModes": [
                "async",
                "sync"
            ],
            "SupportsGlobalDatabases": true,
            "SupportsClusters": true,
            "SupportedNetworkTypes": [
                "IPV4",
                "DUAL"
            ],
            "SupportsStorageThroughput": false
        },
        {
            "Engine": "aurora-postgresql",
            "EngineVersion": "15.2",
            "DBInstanceClass": "db.r6g.large",
            "LicenseModel": "postgresql-license",
            "AvailabilityZones": [
                {
                    "Name": "us-east-1a"
                },
                {
                    "Name": "us-east-1b"
                },
                {
                    "Name": "us-east-1c"
                },
                {
                    "Name": "us-east-1d"
                },
                {
                    "Name": "us-east-1f"
                }
            ],
            "MultiAZCapable": false,
            "ReadReplicaCapable": false,
            "Vpc": true,
            "SupportsStorageEncryption": true,
            "StorageType": "aurora-iopt1",
            "SupportsIops": false,
            "SupportsEnhancedMonitoring": true,
            "SupportsIAMDatabaseAuthentication": true,
            "SupportsPerformanceInsights": true,
            "AvailableProcessorFeatures": [],
            "SupportedEngineModes": [
                "provisioned"
            ],
            "SupportsKerberosAuthentication": true,
            "OutpostCapable": false,
            "SupportedActivityStreamModes": [
                "async",
                "sync"
            ],
            "SupportsGlobalDatabases": true,
            "SupportsClusters": true,
            "SupportedNetworkTypes": [
                "IPV4",
                "DUAL"
            ],
            "SupportsStorageThroughput": false
        }
    ]
}

Aurora I/O-OptimizedとAurora Standardのそれぞれの情報が出力されました。SupportsGlobalDatabasestrueかどうかをチェックすれば良さそうです。

Aurora I/O-Optimizedについては以下記事をご参照ください。

Aurora PostgreSQL 15.2でGlobal Databaseが使用可能なDBインスタンスクラスは以下の通りです。

> aws rds describe-orderable-db-instance-options \
           --engine aurora-postgresql \
           --engine-version 15.2 \
           --query 'OrderableDBInstanceOptions[?SupportsGlobalDatabases==`true`].{EngineVersion:EngineVersion, DBInstanceClass:DBInstanceClass, StorageType:StorageType}' \
           --output table

------------------------------------------------------
|         DescribeOrderableDBInstanceOptions         |
+-----------------+-----------------+----------------+
| DBInstanceClass |  EngineVersion  |  StorageType   |
+-----------------+-----------------+----------------+
|  db.r5.12xlarge |  15.2           |  aurora        |
|  db.r5.12xlarge |  15.2           |  aurora-iopt1  |
|  db.r5.16xlarge |  15.2           |  aurora        |
|  db.r5.16xlarge |  15.2           |  aurora-iopt1  |
|  db.r5.24xlarge |  15.2           |  aurora        |
|  db.r5.24xlarge |  15.2           |  aurora-iopt1  |
|  db.r5.2xlarge  |  15.2           |  aurora        |
|  db.r5.2xlarge  |  15.2           |  aurora-iopt1  |
|  db.r5.4xlarge  |  15.2           |  aurora        |
|  db.r5.4xlarge  |  15.2           |  aurora-iopt1  |
|  db.r5.8xlarge  |  15.2           |  aurora        |
|  db.r5.8xlarge  |  15.2           |  aurora-iopt1  |
|  db.r5.large    |  15.2           |  aurora        |
|  db.r5.large    |  15.2           |  aurora-iopt1  |
|  db.r5.xlarge   |  15.2           |  aurora        |
|  db.r5.xlarge   |  15.2           |  aurora-iopt1  |
|  db.r6g.12xlarge|  15.2           |  aurora        |
|  db.r6g.12xlarge|  15.2           |  aurora-iopt1  |
|  db.r6g.16xlarge|  15.2           |  aurora        |
|  db.r6g.16xlarge|  15.2           |  aurora-iopt1  |
|  db.r6g.2xlarge |  15.2           |  aurora        |
|  db.r6g.2xlarge |  15.2           |  aurora-iopt1  |
|  db.r6g.4xlarge |  15.2           |  aurora        |
|  db.r6g.4xlarge |  15.2           |  aurora-iopt1  |
|  db.r6g.8xlarge |  15.2           |  aurora        |
|  db.r6g.8xlarge |  15.2           |  aurora-iopt1  |
|  db.r6g.large   |  15.2           |  aurora        |
|  db.r6g.large   |  15.2           |  aurora-iopt1  |
|  db.r6g.xlarge  |  15.2           |  aurora        |
|  db.r6g.xlarge  |  15.2           |  aurora-iopt1  |
|  db.r6i.12xlarge|  15.2           |  aurora        |
|  db.r6i.12xlarge|  15.2           |  aurora-iopt1  |
|  db.r6i.16xlarge|  15.2           |  aurora        |
|  db.r6i.16xlarge|  15.2           |  aurora-iopt1  |
|  db.r6i.24xlarge|  15.2           |  aurora        |
|  db.r6i.24xlarge|  15.2           |  aurora-iopt1  |
|  db.r6i.2xlarge |  15.2           |  aurora        |
|  db.r6i.2xlarge |  15.2           |  aurora-iopt1  |
|  db.r6i.32xlarge|  15.2           |  aurora        |
|  db.r6i.32xlarge|  15.2           |  aurora-iopt1  |
|  db.r6i.4xlarge |  15.2           |  aurora        |
|  db.r6i.4xlarge |  15.2           |  aurora-iopt1  |
|  db.r6i.8xlarge |  15.2           |  aurora        |
|  db.r6i.8xlarge |  15.2           |  aurora-iopt1  |
|  db.r6i.large   |  15.2           |  aurora        |
|  db.r6i.large   |  15.2           |  aurora-iopt1  |
|  db.r6i.xlarge  |  15.2           |  aurora        |
|  db.r6i.xlarge  |  15.2           |  aurora-iopt1  |
|  db.r7g.12xlarge|  15.2           |  aurora        |
|  db.r7g.12xlarge|  15.2           |  aurora-iopt1  |
|  db.r7g.16xlarge|  15.2           |  aurora        |
|  db.r7g.16xlarge|  15.2           |  aurora-iopt1  |
|  db.r7g.2xlarge |  15.2           |  aurora        |
|  db.r7g.2xlarge |  15.2           |  aurora-iopt1  |
|  db.r7g.4xlarge |  15.2           |  aurora        |
|  db.r7g.4xlarge |  15.2           |  aurora-iopt1  |
|  db.r7g.8xlarge |  15.2           |  aurora        |
|  db.r7g.8xlarge |  15.2           |  aurora-iopt1  |
|  db.r7g.large   |  15.2           |  aurora        |
|  db.r7g.large   |  15.2           |  aurora-iopt1  |
|  db.r7g.xlarge  |  15.2           |  aurora        |
|  db.r7g.xlarge  |  15.2           |  aurora-iopt1  |
|  db.serverless  |  15.2           |  aurora        |
|  db.serverless  |  15.2           |  aurora-iopt1  |
|  db.x2g.12xlarge|  15.2           |  aurora        |
|  db.x2g.12xlarge|  15.2           |  aurora-iopt1  |
|  db.x2g.16xlarge|  15.2           |  aurora        |
|  db.x2g.16xlarge|  15.2           |  aurora-iopt1  |
|  db.x2g.2xlarge |  15.2           |  aurora        |
|  db.x2g.2xlarge |  15.2           |  aurora-iopt1  |
|  db.x2g.4xlarge |  15.2           |  aurora        |
|  db.x2g.4xlarge |  15.2           |  aurora-iopt1  |
|  db.x2g.8xlarge |  15.2           |  aurora        |
|  db.x2g.8xlarge |  15.2           |  aurora-iopt1  |
|  db.x2g.large   |  15.2           |  aurora        |
|  db.x2g.large   |  15.2           |  aurora-iopt1  |
|  db.x2g.xlarge  |  15.2           |  aurora        |
|  db.x2g.xlarge  |  15.2           |  aurora-iopt1  |
+-----------------+-----------------+----------------+

逆に対応していないDBインスタンスクラスは以下の通りです。

>  aws rds describe-orderable-db-instance-options \
           --engine aurora-postgresql \
           --engine-version 15.2 \
           --query 'OrderableDBInstanceOptions[?SupportsGlobalDatabases==`false`].{EngineVersion:EngineVersion, DBInstanceClass:DBInstanceClass, StorageType:StorageType}' \
           --output table

------------------------------------------------------
|         DescribeOrderableDBInstanceOptions         |
+-----------------+-----------------+----------------+
| DBInstanceClass |  EngineVersion  |  StorageType   |
+-----------------+-----------------+----------------+
|  db.t3.large    |  15.2           |  aurora        |
|  db.t3.large    |  15.2           |  aurora-iopt1  |
|  db.t3.medium   |  15.2           |  aurora        |
|  db.t3.medium   |  15.2           |  aurora-iopt1  |
|  db.t4g.large   |  15.2           |  aurora        |
|  db.t4g.large   |  15.2           |  aurora-iopt1  |
|  db.t4g.medium  |  15.2           |  aurora        |
|  db.t4g.medium  |  15.2           |  aurora-iopt1  |
+-----------------+-----------------+----------------+

Aurora PostgreSQL 15.2 の Aurora Global Databaseは作成できる

AWS CDKでAurora PostgreSQL 15.2 の Aurora Global Databaseを作成してみました。

レプリケーションできていること、フェイルオーバーができることも確認できて一安心です。

AWS CDKにおけるGlobal Databaseの管理はmazyu36さんの以下記事が非常に参考になります。必見です。

なお、Aurora Global Databaseは「DBクラスターの停止ができない」や「バックトラックが使えない」、「メジャーアップデート時にカスタムパラメータグループを適用できない」など色々と制約事項があります。Aurora Global Databaseを使う際は目を通しておきましょう。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!