Aurora のクラスターエンドポイントとリーダーエンドポイントの違い ── 読み取りをレプリカに逃がす
記事の「実践」を 1 項目ずつ進めるためのページです。AWS マネジメントコンソールで操作したら、右の一覧にチェックを入れてください。チェックはこのブラウザに保存されます。
前提条件
- リージョン:
ap-northeast-1(東京) - RDS・EC2・Systems Manager の操作権限を持つ IAM ユーザーまたはロールでコンソールにログイン済みであること
以下のリソースが作成済みであることを前提とします。Aurora クラスターには、まだライターが 1 台あるだけです。
まだ用意していない場合は、「作り方の参考」の記事の手順で作れます。リソース名は、この記事の名前に読み替えてください。
| リソース種別 | リソース名 | 内容 | 作り方の参考 |
|---|---|---|---|
| VPC・サブネット | aurora-lab-vpc | パブリックサブネット aurora-lab-public-1a、プライベートサブネット aurora-lab-private-1a / aurora-lab-private-1c | Amazon RDS でデータベースを作成し EC2 から接続する |
| Aurora DB クラスター | aurora-lab-cluster | Aurora MySQL。マスターユーザー admin、パスワードは Secrets Manager で管理。DB サブネットグループは 2 つのプライベートサブネット | 同上 ※エンジンを Aurora (MySQL Compatible) にする |
| ライターインスタンス | aurora-lab-writer | db.t4g.medium・ap-northeast-1a | 同上 |
| EC2 インスタンス | aurora-lab-client | Amazon Linux 2023。mysql クライアント(mariadb105)と jq を導入済み。Session Manager で接続でき、クラスターの情報とマスターユーザーのシークレットを読み取れる IAM ロールを付与 | 同上 |
| セキュリティグループ | aurora-lab-db-sg | aurora-lab-client からの MySQL(3306)だけを許可 | 同上 |
このハンズオンで作成するリソースは以下のとおりです。
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| Aurora レプリカ(リーダーインスタンス) | aurora-lab-reader-1 | 読み取り用。ap-northeast-1c に置く |
> [!WARNING] > Aurora の DB インスタンスは、起動している間ずっと 1 台ごとに課金されます。リーダーを足すとそのぶん料金が増えます。検証が終わったら必ず削除してください。
手順 1: リーダーを足す前のエンドポイントを確かめる
AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。
上部の検索バーに RDS と入力し、「Aurora and RDS」を選択します。左側ナビゲーションの「データベース」を選択し、aurora-lab-cluster の配下に aurora-lab-writer(ロール: ライターインスタンス)だけがあることを確認します。
aurora-lab-cluster を開き、「接続とセキュリティ」タブを選択します。「エンドポイントタイプ」が クラスターエンドポイント の状態で、「接続先」を ライター と リーダー に切り替えると、表示される接続コマンドのホスト名が変わります。ライターは aurora-lab-cluster.cluster-…、リーダーは aurora-lab-cluster.cluster-ro-… です。リーダーがまだ無いため、この時点ではリーダーエンドポイントもライターに接続します。
手順 2: リーダーを追加する
aurora-lab-cluster の画面右上の「アクション」→「リーダーの追加」をクリックします。「リーダーの追加」の画面で、以下を設定します。
- DB インスタンス識別子:
aurora-lab-reader-1 - DB インスタンスクラス:
バースト可能クラスのdb.t4g.medium(デフォルト) - アベイラビリティーゾーン:
ap-northeast-1c(デフォルトは「指定なし」) - パブリックアクセス:
パブリックアクセス不可(デフォルト)
その他の項目はデフォルトのままにして、「リーダーを追加」をクリックします。作成には 10 分ほどかかります。
aurora-lab-reader-1 のステータスが「利用可能」になり、ロールが「リーダーインスタンス」になったことを確認します。
手順 3: 2 つのエンドポイントに接続して違いを確かめる
上部の検索バーに EC2 と入力し、「EC2」を選択します。左側ナビゲーションの「インスタンス」から aurora-lab-client を選択し、「接続」→「Session Manager」タブ→「接続」をクリックします。
開いたターミナルで、次のコマンドを実行します。エンドポイントはクラスターの情報から、パスワードは Secrets Manager から取得します。パスワードは画面に表示せず、環境変数 MYSQL_PWD で mysql クライアントに渡します。
export AWS_DEFAULT_REGION=ap-northeast-1
WRITER=$(aws rds describe-db-clusters --db-cluster-identifier aurora-lab-cluster \
--query 'DBClusters[0].Endpoint' --output text)
READER=$(aws rds describe-db-clusters --db-cluster-identifier aurora-lab-cluster \
--query 'DBClusters[0].ReaderEndpoint' --output text)
SECRET_ARN=$(aws rds describe-db-clusters --db-cluster-identifier aurora-lab-cluster \
--query 'DBClusters[0].MasterUserSecret.SecretArn' --output text)
export MYSQL_PWD=$(aws secretsmanager get-secret-value --secret-id "$SECRET_ARN" \
--query SecretString --output text | jq -r .password)
それぞれのエンドポイントに接続し、つながったインスタンスと、読み取り専用かどうかを表示します。
mysql -h "$WRITER" -u admin -e "SELECT @@aurora_server_id AS server, @@innodb_read_only AS read_only;"
mysql -h "$READER" -u admin -e "SELECT @@aurora_server_id AS server, @@innodb_read_only AS read_only;"
クラスターエンドポイントでは server が aurora-lab-writer、read_only が 0 になります。リーダーエンドポイントでは server が aurora-lab-reader-1、read_only が 1 になります。
リーダーが「利用可能」になった直後は、リーダーエンドポイントの DNS がまだライターを指していて、server が aurora-lab-writer になることがあります。今回は切り替わるまでに数分かかりました。その場合は少し待ってから実行し直します。
手順 4: 書き込みはライター、読み取りはリーダーで行う
クラスターエンドポイントでテーブルを作り、データを書き込みます。
mysql -h "$WRITER" -u admin -e "
CREATE DATABASE IF NOT EXISTS lab;
CREATE TABLE IF NOT EXISTS lab.orders (id INT AUTO_INCREMENT PRIMARY KEY, item VARCHAR(20));
INSERT INTO lab.orders (item) VALUES ('banana'), ('apple');"
続けて、リーダーエンドポイントで読み取ります。ライターで書いたデータが、すぐにリーダーからも読めます。
mysql -h "$READER" -u admin -e "SELECT * FROM lab.orders;"
最後に、リーダーエンドポイントで書き込みを試します。
mysql -h "$READER" -u admin -e "INSERT INTO lab.orders (item) VALUES ('grape');"
読み取り専用モードで動いているため実行できない、という ERROR 1836 (HY000) at line 1: Running in read-only mode が返ります。リーダーは読み取り専用なので、書き込みはクラスターエンドポイントに送る必要があります。