業務でLambdaをベースとしたバックエンドをAWSへデプロイする際のデプロイ戦略を検討するなかで学んだことを整理しておきます。
各デプロイ戦略ごとにさまざまな特徴や制約、ロールバック戦略などがあり、とても学びになりました。
同じようにプロジェクトに最適なデプロイ戦略はなにか?と悩んでいる方の参考になれば幸いです。
それではいきましょう!
AllAtOnce(即時反映)
すべてのインスタンスを停止し新しいVerのインスタンスへ更新する方式です。
最もシンプルなデプロイ戦略ですが、欠点として一度に全てのインスタンスを停止するため、サービスが全停止するダウンタイムが生まれてしまいます。
リクエストのルーティング設定などにもよりますが、全停止のタイミングでユーザーからのリクエストが停止状態のインスタンスに送信されるとそのユーザーにエラーが返されてしまいます。
ロールバック戦略
デプロイ後に新Verのインスタンスで不具合が検知された場合、再度旧Verでデプロイする必要があります。
このとき、再度一からデプロイする必要があるため、サービス復旧時間が大きくかかってしまうという欠点があります。
ローリングアップデート
インスタンスを一度に1つずつ順番に新Verへ更新するデプロイ戦略です。
ローリングアップデートの場合、一度に1つずつインスタンスを切り替えるため、全てのインスタンスが停止することはありません。
そのため、AllAtOnceとは違い、サービス全体のダウンタイムが発生することはありません(ゼロダウンタイムを実現可能)。
しかし、ローリングアップデートの実行中は一時的に一部のユーザーは旧Verのサービス、一部のユーザーは新Verのサービスへリクエストが送信されるため、状態管理に気をつける必要があります。
ロールバック戦略
デプロイ中に新Verのインスタンスで不具合が検知された場合、進行中のアップデートが中断され旧Verへ順次戻す処理が実行されます。
デプロイ後に不具合を検知した場合は、再度旧Verでデプロイすることでロールアウトと同じ流れで旧Verのインスタンスへロールバックすることになります。
いずれにしてもAllAtOnceとは違い、ダウンタイムなくロールアウト/ロールバックが行えるという利点があります。
ブルーグリーンデプロイメント
すでに稼働している旧Ver環境(旧Verのインスタンス郡のセット)とは別に新Ver環境(新Verのインスタンスセット)を立ち上げ、旧Ver環境へのトラフィックを新Ver環境へ一括で切り替える方式です。
ゼロダウンタイムを実現でき、かつローリングアップデートのように新旧Verが一時的に混在することもない方式となります。
しかし、新旧Ver環境でアプリケーションを並行して稼働させる必要があるため、共用資源であるデータベースなど新旧Verでのスキーマやデータが異なる場合など、制御が難しい側面もあります。
ちなみにですが、旧Ver環境のことを「グリーン環境」、新Ver環境のことを「ブルー環境」と呼ぶそうです。
ロールバック戦略
新環境へトラフィック切替後に新Verで不具合が検知された場合、旧Ver環境へトラフィックを切り替えるだけで即座にロールバックできることができます。
ローリングアップデートのように段階的なロールバックではなく、即座に切り替えられる点がブルーグリーンデプロイメントの利点になります。
カナリアリリース
新Verのインスタンス(カナリアと呼ばれる)へのトラフィックを徐々に増やす方式です。
(もしくは一部のトラフィックを一定期間カナリアに送信する方式)
特徴としては、新Verのインスタンスで不具合が検知された場合、ユーザーへの影響を最小化できる点にあります。
ただ、ローリングアップデートと同じく、カナリアリリースの実行中は一時的に一部のユーザーは旧Verのサービス、一部のユーザーは新Verのサービスへ送信されるため、状態管理に気をつける必要があります。
ローリングアップデートは1つのインスタンスを新Verへ順々に切り替える段階方式に対し、カナリアリリースは、一部のトラフィックを新Verへ流し不具合が出ないか様子を見るような方式のため、ローリングアップデートに比べて、カナリアリリースのほうがリリース時間(新旧共存時間)が長くなる傾向があります。
ちなみにですが、「カナリアベースロールアウト」や「カナリアデプロイ」とも呼ばれるそうです。
ロールバック戦略
リリース中に新Verのインスタンスで不具合が検知された場合、新Verのインスタンス(カナリア)へのトラフィックを旧Verへすべて戻すことでロールバックが行えます。
また、一部のトラフィックに限定しているため、不具合があった場合でも、ユーザーへの影響を最小化できるという利点があります。
最後に
4つのデプロイ戦略とそれに伴うロールバック戦略について整理してみました。
それぞれの戦略ごとにメリット・デメリットがあり、プロジェクト毎にどの戦略を取るべきか慎重に検討する必要があることが学べました。
また、新Verをリリースした際に不具合があった場合、どのデプロイ戦略を採用するかでサービス復旧時間が大きく変わってくるため、その点も考慮し適切なデプロイ戦略を選択していく必要があることも学べました。
以上