$30 off During Our Annual Pro Sale. View Details »

システムの堅牢性

kanayannet
September 11, 2023

 システムの堅牢性

gunma.web #50

kanayannet

September 11, 2023
Tweet

More Decks by kanayannet

Other Decks in Programming

Transcript

  1. システムの堅牢性
    システムの堅牢性
    Gunma.web #50
    Gunma.web #50
    @kanayannet

    View Slide

  2. 前提
    前提
    堅牢性の話は実はあまりない
    主にウィークポイントを把握する話

    View Slide

  3. 今回の対象
    今回の対象
    開発して終わりじゃない方
    リリース後から本番だと思っている方
    検証大好きな人
    稼働し続けるWEB
    サービスの中身が好きな人

    View Slide

  4. 対象外
    対象外
    100%
    の精度以外は認めない価値観
    開発までしか考えないケース

    View Slide

  5. やろうと思ったきっかけ
    やろうと思ったきっかけ

    View Slide

  6. WEB+DB PRESS
    WEB+DB PRESS
    休刊
    さびしい

    View Slide

  7. これからは
    これからは

    View Slide

  8. カオスエンジニアリング特集
    !!
    カオスエンジニアリング特集
    !!
    これだ!

    View Slide

  9. カオスエンジニアリング
    カオスエンジニアリング
    システムに疑似障害を故意に発生させる
    どこが予期せぬ異常を起こしたか?把握する
    結果、障害に対しての対策が可能になる

    View Slide

  10. 具体例
    具体例
    会員制のBBS
    閲覧は誰でも可能
    ログインしないと書き込みは不可

    View Slide

  11. 構成図
    構成図

    View Slide

  12. テストケース
    テストケース
    ログインせず
    閲覧できる
    書き込みできない
    ログイン後
    閲覧できる
    書き込みできる

    View Slide

  13. ここまでは普通のテストで試せる
    ここまでは普通のテストで試せる

    View Slide

  14. RDS(
    ユーザ情報
    )
    RDS(
    ユーザ情報
    )
    わざと落とす
    どうなるか?

    View Slide

  15. ありがちな不具合
    1
    ありがちな不具合
    1
    ログインしようとしたら...
    500
    番エラーで何も表示されない

    View Slide

  16. def is_login(sid, token)
    User.find_by(sid: sid, token: token).present?
    end

    View Slide

  17. 原因
    原因
    DB
    接続できず
    接続できなかった場合の処理が全く書いてない
    予期せぬエラーで落ちた

    View Slide

  18. ありがちな不具合
    2
    ありがちな不具合
    2
    ログインしてないのに
    書き込み出来ちゃったw

    View Slide

  19. def is_login(sid, token)
    ret = true
    begin
    ret = User.find_by(sid: sid, token: token).present?
    rescue
    # 握りつぶす!
    end
    ret
    end

    View Slide

  20. 原因
    原因
    RDB
    が落ちた場合に回避コードは書いてあったが...
    ログイン成功とみなしていた
    default: true !!
    握りつぶしすぎ!

    View Slide

  21. ありがちな不具合
    3
    ありがちな不具合
    3
    全く何も見れない
    ALL 500
    番エラー

    View Slide

  22. class Data
    def initialize(sid, token)
    @is_login = self.is_login(sid, token)
    end
    def is_login(sid, token)
    User.find_by(sid: sid, token: token).present?
    end
    def articles
    Articles.all.order(id: 'desc')
    end
    def

    View Slide

  23. 原因
    原因
    ページ閲覧の際にもログイン情報を参照し
    接続できない場合の例外処理を書いてなかった

    View Slide

  24. そもそもな発見
    そもそもな発見
    閲覧のみならユーザ情報 参照するなよw
    不必要な処理で裏じゃこっそりサーバ負荷上げてる

    View Slide

  25. なんでカオス?
    なんでカオス?
    ここまで来ると解ったと思います。
    予期せぬ障害を加えると、ソフトウェアは
    どういう振る舞いをするか?予想するのは困難である
    カオス的な振るまい

    View Slide

  26. 落ちない仕組みにすればいいのでは?
    落ちない仕組みにすればいいのでは?
    落ちずらい仕組みは目指せると思う
    マルチAZ
    フルマネージドなサービス: Aurora
    など

    View Slide

  27. 100%
    落ちないはあり得ない
    100%
    落ちないはあり得ない

    View Slide

  28. お金の問題もある
    お金の問題もある
    マルチリージョン,
    マルチAZ,
    オートスケーリング..
    やればやるほど...
    本当に全部が全部これ必要?
    落とし所は欲しいよね?

    View Slide

  29. 先ほどの検証で解った事
    先ほどの検証で解った事
    今のままじゃダメだw
    コードを修正すればダウンする範囲を限定できそう
    不必要な処理も直せそう

    View Slide

  30. 検知も欲しいよね?
    検知も欲しいよね?
    正常ではないレスポンスの検出
    AWS: Synthetics Canary ..etc
    独自に作ってもいいのでは?
    今回の検証で
    どこに仕掛ければ良いか?
    勘所が把握できたはず

    View Slide

  31. まとめ
    まとめ

    View Slide

  32. まとめ
    まとめ
    テストを実施する人に「丸投げ」パターンは限界あるよ
    弱い箇所を知ることが本当に出来る?
    テストする人 =
    構成を把握してますか?
    「構成」を把握してないと「どこに何が潜んでいそうか?」
    判断しずらいよね?
    「落とす」ことにより色々発覚する

    View Slide

  33. まとめ
    (
    心構え
    )
    まとめ
    (
    心構え
    )
    カオス =
    怖い =
    触りたくない ->
    これじゃダメ
    どう向き合うか?が重要
    向き合う考え方をまとめたものがカオスエンジニアリング
    予期せぬ挙動 =
    ダメ ではない
    予期せぬ挙動が解った =
    前進である

    View Slide

  34. 余談
    余談
    web+db press
    復活して欲しい
    休刊なので
    お待ちしてます!
    Software Design
    しばらく読んでます
    Netflix
    こういう話題多いよね?

    View Slide

  35. ご清聴
    ご清聴
    ありがとうございました。
    ありがとうございました。

    View Slide

  36. View Slide