納期と障害とElasticBeansTalkのお話

さて、納期がありますね。
急いで開発しますね。
リリースしますね。
喜びますね。
お客さん沢山きますね。

・・・(しばしリリースを喜ぶ)

負荷が上がりますね。
詰まりますね。
障害ですね。

こんにちは。ElasticBeansTalkを作ってとあるキャンペーンの特設サイトを構築した話です。

要件的なやつ
  • リリースまで残り10日くらい
  • キャンペーン期間は一ヶ月以下
  • SSLじゃないとダメ(oauthのコールバックの関係)
  • Nodejs, Nginx, 適当なNoSQL

期限的にオンプレでssl証明書買うのは無理だし、ちゃんとしたの買うと短い期間しか使わないのに高い。そしたらクラウドに金払った方が良い。 どうやらAWSACMというやつで高速で証明書発行してhttpsサイト作れるらしいじゃないの。最高。
そしてElasticBeansTalkというやつで高速にELB+EC2(Nginx+Nodejs)+DynamoDB立てられるらしいじゃないですか。

こりゃ楽勝だな。

やったみた
  • ElasticBeansTalk+ACMを使って、サンプルアプリデプロイして動かすまで1日かからず。最高。
  • インフラとしては監視を入れたい。ebextensionsを使ってCloudFormation的なものを書く。ほぼサンプルなのでデプロイすれば動く。楽勝。
  • ↑のものを何が書いてあるのに理解するのに3日くらい(まだ理解仕切れていない)。AWS普段触らない人には辛い。
  • AWSでどれくらいかかるか詳細見積もり(ざっくり見積もりはEC2使うと決めた時点でざっくりとっていたが、インスタンスタイプとかアクセス見積もりとか詳細のやつ)。
  • DynamoDBもサンプルデプロイして半日たたずに動く。なるほど。オートスケールはデフォルトじゃないのか。気をつけないとね。楽勝(嫌な予感。伝えておかないと)。サンプル突っ込んだら動いたことを開発側に伝えて、ドキュメント渡してその後ここを丸投げ。
  • Slack通知もしたいねということで、LamdaのBlueprintとかいうのを使ってSNSからLamda通してSlack通知へ。
  • その他eb設定もebextensionsで管理

slack通知のタスクは残念ながらリリース時間には間に合わなかったけど、アプリ共々動いてるのでリリースはできた。

で、問題は?

リリース後、しばらくしたら5xx返すかクソ重いかになる。
EC2はCPUまあまあ食ってるけど詰まるほどではない。メモリはスカスカ。サーバ内書き込みないからDiskIOなんて起こるはずもない。確かにNodejsなので1プロセスだけ立てててそれが詰まると死ぬのだが、それだったらCPUはりつくのではという感じだし。実際にオートスケールの下限を増やしたが関係なし。
となるとDBだな。 はい。DynamoDB詰まってました。
オートスケールするんじゃないの?

前述した通り、オートスケールはデフォルトではありませんでした。
自分で手作業で検証した時には気がついていたけど伝えてなかった。開発側がebextensions書いてTable作るとのことでそのままお任せしてしまった。
高速Backend開発。忙しすぎる開発者。
そしてリリースされるアプリ。
オートスケールしないクソ弱いDB。
当然詰まる。
死。

はい。雑にまとめておきましょう。

教訓

  • なんとなく嫌な予感は大切にしましょう
  • 気になることはなんでも伝えましょう
  • 忙しい人は細かいこと忘れるので、少しでも余裕がある人が地雷を気にしてあげましょう
  • 後で絶対にやる・確認するタスクは分かりやすいところに置きましょう。今回はリリース前に気になりリストを最終確認する時間を取れば問題起こらなかったですね。github issueとかだとめっちゃ急いでいると見るの忘れるので、slackのリマインダ機能使いましょう。

最後の行がこの話で書きたかったこと。忘れそうなものは分かりやすいところへ。PULL型ではなくてPUSHで教えてくれるように。

以上