AppServiceのデプロイスロットを使って運用環境とステージング環境を切り替える
はじめに
AppService WebAppsでアプリをリリースする場合、従来であれば運用環境とステージング環境を切り替えるために、別々のWebAppを用意していました。しかし、WebAppのデプロイスロットを使うことで、同じWebApp内で運用環境とステージング環境を切り替えることができます。この記事では、AppService WebAppsのデプロイスロットを使って、運用環境とステージング環境を切り替える方法を紹介します。
前提
- 実行している App Service プランのサービス レベルが Standard、Premium、または Isolated であること。
https://learn.microsoft.com/ja-jp/azure/app-service/deploy-staging-slots?tabs=portal
事前準備
AppService WebAppの払い出し
まず、試すためのAppService WebAppを作成します。
この内容で作成します。
アプリの動確 ※スロット利用なし
稼働確認のためのアプリでは、環境変数「ENVIRONMENT_NAME」の値を取得し、画面に表示します。
環境変数「ENVIRONMENT_NAME」は、各スロット固有の設定とみなします。
※実際のアプリでは、DBへの接続情報などが該当しますね。
- 運用スロット:「Production」
- Stagingスロット:「Staging」
アプリのソースコードはこちらです。 超簡易的な画面です。
import os
import streamlit as st
st.title("Deployslotの稼働確認用画面")
st.subheader(f"この環境は \"{os.environ['ENVIRONMENT_NAME']}\" です。")
WebAppには以下の二つの設定をしました。
StreamlitをWebAppで起動するために、スタートアップコマンドを設定
python -m streamlit run app.py --server.port 8000 --server.address 0.0.0.0
WebAppの構成ページから環境変数を追加します。
- 「ENVIRONMENT_NAME」の値に「Production」と設定します。
- 「SCM_DO_BUILD_DURING_DEPLOYMENT」の値に「1」と設定します。
※デプロイ時に、requirements.txtがある場合に、pip installを実行するための設定です。
デプロイして、アプリ画面を確認
環境変数「ENVIRONMENT_NAME」の値に「Production」と設定したので、画面にもその値が表示されています。
デプロイスロットの作成と設定
ここからが本題です!
デプロイスロットの作成
まずはデプロイスロットを作成します。名前は「staging」とします。
デプロイスロットが作成されました。
アプリ構成のための設定
作成されたデプロイスロットをクリックし、stagingスロットに対してアプリ構成のための設定をします。
スタートアップコマンド
python -m streamlit run app.py --server.port 8000 --server.address 0.0.0.0
環境変数
- 「ENVIRONMENT_NAME」の値に「Staging」と設定します。
- 「SCM_DO_BUILD_DURING_DEPLOYMENT」の値に「1」と設定します。
StaginsSlotへのデプロイ~スワップ ※期待通りに動作しません
コードは、6行目のsubheaderを追加しただけです。
import os
import streamlit as st
st.title("Deployslotの稼働確認用画面")
st.subheader("Stagingスロットを設定しました。")
st.subheader(f"この環境は \"{os.environ['ENVIRONMENT_NAME']}\" です。")
WebAppにデプロイします。
※今回はVSCodeからの手動デプロイで動作確認しますが、実際の利用ではGitHubActionsを用いたCICDを使って自動化することが望ましいです。
デプロイ後、StagingスロットのURLにアクセスします。
URLは、運用スロットのURLに「-staging」を追加したものです。
(例)https://deployslot-testapp-staging.azurewebsites.net/
問題なく、アプリの更新がStagingスロットに反映されています。
アプリの稼働確認ができたので、運用スロットとスワップします。
ソースとターゲットのスロット名と、構成変更内容(今回だと環境変数のみ)を確認して、スワップします。
スワップが完了したあと、運用スロットのURLにアクセスします。
(例)https://deployslot-testapp.azurewebsites.net/
期待通りのスワップ
ここからが、やりたいことを実現するために必要な追加設定です。
運用スロットの環境変数に対し、「デプロイスロットの設定」にチェックを入れます。
Stagingスロットの環境変数に対し、「デプロイスロットの設定」にチェックを入れます。
さて、もう一度スワップしてみます。
「デプロイスロットの設定」にチェックを入れたため、環境変数はスワップの対象外となります。
運用スロットのURLにアクセスします。
(例)https://deployslot-testapp.azurewebsites.net/
アプリはスワップされ、環境変数は運用スロットに設定されていた「Production」がそのまま引き継がれています。期待通りの結果です。
まとめ
AppService WebAppsのデプロイスロットを使うことで、運用環境とステージング環境を切り替えることができます。運用環境への影響を最小限に抑えながら、新しい機能のテストやバグの検証できるので非常に便利です。
また、スワップ後に不具合が発覚した場合でも、切り戻しが簡単です。再度運用スロットとStagingスロットをスワップするだけで、以前の状態に戻せるからです。
Discussion