🗺️ Azure 服務地圖
運算與容器・網站與 API・AZ-900/AZ-104/AZ-400

App Service 與部署位置:先在 staging 暖好新版,再交換上線

直接覆蓋正式網站,上線那幾分鐘最容易出事,出錯時也很難馬上退回。這一頁讓你搞懂部署位置怎麼交換、哪些設定會被換走,以及哪個方案層級才用得到它。

交換模擬器:設定跟不跟著走 方案層級分診:10 個情境 入口網站 × CLI × Bicep 同步操作

💡 先搞懂問題

假設虛構公司「晴空食品」的網購網站跑在 Azure App Service 上。過去每次上線,工程師都把新版程式直接部署到正式網站:部署的那段時間網站會重新啟動,第一批進來的顧客要等程式載入;新舊檔案交替的瞬間偶爾出現奇怪的錯誤;最麻煩的是新版有問題時,只能把舊版再部署一次,又要再等一輪。新手通常卡在兩個地方:以為「先測試再上線」一定要另外開一個網站、自己切換網域;或者測試環境開了,上線時卻把測試用的資料庫連線一起帶到正式站。

App Service 的部署位置(deployment slot)就是為這件事設計的。一個 Web 應用程式除了正式的 production 位置,還可以再開 staging 等其他位置;每個位置都是獨立運作、有自己網址的應用程式,跑在同一個 App Service 方案(App Service plan)的執行個體上。新版先部署到 staging,暖機、測試,確認沒問題再執行交換(swap),讓正式網址改由已經準備好的新版回應;出問題時,再交換一次就回到舊版。

做法一:直接部署到正式網站 正式網站 v1.4 顧客正在使用 部署 v1.5 中 重新啟動、冷啟動 發現錯誤 重新部署 v1.4 再等一輪 做法二:先部署到 staging,再交換 staging 部署 v1.5 正式網站不受影響 暖機與測試 用 staging 網址驗證 交換 正式網址改由 v1.5 回應 交換後 v1.4 留在 staging 位置,而且還在執行 新版有問題,再交換一次就回到舊版,不必重新部署
上排是直接覆蓋:重新啟動、冷啟動與回復都發生在顧客面前。下排是部署位置:等待與驗證都在 staging 完成,顧客只會碰到「交換」那一下;舊版留在另一個位置,所以回復也是一次交換。

生活比喻:餐廳換新菜單,對調兩個廚房的出餐窗口

一家餐廳要換季推出新菜單。笨方法是營業中直接把廚房的食材和器具全部換掉,換到一半時客人點的菜可能做不出來;新菜不受歡迎,又得把舊食材全部搬回來。這家餐廳的做法不同:它有兩個廚房,前場只有一個出餐窗口。新菜單先在備用廚房試做、讓店員試吃,爐火也先開好;確認沒問題,店長把出餐窗口對到備用廚房,從下一張單開始,客人拿到的就是新菜。新菜出了狀況,再把窗口對調回來,舊廚房的鍋還熱著,馬上就能接手。

還有一個細節:有些東西「屬於廚房」,例如這間廚房接的是哪一條瓦斯管、送貨單寫哪一個倉庫;有些東西則「跟著菜單走」,例如食譜與調味比例。窗口對調時,食譜跟著新菜單一起面對客人,瓦斯管和倉庫則留在原本的廚房。

回到 Azure:兩個廚房就是 production 與 staging 兩個部署位置,出餐窗口是正式網址的路由;「對調窗口」就是交換,App Service 切換的是路由,不是把檔案從一個位置複製到另一個位置。「先開好爐火」對應暖機:交換前,平台先把目標位置的設定套用到來源位置的執行個體並重新啟動,再對每個執行個體送出 HTTP 要求,全部有回應才切換路由。跟著菜單走的食譜,對應會交換的設定,例如一般的應用程式設定、連接字串、執行階段版本;屬於廚房的瓦斯管,對應勾了「部署位置設定」(Deployment slot setting)的設定,以及自訂網域、擴縮設定、受控識別這些本來就不交換的項目。
餐廳換菜單(比喻) App Service 的正式名稱 備用廚房試做新菜 前場唯一的出餐窗口 先開好爐火 把窗口對到備用廚房 食譜跟著菜單走 瓦斯管、送貨倉庫屬於廚房 出狀況再把窗口對調回來 新版部署到 staging 位置 正式網址的路由 暖機:重啟並送出 HTTP 要求 交換(swap) 會交換:應用程式設定、連接字串 部署位置設定、自訂網域、擴縮 再交換一次(回復交換)
左欄是比喻,右欄是正式名稱。實驗室一卡住時可以回來對照:「食譜」那一列預設會跟著程式碼交換,「瓦斯管」那一列則要你主動勾選,或是平台本來就不交換。

