【Azure DevOps】Releasesの承認機能を使ってWebAppのスワップを安全に実施する

アプリケーションをデプロイする際にWebAppのスワップ機能を使いたい
以下記事でも触れているが、
> deployの実行のみでは明示的なイメージの再起動とプルは行いません
そのため、無理やりですがTaskとして再起動を実施しています。
※アプリケーションの瞬断が発生するので気になる方は一度デプロイスロットにデプロイ⇒スロットを再起動⇒スワップで回避できます

これを回避するためにデプロイメントスロットを採用、さらに今回はスロット側で実際のアプリの挙動を確認した上でブルーグリーンデプロイメントを実現するため、Releasesの承認機能を使って、特定のユーザーが承認アクションをしないとスワップされないようにする

ベースとなるDevOpsの設定や、WebAppについてはこちらの記事を参照

https://qiita.com/Yosuke_Sakaue/items/aad936218dde42411bb2

https://qiita.com/Yosuke_Sakaue/items/4e1692596b456b74b697

## WebAppにデプロイメントスロットを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/51adf2d1-c167-06c5-9920-52c914a54f06.png)

stagingで作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/7f4dba72-228f-5cd0-6c67-234d72f9e346.png)
運用スロットの「アプリケーション設定」をスロット側にも設定しておく必要がある（DevOpsでデプロイした際に運用スロットには自動で設定されている値）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/d75dc3ae-cdbf-c0d1-f326-c6b3c7f268d0.png)


現在はどちらも同じイメージで実行されている
- 運用スロット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/24b67afc-c7af-9f54-905b-b2ef16ef10a5.png)
- stagingスロット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/3242492e-f108-e2be-c657-e505287b56e8.png)

## DevOpsのReleasesを修正
***Stage 1のデプロイ先をstagingスロットに変更***
「Azure App Service deploy」Taskの「Deploy to Slot or App Service Environment」にチェックをいれ、スロットの情報を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/c998ba07-2378-e157-c261-7afdefd74a35.png)

***後続の再起動Taskもstagingを先どうするように修正***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/c31b0eb0-02eb-24f5-e2c9-08561d92ddc2.png)

***Stageを追加***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/553a4ea0-cbef-e133-6abf-e6e5cd1fb94f.png)

***「Azure App Service manage」TaskでSwap Slotsを選択***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/ec15e50f-ba58-29ce-f55d-b8466b0f0fea.png)

***承認機能の有効化***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/dc45b991-e069-10b1-e172-7da42cf9c195.png)
「Pre-deployment approvals」を有効化し、承認するユーザーを選択（グループを指定することも可能）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/3ca70aec-0bfe-d100-6d92-bb3c1055890d.png)

## 動作確認
アプリケーションを修正してコミット⇒Pipeline⇒Releasesの順で実行される

ReleasesのStage1実行後に承認プロセスが挟まり、承認者が承認するまでStage2は実行されない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/478f2db4-c1b9-40e5-951e-76c665f5d22a.png)

この時点ではStagingスロットのみ更新されていればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/9dc943ff-8637-7172-5af8-0b71fe393685.png)

承認者にはメールで通知が来ているので、Stagingでアプリケーションの動作を確認して問題なければ承認する
※承認コメント、却下コメントを残すことも可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/da71fca3-1a41-6d08-a3fe-0dec73d0962b.png)

スワップが成功して環境が入れ替わっていればOK
※コンテナimageのtagを「latest」などの固定値にしてしまっているとスワップしたタイミングで両環境ともPullが実行され、同じ更新が実施されてしまうので注意
・切り戻しができなくなる
・tagを動的に変更する方法は[前回の記事](https://qiita.com/Yosuke_Sakaue/items/4e1692596b456b74b697)を参照
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/c0093922-b4f7-9ffb-67dd-2713450f4023.png)

以上