kokoni

クラウドおじさんの備忘録

Azure Web Appsでカナリアリリースを試してみた

本投稿はAzure Advent Calendar 2019の4日目の投稿になります。

qiita.com

Azure WebAppsのデプロイスロットには設定した割合によってトラフィックルーティングを行える機能があります。

docs.microsoft.com

この機能を利用することでカナリアリリースを実施することができます。

※この記事は2019年12月4日時点の情報になります。

カナリアリリースとは

従来のデプロイ方法だとステージング環境にデプロイを行い、テストを行ったうえで問題がないようであれば本番環境にSwapするブルーグリーンデプロイメント方式が一般的だと思います。カナリアリリースは本番環境に部分的にデプロイを行い、ロードバランサのトラフィックの割合を設定してルーティングによる制御をおこなう方法です。

f:id:kingkino:20191201213631p:plain

カナリアリリースは、アプリケーションの変更をゆっくりと段階的にリリースすることが可能なので、一部のユーザにリリースをしアプリケーションが期待どおりに動作しているかどうかを確認することができます。期待どおりの動作をしている場合は、トラフィックの割合を増やしていき、新しいバージョンを利用するユーザを増やしていきます。最終的には新しいバージョンのアプリケーションに置き換わるようにします。問題が発生した場合はパーセンテージの割合を100:0に設定することですばやくロールバックできます。

もともとは炭鉱で猛毒ガスが発生した時の早期警戒システムとしてカナリアが利用されたことに由来します。ちょっと残酷な気もしますが昔はカナリアを蘇生させるための機材がついてたそうです。余談ですがカナリアを利用した安全確認は、1995年の「地下鉄サリン事件」の時に地下鉄の安全性を確認するために利用されたのをテレビで見てたなと書きながら思い出しました。

カナリアリリースを試してみる

それではカナリアリリースを試してみたいと思います。基本的にはMS Docksに記載のある事を試しただけになります。 まずはWebAppsを作成してサイトをデプロイします。次にWebAppsの「デプロイスロット」から非運用スロットを作成します。

f:id:kingkino:20191201205929p:plain

非運用スロットを作成したら次に「トラフィック%」を設定します。Azure Portalはよく出来ていて運用スロット側のパーセンテージは設定できません。追加で作成したスロット、ここでは非運用スロット用に作成したスロット側に設定ができ自動計算で合計で100%になるようにしてくれます。

パーセンテージを変更したら保存をしましょう。 画像では本番:90%・非運用スロット:10%に設定していますが検証しやすいように50:50で設定してみてください。

f:id:kingkino:20191201205932p:plain

設定が完了したらサイトアクセスします。カスタムドメインを設定しているならそのURLを、カスタムドメインを設定しない場合は運用スロットのURLにアクセスしてみましょう。50:50で設定していれば2分の1の確率で接続が切り替わると思いきや、セッションが固定されるため有効期間中はセッションが固定されているスロットに接続しつづけます。ちなみにCookieの有効期間は1時間です。

どのスロットに接続しているかはCookieを見ることで判断できます。ブラウザで確認もできますが、Postmanみたいなツールを利用して確認することもできます。ここではPostmanで実行した結果を見てみたいと思います。対象のURLにアクセスしたあとにCookiesをみると「x-ms-routing-name」という設定値があります。ここが「self」だと運用スロットにリダイレクトされます。

f:id:kingkino:20191201214541p:plain

有効期間が来るのを待つのは時間がもったいないのでPostmanからCookieを削除して非運用スロットにアクセスするか試してみます。 Cookieの削除はPostmanの右上にあるCookiesを選択すると削除ができます。ブラウザでも可能ですが大量のCookieの中から対象のCookieを検索して削除するのはめんどくさいと思うのでやっぱりPostmanみたいなToolを使うほうがいいですね。

f:id:kingkino:20191201215341p:plain

ここで削除して何度か接続を試してみましょう。「x-ms-routing-name」の内容が変わっていれば非運用スロットに接続できたことになります。Valueに設定されている名称はSlot作成時の名前になります。

f:id:kingkino:20191201215707p:plain

「x-ms-routing-name」はクエリパラメターとしても設定可能です。特定のスロットにアクセスしたい場合、例えば新バージョン側にアクセスしたい時にURLに追加することで特定スロットにアクセスできます。

{webappname}.azurewebsites.net/?x-ms-routing-name={特定のSlot名}
 ※運用スロットの場合はselfを指定

上記のクエリパラメータを利用したアクセス方法を使えば「トラフィック%」を0に設定したとしても直接アクセスできるのでサイト確認を行えます。

まとめ

以前からもTraffic ManagerのPriorityやWeightedを利用するこでWeb Appsを利用したカナリアデプロイを実施することは可能でした。 データセンターを超えた冗長化を前提に考えるとTrafficManagerを利用したほうがいいのですが、単一データセンターで運用するのであれば今回の方法を利用することで、非常に簡単にカナリアデプロイを実施することが可能になります。

実際の業務で利用するケースにまだ出会ったことはないのですが、利便性が高いので今後機会があれば使っていきたいと思います。