🌋

RDS AuroraがAvailableになる前に接続できる件

2022/11/07に公開

動機

Auroraを立ち上げて待っている間、AuroraがAvailableになっていなくてもDBクライアントで接続できることに気がつきました。実際のところ、どういうタイミングで可能になるのか調べてみました。

構成

ローカルPCから、パブリックサブネット上のAurora(MySQL)に接続します。検証用なのであまり気にせずPublicです。

調べ方

以下3つの方法を同時に実行(それぞれ1秒ごと)

  • describe_db_clustersでクラスターの状態を調べる
  • describe_db_instancesでWriterインスタンスの状態を調べる
  • mysqlログインを試みて、どのタイミングでログインが成功するのかを調べる

describe_db_clustersでクラスターの状態を調べる

Auroraを停止状態から起動して、毎秒の状態を調べてtxtに書き込みます。

check_aurora_state.py
import time
from datetime import datetime

import boto3

client = boto3.client("rds")
aurora_mysql = <aurora-name>

now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
response = client.start_db_cluster(DBClusterIdentifier=aurora_mysql)
with open('status_cluster.txt', 'a+') as f:
    f.write(f'{now}, Start DB Cluster {aurora_mysql}')

while True:
    now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    response = client.describe_db_clusters(
        DBClusterIdentifier=aurora_mysql,
    )
    status = response['DBClusters'][0]['Status']
    with open('status_cluster.txt', 'a+') as f:
        f.write(f'\n{now}, {status}, {response}')
    time.sleep(1)

describe_db_instancesでWriterインスタンスの状態を調べる

こちらも同様に、インスタンスの毎秒のログを取ります。

check_instance_state.py
import time
from datetime import datetime

import boto3

client = boto3.client("rds")
aurora_mysql_instance = <aurora-instance-name>


while True:
    now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    response = client.describe_db_instances(
        DBInstanceIdentifier=aurora_mysql_instance,
    )
    status = response['DBInstances'][0]['DBInstanceStatus']
    with open('status_instance.txt', 'a+') as f:
        f.write(f'\n{now}, {status}, {response}')
    time.sleep(1)

mysqlログインを試みて、どのタイミングでログインが成功するのかを調べる

  • 外部ファイルに出力できなかったので、ターミナル上の出力を手動でコピペして保存
  • mysqlコマンドにパスワードを付けて実行するとWarningが出ていたので、ファイルで設定
dbaccess.cnf
[client]
user = <your_user>
password = <your_password>
host = <xxxxx.rds.amazonaws.com>
mysql_login.sh
#!/bin/bash

while :
do
  echo $(date +%Y-%m-%d\ %H:%M:%S)
  mysql --defaults-extra-file=dbaccess.cnf --connect-timeout 1
  if [ $? -eq 0 ]; then
    break
  fi
done

結果

上記3つを実行して、結果を待ちます。

describeの結果がtxtに書かれていますが、変化するのはStateの部分だけなので、そこを抜き出します。Cluster、WriterInstanceと、MySQLログインができたタイミングを図示するとこのようになります(2回の平均)。Cluster、InstanceどちらもStartingの状態のときに、おもむろにログインできるようになるようです。(その時間付近のログからは、変化点を見つけられませんでした)

まとめ

  • Auroraが開始するときに、MySQLにログインできるようになるタイミングを調べました
  • 開始して4分ほど経ってClouster,InstanceどちらもStartingのStateのとき、おもむろにMySQLログインができるようになることが確認できました
    • (理由はよくわからない)

Discussion