這個比喻有三個地方和實際不同。第一,真實餐廳的兩個廚房是兩套設備,部署位置卻共用同一個 App Service 方案的執行個體;staging 跑壓力測試時,production 也會被拖慢,正式的效能測試最好另外開方案。第二,瓦斯管天生就屬於某個廚房,但 App Service 的應用程式設定與連接字串預設是跟著程式碼交換的,要你自己勾「部署位置設定」才會固定在位置上;忘了勾,正式站可能在交換後連到測試資料庫。第三,對調窗口是一瞬間的事,交換卻是一連串步驟,包含重新啟動與暖機,花多久取決於應用程式的啟動速度;它減少的是使用者感受到的中斷,不保證任何變更都能無痛回復,例如新版已經改了資料庫結構而舊版讀不懂,交換回去也救不了。

交換前 交換後 正式網址 顧客連線 staging 網址 測試人員 執行個體群 A v1.4 執行個體群 B v1.5 正式網址 顧客連線 staging 網址 測試人員 執行個體群 A v1.4 執行個體群 B v1.5 執行個體沒有搬家,交換改的是「哪個網址連到哪一組執行個體」
左右兩邊的執行個體位置完全一樣,只有連線改了方向。所以交換很快、回復也快;但正式網址改指向的那一組執行個體,必須事先套好正式環境的設定並暖機,這就是交換前那幾個步驟在做的事。

🎮 互動實驗室一:部署位置交換模擬器

晴空食品的 production 位置跑 v1.4,staging 位置剛部署好 v1.5。下面每一列是一項設定,左右兩格分別是兩個位置目前的值。應用程式設定與連接字串可以勾選「部署位置設定」,讓它固定在位置上;有鎖頭的項目由平台決定,不能勾。工程師已經替部分設定打勾,請先檢查有沒有漏掉,再在每一列勾選「我猜 production 這格會變」,然後按「交換」。交換完會逐列告訴你猜得對不對、為什麼,再按「回復交換」看看舊版怎麼回來。

正式網址(顧客)shop.example.com/app-qingkong.azurewebsites.net目前回應:v1.4
staging 網址(測試人員)app-qingkong-staging.azurewebsites.net目前回應:v1.5

production 位置 勾選「我猜會變」

staging 位置 勾選「部署位置設定」

  1. 把 production 的「部署位置設定」套用到 staging 的執行個體
  2. staging 的執行個體重新啟動,全部完成才繼續;任何一台失敗就中止交換
  3. 暖機:對每個執行個體送出 HTTP 要求,等它回應
  4. 切換路由:正式網址改連到剛暖好的執行個體
  5. 原本 production 的執行個體套用 staging 的設定並重新啟動
還沒交換。先檢查每一列的「部署位置設定」,再勾選你認為 production 會改變的格子。
預測命中 0 / 0
已交換次數 0
畫面說明:載入中。

🎮 互動實驗室二:方案層級分診台

每張卡是一個虛構公司的需求,請替它選一個 App Service 方案層級,或判斷它其實該改用 Static Web Apps、Azure Functions、Container Apps。原則是「選能滿足需求的最低層級」:多付錢買用不到的功能也算選錯。答完會說明理由,選錯時會告訴你你選的那一項缺了什麼或多了什麼;右邊的對照卡會亮起這題用得到的事實。

