👾

AppServiceのデプロイスロットを使って運用環境とステージング環境を切り替える

2024/04/16に公開

はじめに

AppService WebAppsでアプリをリリースする場合、従来であれば運用環境とステージング環境を切り替えるために、別々のWebAppを用意していました。しかし、WebAppのデプロイスロットを使うことで、同じWebApp内で運用環境とステージング環境を切り替えることができます。この記事では、AppService WebAppsのデプロイスロットを使って、運用環境とステージング環境を切り替える方法を紹介します。

前提

事前準備

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