🌋
RDS AuroraがAvailableになる前に接続できる件
動機
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が出ていたので、ファイルで設定
mysql: [Warning] Using a password on the CLI can be insecure.
- 参考になりました https://beyondjapan.com/blog/2016/08/mysql56-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