得分 0 / 0
連續答對 0
畫面說明:先找出卡片裡的「硬需求」:要不要部署位置、幾個;要不要自動調整、依規則還是依流量;要不要扛可用性區域故障;是不是根本不需要常駐的網站。

數字查證:2026 年 10 月,依 Microsoft Learn「Azure 訂用帳戶與服務限制」的 App Service 限制表、App Service 可靠性文件與自動調整文件。價格不在比較範圍內,實際費用請用 Azure 定價計算機估算。

🛠️ 操作教學:建立 Web 應用程式、新增 staging 位置並交換

不用登入 Azure,也能先把流程走一遍。左邊是簡化的入口網站,照步驟填表、按按鈕;右邊同步顯示等效的 Azure CLI 與 Bicep,黃色底的那幾行就是目前這一步對應的指令。你可以故意填錯看看驗證訊息,也可以改名稱、區域或定價方案,看指令怎麼跟著變。

示意畫面:簡化重繪,只保留和本主題有關的欄位;實際畫面以 Azure 入口網站為準。
雲端主控台搜尋資源、服務及文件
同一件事的三種做法:入口網站、Azure CLI、Bicep 最後都把要求送到 Azure Resource Manager(ARM),由它驗證權限與原則、再交給 App Service 建立資源,所以結果相同。入口網站適合第一次摸索、需要看選項說明的時候;CLI 適合寫成腳本、在 Cloud Shell 或部署管線裡重複執行,交換這種「動作」也最常用 CLI 或管線工作來做;Bicep 是宣告式的基礎結構即程式碼,描述「最後應該長什麼樣子」,適合正式環境版本控管與審查。要注意 Bicep 描述的是資源,交換不是資源,所以範本裡只會看到方案、Web 應用程式、位置與 slotConfigNames,交換仍要另外執行。

自己動手時要注意

權限方面,在資源群組上至少要有「參與者」(Contributor)角色,或是包含 Web 應用程式與 App Service 方案寫入權限的角色;只執行交換的部署身分,可以只給該 Web 應用程式範圍的權限。費用方面,Free 以外的方案只要存在就按執行個體持續計費,練習用的 Standard 或 Premium 方案即使沒有流量也會產生費用;部署位置本身不另外收費,但它們跑在同一個方案的執行個體上。練習完請把整個資源群組刪掉,裡面的方案、Web 應用程式與位置會一起刪除:

# 練習完刪除整個資源群組(--no-wait 讓指令不必等刪除完成)
az group delete --name rg-shop-demo --yes --no-wait

範例裡的名稱都是示意。不要把真實的密碼、金鑰、連接字串或訂用帳戶 ID 寫進指令、範本或截圖;需要時用 <your-subscription-id> 這類佔位字,正式環境的祕密放在 Key Vault,再用 Key Vault 參考或受控識別讓 App Service 讀取。

📘 原理補完

方案、Web 應用程式、部署位置是三層不同的東西

Azure App Service 是 PaaS 的網站與 API 代管平台:你部署程式碼或容器,作業系統修補、負載平衡、執行階段更新由平台處理。所有 Web 應用程式都跑在一個 App Service 方案上,方案決定區域、作業系統、定價層,以及執行個體的大小與數量;計費也以方案的執行個體為單位,同一個方案裡放幾個 App 都不會多收,但它們共用 CPU 與記憶體。部署位置則掛在單一 Web 應用程式底下,每個位置有自己的網址(預設格式是 應用程式名稱-位置名稱.azurewebsites.net),和 production 一樣跑在同一個方案的執行個體上。官方文件明確說明使用部署位置不會額外收費,代價是共用資源。

資源群組 rg-shop-demo App Service 方案:East Asia・Linux・Standard S1(示意) Web 應用程式 app-qingkong productionv1.4・正式網址 stagingv1.5 devv1.6 測試版 另一個 App admin-portal 同一個方案、共用資源 執行個體 1所有 App 與位置 執行個體 2所有 App 與位置 執行個體 3所有 App 與位置
由外到內是資源群組、App Service 方案、Web 應用程式、部署位置;最下面一排是方案的執行個體(數量為示意)。方案往外擴充(scale out)時,方案裡每個 App 與每個位置都會在新的執行個體上執行,所以 staging 也會吃掉正式環境的資源。

