[AWS CDK] Aurora PostgreSQL 15.2 の Aurora Global Database を作ってみた
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
を指定しました。
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)でした!