クラウドでインフラを組む時の設計原則に、 Design for Failure というものがある。 障害は必ず起こるものなのだから、それを前提にシステム設計をしましょう。という話だ。

障害に備えた設計とはなにか

障害に備えた設計とは。

  • 障害を起こさないような設計
  • 障害が起きた後の素早い復旧のための設計 のふたつがある。

AWSでいうと、前者はEC2の冗長化とロードバランシング・RDSのマルチAZなどが当てはまり、 後者はRDSのフェイルオーバーやCloudWatchアラームなどが当てはまる。

障害が起きた後はどうすればいいのか

障害が起きた後は、復旧しなければいけない。 復旧するためには、以下のようなことを考える必要があると思う。

  • 障害をパターン化(抽象化)し、対応手順を決める
  • 対応手順を、エンジニア全員が把握し、慌てずに対処できるようになる
  • なにをもって復旧したといえるのかを考える

例えば、RDSに障害が起きて、ネットワーク要因でフェイルオーバーが効かなかったらどうすればいいのか? インフラ要因でなく、オペミスが起きたらどうすればいいのか? 障害を抽象化することができれば、どこをバックアップしておけばいいのか、どこを監視しておけばいいのかを決めることができる。

また、復旧したということを確かめるにはどうすればいいのか。 このテストが通ったらシステムは正常に稼働している、というテストがあればいいかもしれない。 監視項目に異常がないからシステムが正常に動いている、とは厳密には言えないので、難しい。