交換到底做了哪些事

交換的目的,是讓正式網址換手的那一刻,接手的執行個體已經套用正式環境的設定、而且已經啟動完成。官方文件描述的順序如下,其中只要有任何一個執行個體重新啟動失敗,交換就會中止並還原,production 不受影響:

  1. 把目標位置(通常是 production)的部署位置設定,例如勾了「部署位置設定」的應用程式設定與連接字串,套用到來源位置的所有執行個體;這會觸發來源位置重新啟動。使用預覽交換就停在這一步之後,讓你用來源位置的網址確認新版在正式設定下是否正常。
  2. 等來源位置的每個執行個體都重新啟動完成。
  3. 暖機:對每個執行個體送出 HTTP 要求,收到回應才算暖好。預設路徑是根目錄 /,可以用應用程式設定 WEBSITE_SWAP_WARMUP_PING_PATH 改成健康檢查路徑,也可以用 WEBSITE_SWAP_WARMUP_PING_STATUSES 限定哪些狀態碼才算成功;有啟用本機快取或自訂暖機時,這一步會多做對應的初始化。
  4. 切換路由:目標位置的網址改連到剛暖好的執行個體。
  5. 原本在目標位置的執行個體(舊版)現在屬於來源位置,套用來源位置的設定並重新啟動。
1 套用 production的位置設定 2 重新啟動staging 執行個體 3 暖機送出 HTTP 要求 4 切換路由正式網址換手 5 舊版執行個體套用 staging 設定 使用預覽交換在這裡暫停 第 1~3 步任何一台失敗:交換中止並還原 正式網址在第 4 步之前一直由舊版回應
前三步都在 staging 進行,顧客看不到;第 4 步才真正換手。這也是為什麼「交換很快」和「交換要等一陣子」兩種說法都對:等待的是前三步,換手本身很快。

哪些設定會跟著程式碼走

判斷原則是:和「這一版程式怎麼執行」有關的設定跟著程式碼交換;和「這個位置的身分、網址、規模、網路」有關的設定留在原位置。應用程式設定、連接字串與掛接的儲存體預設會交換,但你可以把個別設定標成部署位置設定,讓它固定在位置上。部署位置設定其實記錄在 Web 應用程式的 slotConfigNames 清單裡,對所有位置一體適用:名稱列在清單中的設定,每個位置各自保留自己的值。以下依官方文件整理(查證時間 2026 年 10 月):

類別項目說明
會交換語言框架設定(.NET、Java、PHP、Python、Node.js 版本)、32/64 位元平台、WebSocket、處理常式對應、路徑對應、公開憑證、WebJobs 內容、混合式連線、服務端點、Azure CDN這些描述程式怎麼跑,跟著新版一起上線才合理。
預設會交換,可改成留下應用程式設定、連接字串、掛接的儲存體帳戶勾選「部署位置設定」後固定在位置上。正式資料庫連線、付款模式、環境名稱這類「屬於環境」的值要勾;新功能旗標這類「屬於版本」的值通常不勾。
不會交換自訂網域名稱、非公開憑證與 TLS/SSL 設定、擴縮設定、發佈端點、WebJobs 排程器、受控識別、虛擬網路整合、名稱以 _EXTENSION_VERSION 結尾的設定、Service Connector 建立的設定這些屬於位置本身。例如受控識別不交換,所以 production 與 staging 可以各自有不同的 Key Vault 存取權。
不會交換,可改成會交換協定設定(僅限 HTTPS、TLS 版本、用戶端憑證)、IP 限制、Always On、診斷記錄設定、CORS在每個位置加上應用程式設定 WEBSITE_OVERRIDE_PRESERVE_DEFAULT_STICKY_SLOT_SETTINGS,值設為 0 或 false,這幾項就會改成跟著交換。
跟著程式碼交換 由你決定 留在位置上 程式碼與部署內容 語言與執行階段版本 WebSocket、平台位元 處理常式、路徑對應 應用程式設定 連接字串 掛接的儲存體 預設交換;勾選 「部署位置設定」就留下 自訂網域、非公開憑證 擴縮設定 受控識別 虛擬網路整合 IP 限制、Always On 口訣:跟版本有關跟著走, 跟環境身分有關留下來
中間那一欄是最常出錯的地方:應用程式設定與連接字串不會自動「知道」自己屬於哪個環境,要靠你勾選。右欄最下面的 IP 限制與 Always On 預設留下,但可以用 WEBSITE_OVERRIDE_PRESERVE_DEFAULT_STICKY_SLOT_SETTINGS 改成跟著交換。

