こんにちは。
今回は、Azure Web Apps の Deployment Slot についてです。
機能的には、ステージング環境を簡単に作れる機能ってことは、ご存知の方も多いと思います。
そんな方は、復習くらいの軽い気持ちで読んでいただくといいと思います。
Azure Web Apps のステージング環境
Deployment Slot をご存知ない方にも、是非使っていただきたいと思いますので、簡単な説明を。
一言で言っちゃえば、
Azure Web Apps を使った環境で、簡単に Blue-Green Deployment ができる機能です。
(雑すぎ??)
Blue-Green の環境をお持ちでない方は、リリース管理って大変だと思うんですよね。
というのは、本番環境にリリース作業をしないといけないからです。
本番環境にリリース作業をしなければいけないということは、以下のリスクがあります。
- 本番環境のサービスを止めないといけない。
- テストがいくらされていても、リリース作業でのミスが起きるリスクは0にできない
- テストがいくらされていても、リリースに問題があり切り戻しをするリスクは0にできない。
Blue-Green の環境を持てば、この辺の問題をそこそこ解決してくれます。
ひとまず、Azure の Web Apps でステージング環境を構築するドキュメントはこちら。
実際に試してみた
今回は、こんな感じで運用スロットとステージングスロットで、同じDB接続している環境を想定してみました。
このケースであれば、Web サーバでの DB 接続文字列は、Web.config に書いちゃってもいいですね。
てことで、普通に入れ替え。
今回は、空っぽのアプリと一度デプロイしたアプリで入れ替えてます。
(でも、入れ替え前/入れ替え後のスクショとり忘れちゃったので、雰囲気感だけ。。。)
[空っぽのステージングスロット]
[運用スロットはデプロイされてる。(2枚目はDB処理あり)]
スワップはこのボタンを押すだけですね。
この辺はいいですよね。
で、この後にシステムの改善で、DB にマイグレーション(変更)が入ったとします。
RDB を使っている以上、運用スロットとステージングスロットでは、別DBを使うしかないですね。
こんな感じを作るわけです。
ひとまず、DBのクローンはこれでさくっとやっちゃいますか。
DB の接続を変えるのに、Web.configを書き換えたプロファイルを用意してもいいんですけど、スロットとweb.config をセットで管理するのがめんどくさいので、Application Setting で接続文字列を管理するのもありだと思います。
こんな感じっすね。
で、まずはステージングスロットにデプロイ & DBマイグレーションしちゃいましょう。
[本番はこんな感じで]
[ステージングはこんな感じですね]
ここでスワップするとこうなります。
[運用スロット]
[ステージングスロット]
画像が小さくてわかりにくいかもしれませんが、URL がちゃんと入れ替わってます。
これなら、リリース後に問題あってもすぐにもどせますね。
(※ 実際にシステムでは、ステージングスロットで検証してからスワップとなるので、その間に運用スロットのデータが進化するので、データのマイグレーションが必要となると思います。戻しのときも一緒ですね。)
まとめ
ドキュメントにも載ってるのですが、大切なことなので書きますが、スワップをする際に引き継がれる設定と引き継がれない(スロットに固有)の設定があります。
今回の例では、以下は見えたと思います。
■スロット固定の設定
- URL
■スロット固定ではない(スワップした際にそのまま引き継がれる)
- DBの接続文字列(Application Setting の Connection Strings)
ドキュメントでは、
■スワップされる設定:
- 一般設定 – フレームワーク バージョン、32/64 ビット、Web ソケットなど
- アプリ設定 (スロット固有として構成可能)
- 接続設定 (スロット固有として構成可能)
- ハンドラー マッピング
- 監視と診断の設定
- Web ジョブ コンテンツ
■スワップされない設定:
- 発行エンドポイント
- カスタム ドメイン名
- SSL 証明書とバインド
- スケールの設定
- Web ジョブ スケジューラ
と書いてありますね。
この辺を理解しながら、ステージングスロットを使っていくと、雑に運用ができてくると思いますので色々と試していただければと思います。
また、今回は DB の接続文字列をApplication Settings で持たせる方法を書きましたが、VSTS などでWeb.config を書き換える方法を使うこともできます。
ただその場合は、リリースパイプラインを、ステージングスロット用と本番スロット用に分ける必要があるのと、運用スロットにリリースする際には常にデプロイをしなければいけなくなるというデメリットもあります。
この辺は、何を優先させるかという部分で、使いわけが必要かもしれませんね。
コメント