😸

複数のEC2のAS起動時にElastiCacheに接続ができない~ RedisException: ・・・

2023/01/01に公開

新年明けましておめでとうございます。
2022年も終わって、2023年が始まりましたね。

年末休みに入ってすぐにお酒を飲んで寝るっていうだけの生活が始まってしまいました。
1/5(木)から仕事なのですが、考えると少し憂鬱になります...w

さて、今年はインフラ構築の業務に携わらせていただける機会があり、設計から保守に入る手前までの業務を行いました。
1期の開発では特に問題はなく、2期の開発途中で問題が起きました。

ある日、アプリを立ち上げるとエラーのモーダルが表示されました。
EC2のインスタンスのアプリログを確認すると

RedisException: READONLY You can't write against a read only replica

という今までに今までに見たことの無いログを発見しました。

調査しましたが、根本的な解決につながる答えに辿り着けず、該当のログが出ているASのインスタンスを再度立ち上げ直して入れ替えるという動作を二回行うと解消されました。

なぜこのようなことが起こったのか。

Develop, Staging, Production環境の3環境のAWSを用意しており、
Production環境のみ、常時稼働ということになっています。

そのため、Develop, StagingではAWS EventBridgeを使ってEC2のオートスケーリンググループを自動起動・停止を行なっています。(費用を抑えるため)

まず、簡単な構成図をお見せします。
(いらない図などは省略をしております。悪しからず。。)

※ここに画像を入れる

オートスケーリング、オートヒーリングのEC2インスタンスが存在し、
片方のインスタンス(仮にAインスタンスと名付ける)は、7:00 ~ 22:00
片方のインスタンス(仮にBインスタンスと名付ける)は、7:00 ~ 24:00
となっています。

分けている理由は、Bインスタンスはお客様先のエンジニアもアクセスが必要なため要望に応じて適宜、開始・終了の時間を変えています。

原因

絶対的な確証がないので自信を持って言えませんが、、
Aインスタンスが22時で終了しているのに対して、Bインスタンスが24時に終了していてそこに差分が生まれていることが要因だと考えております。

他の案件でもElastiCacheを同時にキャッシュクリアを行わないとアプリがエラーになることがありました。

解決策

二つあると思っています。

  1. オートスケーリング、オートヒーリングの開始時間と終了時間は一緒にする。
     こちらは、オペレーションミスによって片方のインスタンスの終了時刻は変更してももう片方のインスタンスの終了時刻を変更し忘れていると発生します。
     GUIでの操作をするときはダブルチェックで進める、CUIベースの場合は、両インスタンスにASの設定が反映されるように記述するのがよのかなと思います。
     また、AWSで使っているサービスの設定値などはExcelやスプシなどにまとめて可視化しておくことも大事なのではないかと思いました。

  2. そもそも、ASインスタンスの開始・終了をしないようにする。
     ※こちらは、誰がAWSの料金を払うのかによって変わってきます。
     インフラの予算は抑えたい。というお客様もいると思うのでこちらは要相談です。
     (違うプロジェクトですが、全環境インスタンスを止めないというところもありました。)

p.s. 今年は記事作成に力を入れていこうかなと考えております。
以上。これからもよろしくお願いします。

Discussion