gunma.web #50
システムの堅牢性システムの堅牢性Gunma.web #50Gunma.web #50@kanayannet
View Slide
前提前提堅牢性の話は実はあまりない主にウィークポイントを把握する話
今回の対象今回の対象開発して終わりじゃない方リリース後から本番だと思っている方検証大好きな人稼働し続けるWEBサービスの中身が好きな人
対象外対象外100%の精度以外は認めない価値観開発までしか考えないケース
やろうと思ったきっかけやろうと思ったきっかけ
WEB+DB PRESSWEB+DB PRESS休刊さびしい
これからはこれからは
カオスエンジニアリング特集!!カオスエンジニアリング特集!!これだ!
カオスエンジニアリングカオスエンジニアリングシステムに疑似障害を故意に発生させるどこが予期せぬ異常を起こしたか?把握する結果、障害に対しての対策が可能になる
具体例具体例会員制のBBS閲覧は誰でも可能ログインしないと書き込みは不可
構成図構成図
テストケーステストケースログインせず閲覧できる書き込みできないログイン後閲覧できる書き込みできる
ここまでは普通のテストで試せるここまでは普通のテストで試せる
RDS(ユーザ情報)RDS(ユーザ情報)わざと落とすどうなるか?
ありがちな不具合1ありがちな不具合1ログインしようとしたら...500番エラーで何も表示されない
def is_login(sid, token)User.find_by(sid: sid, token: token).present?end
原因原因DB接続できず接続できなかった場合の処理が全く書いてない予期せぬエラーで落ちた
ありがちな不具合2ありがちな不具合2ログインしてないのに書き込み出来ちゃったw
def is_login(sid, token)ret = truebeginret = User.find_by(sid: sid, token: token).present?rescue# 握りつぶす!endretend
原因原因RDBが落ちた場合に回避コードは書いてあったが...ログイン成功とみなしていたdefault: true !!握りつぶしすぎ!
ありがちな不具合3ありがちな不具合3全く何も見れないALL 500番エラー
class Datadef initialize(sid, token)@is_login = self.is_login(sid, token)enddef is_login(sid, token)User.find_by(sid: sid, token: token).present?enddef articlesArticles.all.order(id: 'desc')enddef
原因原因ページ閲覧の際にもログイン情報を参照し接続できない場合の例外処理を書いてなかった
そもそもな発見そもそもな発見閲覧のみならユーザ情報 参照するなよw不必要な処理で裏じゃこっそりサーバ負荷上げてる
なんでカオス?なんでカオス?ここまで来ると解ったと思います。予期せぬ障害を加えると、ソフトウェアはどういう振る舞いをするか?予想するのは困難であるカオス的な振るまい
落ちない仕組みにすればいいのでは?落ちない仕組みにすればいいのでは?落ちずらい仕組みは目指せると思うマルチAZフルマネージドなサービス: Auroraなど
100%落ちないはあり得ない100%落ちないはあり得ない
お金の問題もあるお金の問題もあるマルチリージョン,マルチAZ,オートスケーリング..やればやるほど...本当に全部が全部これ必要?落とし所は欲しいよね?
先ほどの検証で解った事先ほどの検証で解った事今のままじゃダメだwコードを修正すればダウンする範囲を限定できそう不必要な処理も直せそう
検知も欲しいよね?検知も欲しいよね?正常ではないレスポンスの検出AWS: Synthetics Canary ..etc独自に作ってもいいのでは?今回の検証でどこに仕掛ければ良いか?勘所が把握できたはず
まとめまとめ
まとめまとめテストを実施する人に「丸投げ」パターンは限界あるよ弱い箇所を知ることが本当に出来る?テストする人 =構成を把握してますか?「構成」を把握してないと「どこに何が潜んでいそうか?」判断しずらいよね?「落とす」ことにより色々発覚する
まとめ(心構え)まとめ(心構え)カオス =怖い =触りたくない ->これじゃダメどう向き合うか?が重要向き合う考え方をまとめたものがカオスエンジニアリング予期せぬ挙動 =ダメ ではない予期せぬ挙動が解った =前進である
余談余談web+db press復活して欲しい休刊なのでお待ちしてます!Software Designしばらく読んでますNetflixこういう話題多いよね?
ご清聴ご清聴ありがとうございました。ありがとうございました。