使用預覽交換、自動交換與流量百分比

使用預覽交換(swap with preview)把交換拆成兩個階段:第一階段把 production 的位置設定套到 staging 並重新啟動後就暫停,這時 staging 網址上跑的是「新版程式+正式設定」,正好可以檢查新版會不會因為正式環境的連接字串或金鑰而出錯;確認後按「完成交換」才切換路由,按「取消交換」則讓 staging 回到原本的設定。CLI 對應的是 az webapp deployment slot swap 的 --action preview、swap、reset。

自動交換(auto swap)讓程式部署到來源位置後自動暖機並交換到目標位置,適合持續部署;官方文件註明 Linux 上的 Web 應用程式與 Web App for Containers 不支援自動交換,這時改用部署管線在部署完成後執行交換指令。流量百分比(Traffic %)可以把一部分正式流量導到其他位置做線上測試,被分到的使用者會由 x-ms-routing-name cookie 固定在同一個位置,官方說明的固定時間是一小時或直到 cookie 被刪除。

第一階段 正式設定套到 staging 重新啟動、暖機 顧客仍在用舊版 暫停驗證 用 staging 網址 測「新版+正式設定」 看 Application Insights 完成交換 切換路由,新版上線 取消交換 staging 恢復原設定 CLI:--action preview → 驗證 → --action swap(完成)或 --action reset(取消) 入口網站:勾選「使用預覽執行交換」,第一階段完成後選「完成交換」或「取消交換」
一般交換會把第一階段與後面的路由切換一次做完;使用預覽交換在中間多了一個人工確認點。驗證時看的是 staging 網址,因為正式網址此時還連在舊版。
顧客 連正式網址 路由規則 流量 %(示意) production:v1.4 90%(示意) staging:v1.5 10%(示意) 分到 staging 的人帶著 x-ms-routing-name=staging cookie,之後的要求都留在 staging
流量百分比適合「讓少數真實使用者先試新版」,交換則是「整批換手」。兩者可以搭配:先導一成流量觀察錯誤率,沒問題再交換。百分比數字為示意。

方案層級怎麼選

選層級時先列出硬需求,再找能滿足的最低層級。下表依 Microsoft Learn「Azure 訂用帳戶與服務限制」、App Service 自動調整與可靠性文件整理(查證時間 2026 年 10 月)。部署位置數是「每個 App」的上限;規則式自動調整(autoscale)是 Azure Monitor 依 CPU、記憶體等計量或排程增減執行個體,自動擴縮(automatic scaling)則是平台依 HTTP 流量自己決定,可設定常備與預先暖機的執行個體。

層級SLA執行個體上限部署位置規則式自動調整依流量自動擴縮可用性區域備援
Free/Shared無1(共用)無無無無
Basic99.95%3(手動)無無無無
Standard99.95%105有無無
Premium v2/v3/v499.95%30(Premium v1 為 20)20有有有,至少 2 個執行個體
Isolated v299.95%100(可申請更多)20有無在 App Service Environment 規劃

「垂直擴充」(scale up)是換到更高層級或更大的執行個體,「水平擴充」(scale out)是增加執行個體數。Basic 也能 scale out,只是要手動調整,上限 3 個。

