【大トラブル|ピンチ 503 エラー】Amazon EC2 Auto Scaling でやってはいけない設定ミス


概要

顔面蒼白、大トラブルを起こしてしまいました。
同じようなことを他の方にも起こされないようにメモとして残しておきます。

何があったか

  1. アラートが大量にでている、サイトに 503 エラーでサイトが開けない!
  2. な、何が起きているのか AWS コンソールから EC2 インスタンスを確認

  3. 恐怖!!!! インスタンスが起動しかけて、すぐに終了して、起動しかけて、すぐに終了して、、無限ループ。。。。深呼吸。落ち着こう(キャプチャ見て分かるとおり、スクロールバーが表示されて、隠れるぐらい terminated のインスタンスがいます)

  4. まず、急遽接続ができる状態にする最短の対策を考える

  5. EC2 Auto Scaling がなぜ、起動しては失敗するような挙動になっているか調べる

対応

4. 急遽接続ができる状態にする最短の対策を考える

そして、急遽、AMI からインスタンスを単独で立ち上げ、最新のソースコードを反映し、ALB にアタッチした

これでひとまず、接続ができない問題は免れた

ここでさらに落ち着いて対応をするためにコーヒーを飲みました (どうでもいい)

5. EC2 Auto Scaling がなぜ、起動しては失敗するような挙動になっているか調べる

まず色々簡略化した図だが以下のようなサーバ構成図となっている (EC2は最小2台の構成)

まず、最初にSTATUSチェック faild となっているインスタンスが2台存在していた。
そこから、EC2 Auto Scaling がインスタンスを最小2台構成に戻そうと頑張りだした。

ただ、起動しては起動しきれずに、すぐに終了してを繰り返している。
これの原因を見るために、Auto Scaling グループ のアクティビティを確認したところ以下のようなログを大量に確認した

Cancelled
Launching a new EC2 instance: i-xxxxx. Status Reason: Instance failed to complete user's Lifecycle Action: Lifecycle Action with token 8xxxxxx was abandoned: Lifecycle Action Completed with ABANDON Result

どうも Lifecycle Action が失敗しているようだ

Lifecycle Action で動いているのは最新のソースコードを反映するために、 CodeDeploy だ。
ログを見てみよう。

なんということでしょう。大量の失敗の嵐が。

もう個々のログの中身を少し詳しくみてみると。

CodeDeploy の DownloadBundle イベントで UnKnownError

さらに
The specified key does not exist.
と、表示されている。

CodeDeploy は以前デプロイした最新のソースコードを S3 から取ってくるのだが、存在しないよってことのようだ。

たしかに URL 開いたら、ソースコードファイルが S3 に存在しない。。。

ちょっと待てよ。
俺、CodePipeline のソースコードの S3 のバケット、GitHub で管理しているから、30日前のソースコードなんていらないと、
ライフサイクルルールで削除するように設定していたぞ。。
このサイトでデプロイしたの2ヶ月以上前だし、それだー!!!

ということで、ライフサイクルルールを消して、オートスケーリンググループを作り直すことで解決。


ちなみに、同じファイル名で最新のソースコードをS3に配置すれば動くんじゃね?って試してみたところ

etag が一致しませんとエラーがでました。その通りですね。ちゃんとバリデーションしていただいて素晴らしいです。

結論

トラブルが起きたときは コーヒーを飲む 、じゃなくて、ひとまず落ち着いて、考える。
Amazon EC2 Auto Scaling で Lifecycle Action に CodeDeploy を定義している場合は、S3 に保存されるソースコードはライフサイクルルールで削除しては駄目。