Azure Logic Apps Standardのデプロイメントスロットを試してみる

この記事は [セゾンテクノロジー Advent Calendar 2024](https://qiita.com/advent-calendar/2024/saison-tech) 1日目の記事です。

Microsoft Ignite 2024でAzure Logic Apps StandardのデプロイメントスロットがGAしました。
App Serviceのデプロイメントスロットと同じかなと予想しつつも、どういう使い勝手なのか検証してみたので書き残します。

# デプロイメントスロット？
* 複数の環境を作成してアプリケーションをデプロイできる機能です
* 例えばアプリをバージョンアップする際に、Stagingスロットを作成して、まずはそこにデプロイする。テスト完了後にProductionとStagingスロットを入れ替え（スワップ）することで無停止でのアプリケーションデプロイを可能にします
* 切り戻しも再度スワップすることで即座に行うことが可能です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/bb2d1adc-b532-f2ae-9197-74876a96e7c0.png)

# デプロイメントスロットが利用できるプラン
* Logic Appsのプランは大きく2種類あります
    * 従量課金プラン（マルチテナント）
    * Standardプラン（シングルテナント）
* デプロイメントスロットが利用できるのは **Standardプラン** のみとなります

# Logic Appsワークフロー準備
* 今回テストのため以下のシンプルなワークフローをAzure Portalから作成しました
    * 特定のBLOBストレージにオブジェクトが配置されたらメールを送信するというものです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/7d89311a-3f9f-dbca-2b2a-75f6a4559277.png)
    * メール本文にはv1とだけ書いてます
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/7b7a1797-44d5-9f03-be0d-1901fc9efa7b.png)

* ステージングデプロイメントスロットではメールの文言を変えて、スワップしたときに正しくデプロイされたかを確認してみたいと思います

# デプロイメントスロット作成
* Portalの左メニューより[デプロイスロット]を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/32621cb6-119f-dcf3-67f5-4567d36405c4.png)

* [追加]を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/696be547-452b-f094-8fbe-fed81ff83872.png)

* スロット名を入力します。今回はstgと入力します
    * このときLogic Appsのエンドポイントは ```[Logic Apps Name]-stg.azurewebsites.net``` という形で作成されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/5d701891-5cf9-00ac-ab86-1be7663bef38.png)

* スロットを選択すると新しいLogic Appsが作成されていることが確認できます
* stgスロットのLogic Appsでワークフローを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/8a52d4b8-3797-e383-fbd2-f2228188408a.png)

* ワークフローは空で作成されるようです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/7582b740-0483-20e1-f36d-a6bb29f2ba7e.png)

# stgスロットでワークフロー作成
* Portalからワークフローを作ろうとしたところグレーアウトされて作成ができませんでした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/f1cc549a-d52f-d240-5bd9-a18d1358d8e3.png)

* 調べてみるとPortalからは読み取り専用となっているようです。なので、スロットにワークフローを作成するには、VS CodeからデプロイもしくはAzure CLIで資産をzipアップロードする必要があるということが分かりました

* 今回はAzure CLIでのzipアップロード方式を試してみることにします

# アプリコンテンツダウンロード
* デプロイメントスロットは削除しておきます
* ProductionのLogic Appsに戻って、左メニューの概要から[アプリコンテンツのダウンロード]を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/25858197-3468-7e39-5b5f-2023b035c370.png)

* [ダウンロード]を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/d292b72a-51a9-2872-e7db-0458ce68a011.png)

* zipファイルでローカルにダウンロードされるので展開します。展開するとワークフロー名のフォルダの配下にworkflow.jsonファイルがあるので開きます

* 開いたらメールの本文をv2に変更します

```
                    "body": {
                        "To": "[Your mail address]",
                        "Subject": "logic apps test",
                        "Body": "<p class=\"editor-paragraph\">v2</p>",
                        "Importance": "Normal"
                    },
```

* Azure CLIで以下コマンドを実行してステージングスロットにデプロイします

```
az logicapp deployment source config-zip --name [Logic Apps Name] --resource-group [Resource Group Name] --slot [slot Name] --src [Logic Apps Name].zip
```

* ステージングスロット側にワークフローが作成されていることが確認できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/001b49cc-c90c-be58-6749-da9b77b0eb6e.png)

* メール本文もv2に変更されてますね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/a16b7d0a-3afb-1f19-2152-0d052e56d1c5.png)

* ここで気付いたのが、ステージングスロットでは手動での実行ができないようです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/182676b9-fb53-2c4f-a173-5e2f80b003e1.png)

* ではこの状態でBlobトリガーはプロダクションとステージング両方反応するのか？という疑問が生まれたので試してみました。結論、プロダクション側は動きましたが、ステージング側は動きませんでした
* どうやらデプロイメントスロット側はトリガーに反応しないようです

# スワップ
* それではプロダクションとステージングを切り替えてみます
* デプロイスロットの画面から[Swap]を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/de7ff2ec-df87-9090-2a7e-a010a5e8346c.png)

* ソースとターゲットを選択して、Swap Startボタンを押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/ffda93fc-61ae-bccb-6cd6-d5968fa92289.png)

* 1～2分かかります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/add4cd08-f6d9-a868-0397-5d8ce8fa13ae.png)

* スワップが完了し、再度Blobトリガーで挙動を試してみると、変更したv2の本文でメールがきたことを確認できました
* スワップ後もステージングスロットのBlobトリガーは反応しません

# まとめ
* 今回検証しているといくつかの疑問点が出てきたのでまとめておきます

## スワップ後にPortalから見ても設定が反映されていない？
* スワップ後にPortalから設定を確認しても、なぜか反映がされていません。以下はPortalから見たコード。v1のままになっているが、メールはv2で届いている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/adc017e5-b946-69d4-1dc5-cf1678bf0f48.png)

* scmから実際にデプロイされているコードをみるとv2になっている。謎です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/4aef6caf-6948-3ce9-f1e3-6722fd7b9115.png)

## どういう利用方法がいいのか？
* Portalから編集できずテストもできないということで、利用方法を検討しました。以下のような流れがいいのではと考えています
    * VS CodeでLogic Appsワークフローを作成する（VS Codeでも拡張機能を使えばグラフィカルなワークフローを作成可能）
    * Productionにデプロイする
    * バージョンアップしたい場合は、VS Codeで編集する
    * デプロイメントスロットにデプロイしてもテストはできないため、VS Codeからローカルでテストする
    * デプロイメントスロットを作成してデプロイする
    * スワップする
    * 問題なければデプロイメントスロットを削除する

## 実際使えそう？
* 一番のメリットは無停止でのデプロイだろうなと思います。デプロイ時の停止を極力避けたいのであればこの方法がよいと思います
* 一方で検証したところ上述の通りまだ不安定な挙動があるなと思いました
* Portalでワークフローを作るのではなく、VS Codeで完結するような運用をしていかないとデプロイメントスロットは活用できないかなという印象です

以上です