Free/Shared共用・無 SLA Basic專用・3 台手動擴充無部署位置 Standard10 台5 個部署位置規則式調整 Premium v330 台20 個部署位置依流量擴縮可用性區域 Isolated v2100 台20 個部署位置專用環境網路隔離 往右:功能與上限增加,費用也增加
每往上一階都多出一些能力,部署位置從 Standard 開始才有。實務上最常見的錯誤是為了「零停機上線」直接選 Premium:如果用不到 20 個位置、依流量擴縮或可用性區域,Standard 就夠了。

什麼時候不該選 App Service

App Service 適合常駐執行的網站與 API,方案存在就持續計費。如果需求的形狀不同,別的服務會更合適:只有預先建置好的靜態前端加少量 API,Static Web Apps 從 Git 推送自動建置部署,每個 Pull Request 還有預覽環境,它的「預備環境」和部署位置是不同的機制;由事件觸發、執行時間短、閒置時不想付費的工作,選 Azure Functions(新的 serverless 應用程式建議用 Flex Consumption 方案);已經容器化的微服務,需要依佇列長度等事件擴縮、閒置時縮到零,選 Container Apps,它用修訂版本(revision)的流量分割做藍綠部署,概念上類似部署位置,但機制不同。

只有預先建置的靜態前端(加少量 API)? 事件觸發、短時間執行、閒置不想付費? 容器化微服務,要依事件擴縮或縮到零? App Service:常駐的網站與 API 再依部署位置數、擴縮方式、可用性區域挑方案層級 Static Web Apps Azure Functions Container Apps 是 是 是 否 否 否
由上往下問,第一個回答「是」的就是起點。走到最下面才進入 App Service 的層級判斷,也就是實驗室二後半段那些題目。

判斷步驟

  1. 先確認工作負載的形狀:常駐網站或 API 用 App Service;純靜態前端、事件觸發的短工作、需要縮到零的容器微服務,先看 Static Web Apps、Functions、Container Apps。
  2. 要零停機上線或快速回復,就需要部署位置,至少 Standard;需要超過 5 個位置,至少 Premium。
  3. 要依計量或排程自動加減執行個體,至少 Standard;要平台依 HTTP 流量自動擴縮、保留預先暖機的執行個體,選 Premium v2 以上。
  4. 要扛單一可用性區域故障,選 Premium v2 以上並啟用區域備援,執行個體至少 2 個,而且區域本身要支援可用性區域。
  5. 要完全隔離的專用環境或超過 30 個執行個體,選 Isolated v2(App Service Environment)。
  6. 設定部署位置時,把屬於環境的應用程式設定與連接字串勾成部署位置設定;交換前用 staging 網址或使用預覽交換驗證,並在 Application Insights 觀察錯誤率。

容易考錯的地方

以為 Basic 有部署位置:Basic 有 SLA、也能手動擴充到 3 個執行個體,但沒有部署位置與自動調整。情境同時出現「最低成本」與「零停機上線」,答案通常是 Standard。

以為所有設定都會交換:連接字串預設會交換,所以「交換後正式站連到測試資料庫」的題目,解法是把連接字串標成部署位置設定,不是交換前手動改值。反過來,自訂網域、受控識別、擴縮設定本來就不交換,不需要也不能勾。

把部署位置當成獨立的伺服器:位置共用方案的執行個體,staging 的壓力測試會影響 production;需要獨立資源的效能測試要另開方案。位置也不能各自放在不同的區域或可用性區域。

回復就是重新部署:交換後舊版還在另一個位置執行,最快的回復是再交換一次。前提是資料庫結構等外部變更和舊版相容。

自動交換到處可用:Linux 上的 Web 應用程式與 Web App for Containers 不支援自動交換,要用部署管線在部署後執行交換。

autoscale 和 automatic scaling 混為一談:前者是 Standard 以上依規則或排程,後者是 Premium v2 以上依 HTTP 流量,兩者是不同的擴縮選項。考試會用「不想自己維護規則」「依流量」這類字眼區分。

相關考試:AZ-900 會考 App Service 在運算服務中的定位;AZ-104 大綱點名 App Service 方案與擴縮、部署位置;AZ-400 的建置與發行管線領域點名部署位置。

✅ 自我檢測

6 題原創題,選完立即顯示對錯與解析,全部作答後會出現總分。目前得分:0 / 6