# 善用預備環境,打造 Azure App Service 多環境部署價值 ###### tags: `Technical` `Azure` `App Service` &copy; 2021 All rights reserved. 2021/07/27 IMP Jim Luo ## 前言 在新的系統推送時是否常面臨到需要停機部署的困擾?想要一個簡單的測試環境卻不想使用繁雜的流程?善用Azure App Service中的Deployment Slots「部署位置」,可以讓你輕鬆建立新的環境,達到測試整合與流暢切換更新的系統環境。 ## 優勢 1. 新建立的「預備位置Slot」屬於完全隔離的新環境,不會影響到正在上線的「生產位置Slot」。 2. 每個「部署位置Slot」是具有自己主機名稱的即時應用程式,各自擁有獨立的FQDN可以進行訪問。 3. 您可以先驗證「預備位置Slot」中的更新系統,再將它與「生產位置Slot」進行交換。 4. 透過交換功能,可以確保「預備位置Slot」交換到「生產位置Slot」之前都已準備就緒,這麼做可以排除部署時的停機情況。 流量能夠順暢地重新導向,且不會因為交換作業而捨棄任何要求。 5. 您可以透過「自動交換」來自動化整個工作流程。 6. 每個 App Service 方案層所支援的部署位置個數都不一樣。使用部署位置**不會產生額外費用**,詳細請參考方案層的限制。 ## 藍綠部署的解決方案 我們可以透過App Service提供的新建位置Slot功能,來達到藍綠部署的解決方案,舉例來說,原本的環境位置是V1版本「藍色」,我們建置同等條件的環境位置來做為V2版本「綠色」的驗證,當新版本滿足上線條件的測試後,將兩個部署環境直接做交換,以達到流量負載從V1版本更新至V2版本的動作。 後續的V3版本會在部署到舊的V1版本的位置「藍色」,並再一次驗證測試條件滿足後再一次進行交換,如此形成一個持續傳遞(CD)的概念。 ![](https://i.imgur.com/GerkQLc.png) ![](https://i.imgur.com/7onf190.png) ## 新增Slot流程 在Azure入口網站中,搜尋並選取「App Services」,然後選取您的應用程式。 ![](https://i.imgur.com/us47sVi.png) 在左側選單中,選取 「Deployment Slots」 => 「Add Slot」。 ![](https://i.imgur.com/kIaZWV5.png)   在對話方塊中,指定位置名稱,例如我們命名為staging,然後選取是否要複製設定,選取「新增」以繼續。 ![](https://i.imgur.com/JTXs5se.png) ※您可以從任何現有的位置複製設定。可複製的設定包括應用程式設定、連接字串、語言架構版本、Web 通訊端、HTTP 版本和平台位元。 根據預設,新位置的「Traffic %」會設定為0,並將所有客戶流量路由傳送至生產位置。點選新的位置,已開啟該位置的資源介面。 ![](https://i.imgur.com/jLXZ6ui.png) 「預備位置Slot」和任何其他的App Service應用程式一樣,具有自己的管理頁面,應用程式名稱會顯示為 <app-name>/<slot-name>。 ![](https://i.imgur.com/vvIvM0A.png) ## 交換Slot功能 在左側選單中,選取 「Deployment Slots」 => 「Swap」。 ![](https://i.imgur.com/j5nNzdH.png) 選取「Source」和「Target」的Slot位置名稱,確認下方的設定是否符合預期,並按下「Swap」進行交換。 ![](https://i.imgur.com/CMjwGId.png) ※倘若系統在交換後發生問題,可以選擇同樣的兩個Slot再進行一次交換以還原成先前的狀態。 ## 金絲雀部署的解決方案 雖說自動化測試與部署是最為理想的狀態,但與實際環境的測試仍有些許差別,在這樣的情況下我們可以透過導流一小部分的流量來進行穩定性測試,通常流量會按照設定的比例分配,例如90%的請求流向版本A,10%的流向版本B,以達到更進一步的錯誤評估與效能監控。 ![](https://i.imgur.com/UquzfcF.png) ## 路由流量 針對您要路由到的位置,在其「Traffic %」中指定百分比 (介於 0 到 100 之間),以代表您要路由的總流量。設定以後選取「Save」。 ![](https://i.imgur.com/EFxaicn.png) 儲存設定之後,會將指定百分比的用戶端隨機路由傳送至非生產位置。 用戶端瀏覽器中,您可以查看 HTTP 標頭中的 「x-ms-routing-name」Cookie紀錄,例如x-ms-routing-name=staging,而生產位置為x-ms-routing-name=self。 ![](https://i.imgur.com/HxtQAsS.png) 若要手動進行連線選擇Slot,也可以透過設定x-ms-routing-name在get/post連線參數之中,例如:http://<webappname>.azurewebsites.net/?x-ms-routing-name=self來進行訪問。 ## 刪除Slot 選取欲刪除的位置Slot內,點選「Delete」已進行刪除。 ![](https://i.imgur.com/owHYlRT.png) ※提醒您務必確認刪除的名稱為正在查看的部署位置。 ## 參考連結 https://docs.microsoft.com/en-us/azure/app-service/deploy-staging-slots