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を作成します。プライマリはus-east-1、セカンダリはus-east-2としています。
環境はAWS CDKでデプロイしました。使用したコードは以下リポジトリに保存しています。
やってみた
Global Databaseの作成
それでは実際にやってみます。
まず、プライマリリージョンであるus-east-1からデプロイします。
デプロイ後のAurora DBクラスターを確認すると、以下のようにプライマリクラスターとしてGlobal Databaseに登録されていました。
そのままセカンダリリージョンであるus-east-2でもデプロイします。
デプロイ後のAurora DBクラスターを確認すると、以下のようにセカンダリリージョンのDBクラスターもセカンダリクラスターとしてGlobal Databaseに登録されていました。
セカンダリクラスターのエンドポイントを確認すると、クラスターエンドポイントがinactiveになっていますね。
また、Global Databaseの詳細を確認すると、しっかりエンジンバージョンは15.2
となっていました。
Aurora PostgreSQL 15.2のGlobal Databaseも問題なく作成できますね。
つまづいたポイント
つまづいたポイントは以下3つです。
- Secrets Managerとの統合をしている場合、Global Databaseに登録できない
- db.t4g.medium などt系のインスタンスクラスは、Global Databaseで使用できない
- セカンダリクラスター作成時はKMSキーを明示的に指定する必要がある
Secrets Managerとの統合をしている場合、Global Databaseに登録できない
Secrets Managerとの統合をしているAurora DBクラスターをGlobal Databaseに登録しようとすると、Secrets Manager は、グローバルクラスターの作成機能をサポートしていません。この DB インスタンスにグローバルクラスターを作成するには、まず、この DB インスタンスを変更して Secrets Manager の統合をオフにする必要があります。
と言うメッセージが出力されます。
そのため、Lambda関数を使わずにマスターユーザーのパスワードをローテーションさせることはできません。
db.t4g.medium などt系のインスタンスクラスは、Global Databaseで使用できない
AWS公式ドキュメントにはDBインスタンスクラスについて、以下のような記載があります。
DB インスタンスクラスの要件-Aurora Global Database には、メモリを大量に消費するアプリケーションに最適化された DB インスタンスクラスが必要です。メモリ最適化 DB インスタンスクラスの詳細については、DB インスタンスクラスを参照してください。db.r5 以上のインスタンスクラスを使用することを推奨します。
「あくまで推奨であって、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で使用することはできないようです。
ちなみにプライマリクラスターだけでなく、セカンダリクラスターの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 以降
Global Databaseのフェイルオーバーの詳細は以下記事とAWS公式ドキュメントをご覧ください。
マネジメントコンソールからフェイルオーバーさせます。
Global Databaseを選択してアクション
-グローバルデータベースをフェイルオーバー
をクリックします。
フェイルオーバー先のDBクラスターを選択してグローバルデータベースをフェイルオーバー
をクリックします。
フェイルオーバーが開始すると以下のように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クラスターのステータスが利用可能
に変わりました。
フェイルオーバー時の旧プライマリクラスターのイベントは以下の通りです。
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-secondary
のsession_id
がMASTER_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のそれぞれの情報が出力されました。SupportsGlobalDatabases
がtrue
かどうかをチェックすれば良さそうです。
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)でした!