Azure App Service や Azure Functionsのアプリケーション設定におけるデプロイスロットのチェックの挙動について

# 背景

[ステージング環境を設定する-スワップされる設定](https://docs.microsoft.com/ja-jp/azure/app-service/deploy-staging-slots#which-settings-are-swapped)

↑に記述されているアプリケーション設定のスワップの挙動について、AzureのAppService(WebApps)やAzure Functionsのアプリケーション設定（≒環境変数）に「デプロイスロット」というチェックボックスがどのような作用をするかを検証したときのメモです。

まあ、わかる人は↑のドキュメントを見るだけでわかるかとは思います。。

# 事前準備

## 検証用のリソースの作成

ここではApp Serviceを例にします。
まず、App Serviceのリソースを適当に作成して、以下のようなアプリケーション設定をします。

| 名前 | 値 | デプロイ スロットの設定 |
| --- | --- | --- |
| SLOT_OFF | ORIGINAL | OFF |
| SLOT_ON | ORIGINAL | ON |

![original-slot-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205949/314f3249-b355-eff2-7462-d3db2593f891.png)

## デプロイメントスロットの作成

前項で作成したApp Serviceのリソースのデプロイメントスロットを作成します。
このとき、「次から設定を複製」で作成済みのオリジナル？のスロットを選択することで前項で設定したアプリケーション設定はデプロイスロットにもコピーされます。

![create-deploy-slot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205949/8b288779-ab79-4d06-831c-b4066c5f6769.png)

# デプロイスロットのON/OFFによる挙動確認

## スロット側のアプリケーション設定値の更新と追加

作成したデプロイスロット側のアプリケーション設定を以下のように更新＆追加してみます。

| 名前 | 値 | デプロイ スロットの設定 | 備考 |
| --- | --- | --- | --- |
| NEW_SLOT_OFF | NEW_DEPLOYME NT | OFF | 追加 |
| NEW_SLOT_ON | NEW_DEPLOYMENT | ON | 追加 |
| SLOT_OFF | DEPLOYMENT | OFF | 変更 |
| SLOT_ON | DEPLOYMENT | ON | 変更 |

![add-and-update-app-settings-on-deploy-slot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205949/f417a183-a953-f5c0-7999-ae3ef93dee13.png)

# スワップ前後のアプリケーション設定を確認（本題）

## スワップ前

スワップ前は前述の事前準備に記載した状態ですが、比較のための再掲載。

運用スロット
![before-swao-ope-slot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205949/dc66413e-fd1f-140e-b27b-d1d64788469f.png)

デプロイスロット
![before-swap-deploy-slot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205949/c547817e-1fc1-e808-d8dc-bd7db12d421d.png)

## スワップ操作

スワップ操作をするときにソースとターゲットの構成設定がどのようになるかを事前にお知らせしてくれる。
これは非常にありがたい機能！！
![swap-source-change.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205949/dc052ffe-b72b-01d6-cdf3-8391b095cd77.png)
![swap-target-change.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205949/23dc10a7-8f47-22e3-7786-ba21aaaa70f5.png)


## スワップ後

運用スロット
![after-swap-ope-slot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205949/b2636e91-431a-0b77-fa07-2120dc0f5584.png)

- NEW_SLOT_OFF  
  => スワップ前のデプロイスロットの値"NEW_DEPLOYMENT"がスワップされて運用スロットに反映されている
- NEW_SLOT_ON  
  => スワップ前のデプロイスロットで「デプロイスロットの設定」がONなのでスワップされず、運用スロットには存在しない
- SLOT_OFF  
  => スワップ前のデプロイスロットの値"DEPLOYMENT"がスワップされて運用スロットに反映されている
- SLOT_ON  
  => スワップ前の運用スロットで「デプロイスロットの設定」がONなのでスワップされず、もとの"ORIGINAL"のままになっている


デプロイスロット
![after-swap-deploy-slot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205949/52f47249-2abb-dbfb-9aad-a77f6038d7eb.png)

- NEW_SLOT_OFF  
  => スワップ前の運用スロットには存在しないので、スワップされた結果、デプロイスロットには存在しない。
- NEW_SLOT_ON  
  => スワップ前のデプロイスロットで「デプロイスロットの設定」がONなのでスワップされず、スワップ前のデプロイスロットの値"NEW_DEPLOYMENT"のままになっている。
- SLOT_OFF  
  => スワップ前の運用スロットの値"ORIGINAL"がスワップされてデプロイスロットに反映されている
- SLOT_ON  
  => スワップ前のデプロイスロットで「デプロイスロットの設定」がONなのでスワップされず、デプロイスロットで変更したの"DEPOYMENT"のままになっている

# まとめ

- スロット生成時はオリジナル（コピー元）のスロットを指定して構成設定を複製することができる
- スロット作成後のアプリケーション設定はスロット毎に固有の値となり、共有されているわけではない。  
  => つまり、変更・追加する場合は両方のスロットに対して設定しなければならないのでスロットの作成はなるべき、すべての構成設定を終えてからやったほうが良さそう。
- スワップをするとデプロイスロットのアプリケーション設定が運用スロットに反映される（逆に運用スロットの設定がデプロイスロットに反映される）  
  => つまり、アプリケーション設定もスワップされる。
- アプリケーション設定の「デプロイスロットの設定」にチェックを入れた値に限りスワップされない。  
  =>つまり、チェックをONにしておいたアプリケーション設定値はスワップをしてもスワップ前の運用スロットのアプリケーション設定がそのまま残る。


# 所感

個人的な意見になりますが、この「デプロイスロットの設定」という名前がわかりづらさを冗長している気がします。
ちょっと文字数増えるけど、「デプロイスロット固有の値」とかの方が良い気がします。
せめて、infomationアイコンとかをクリックすると「チェックをするとスロット固有の設定になり、この値はスワップされません」と書いてくれればみんなわかるとおもうだけどなぁ。。

と細かい点ではいろいろ思うところはありますが、総じて言えばこのデプロイスロットという仕組みはとても便利です！！
強いていえば、「App Service プランのサービス レベルが Standard、Premium、または Isolated である場合」しか使えないので、個人でお勉強する場合などでちょっとお試しするのにはハードルが高いのがネック。。

# 参考リンク

- [Azure App Service でステージング環境を設定する](https://docs.microsoft.com/ja-jp/azure/app-service/deploy-staging-slots)
- [AppServiceの制限](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/management/azure-subscription-service-limits#app-service-limits)