使用 Azure 開發者命令列界面 (CLI) 部署到 Azure 應用服務的部署插槽

Azure Developer CLI (azd) 支援在 Azure App 服務 上託管的應用程式使用 Azure App 服務 部署插槽。 你可以在基礎設施中定義插槽,將程式碼部署到特定插槽,並在準備好推廣版本時交換插槽。

此方法可用於佈署前測試、藍綠部署、煙霧測試及回復,無需新增自訂部署腳本。

先決條件

  • 一個 azd 將服務部署到 Azure App 服務 的專案。
  • 定義 Bicep 中 App Service 資源的基礎架構即程式碼。
  • 標準()等級或更高等級的 App Service 方案S1。 免費、共享和基本層級不支援部署欄位。

在 Bicep 中定義部署插槽

像平常一樣定義你的生產地點,然後為每個你想Microsoft.Web/sites/slots鎖定的時段加入一個azd資源。

resource appServicePlan 'Microsoft.Web/serverfarms@2021-03-01' = {
  name: 'my-appservice-plan'
  location: resourceGroup().location
  sku: {
    name: 'S1'
    tier: 'Standard'
  }
}

resource webApp 'Microsoft.Web/sites@2021-03-01' = {
  name: 'my-appservice'
  location: resourceGroup().location
  kind: 'app'
  properties: {
    serverFarmId: appServicePlan.id
  }
}

resource stagingSlot 'Microsoft.Web/sites/slots@2021-03-01' = {
  name: '${webApp.name}/staging'
  location: webApp.location
  properties: {}
}

如果你使用 Azure Verified Modules(AVM),請在同一部署中定義網頁應用程式和部署槽模組,並將應用程式名稱傳給槽位模組。

使用 azd 部署到插槽

依照往常執行azd up、azd provision和azd deploy。

azd up

第一次部署時,將 azd 部署到生產網站及基礎設施中定義的任何插槽。 這次首次部署是在主應用程式和每個插槽建立相同的基準。

第一次部署後,azd deploy 在有插槽時,會改變以選擇部署目標的方式。 azd 當有空位時,也不會直接部署到生產應用程式。 相反地,你先部署到某個時段,驗證發佈,然後再把它切換到生產環境。

azd 如何選擇部署目標

當 azd deploy 執行有部署時段的 App Service 時,會透過查看主應用程式的部署歷史,然後評估可用時段來選擇目標。

行為如下:

  • 如果不存在先前部署,則 azd 部署到主應用程式及所有部署插槽。
  • 如果之前有部署且沒有部署位置,則 azd 只會部署到主應用程式。
  • 如果之前有部署且剛好有一個時段,則 azd 只能部署到該時段。
  • 如果之前有部署且有兩個或以上的欄位,azd 會使用環境變數指定的欄位,或提示你選擇一個。

Important

第一次部署後, azd 當有空位時,它不會直接部署到主 App Service 應用程式。 此行為是刻意設計,有助於防止意外直接部署至生產環境。 要更新生產環境,先部署到某個槽位,然後將該槽位切換到生產環境(@main)。

選擇一個帶有環境變數的槽位

當你的服務在第一次部署後有兩個或以上時段時,你可以透過設定想要部署的服務環境變數來跳過互動提示。

請使用下列格式:

AZD_DEPLOY_<SERVICE_NAME>_SLOT_NAME

從服務名稱 azure.yaml 中建立變數名稱,方法是使用大寫字母,並用底線替換連字號。

例如,如果你的服務名稱 my-api為 ,請使用 AZD_DEPLOY_MY_API_SLOT_NAME。

azd env set AZD_DEPLOY_MY_API_SLOT_NAME staging
azd deploy my-api

在執行azd之前,你可以使用azd env set將此值存儲在你的azd deploy環境中,或者在你的持續整合系統中直接定義。

如果你的服務只有一個插槽, azd 則忽略環境變數,因為只有一個可能的部署目標。

如果你的服務有兩個或以上時段,且環境變數未設定,系統 azd 會提示你選擇時段。

繞過插槽偵測並部署到主應用程式

在某些情況下,即使已有部署位置,你仍需要 azd 直接部署至主要 App Service 應用程式。 例如:

  • 你的 CI 管線需要更新主要應用程式,同時讓現有的部署位置維持不變。
  • 你正在從壞時段狀態恢復,想直接重新部署生產站點。
  • 你是在設定新槽位前先重新設定主應用程式的基底。

要繞過時隙偵測,請為服務設定以下環境變數:

AZD_DEPLOY_<SERVICE_NAME>_IGNORE_SLOTS

從服務名稱 azure.yaml 中建立變數名稱,方法是使用大寫字母,並用底線替換連字號。 將值設為 true 跳過插槽偵測並部署到主應用程式。

例如,如果你的服務名稱 my-api為 ,請使用 AZD_DEPLOY_MY_API_IGNORE_SLOTS。

azd env set AZD_DEPLOY_MY_API_IGNORE_SLOTS true
azd deploy my-api

當 AZD_DEPLOY_<SERVICE_NAME>_IGNORE_SLOTS 設定為 true時, azd 會部署到主應用程式,並忽略同一服務的任何 AZD_DEPLOY_<SERVICE_NAME>_SLOT_NAME 值。 取消設定變數或設定為 , false 以回到預設的槽位感知行為。

CI 與非互動行為

當你從 CI 執行 azd deploy --no-prompt 或部署時,槽位選擇會根據可用槽位數量而有所不同:

老虎機 環境變數行為 Result
0 不適用。 azd 部署到主應用程式。
1 除非 AZD_DEPLOY_<SERVICE_NAME>_IGNORE_SLOTS 為 true,否則會被忽略。 azd 會部署到唯一插槽;若忽略插槽,則會部署到主應用程式。
2+ 必須使用 AZD_DEPLOY_<SERVICE_NAME>_SLOT_NAME 以避免出現提示,除非 AZD_DEPLOY_<SERVICE_NAME>_IGNORE_SLOTS 是 true。 azd 會部署到指定的部署位置,在忽略部署位置時部署到主要應用程式,若無法選取目標則會失敗。

如果要自動化部署具有兩個或以上插槽的 App Service,請在執行 AZD_DEPLOY_<SERVICE_NAME>_SLOT_NAME 之前,先在 pipeline 環境中設定 azd deploy。 若有插槽,強制從 CI 直接部署到主線,請改設 AZD_DEPLOY_<SERVICE_NAME>_IGNORE_SLOTS 為 true 。

開關 Azure App 服務 部署插槽

驗證後用 azure.appservice 擴充功能交換槽位。 如果擴充功能還沒安裝 azd ,第一次執行指令時會提示你安裝。

執行互動體驗:

azd appservice swap

如果只有一個非製作欄位,則 azd 跳過提示,直接與製作部門交換。

在自動化過程中,請明確指定來源和目地欄位。 用 @main 來參考生產時段。

azd appservice swap --src staging --dst @main
azd appservice swap --src @main --dst staging
azd appservice swap --service myapi --src staging --dst @main

利用這些模式來支持常見的釋放流程:

  • 將驗證過的暫存部署推廣至生產環境。--src staging --dst @main
  • 回滾時,將生產線切換回預備槽 --src @main --dst staging。
  • 鎖定在多服務 azd 專案中的特定以 App Service 支援的服務,並使用 --service。

配置好插槽後, 交換是用來更新生產環境的指定途徑。 用 azd deploy 來更新一個插槽,然後用 azd appservice swap 來提升該插槽進入生產環境。

  1. 在你的 Bicep 範本中定義一個或多個 App Service 部署時段。
  2. 透過使用 azd provision 或 azd up來配置 App Service 資源。
  3. 讓第一次部署時,在主應用程式和每個時段建立基準。
  4. 透過設定 AZD_DEPLOY_<SERVICE_NAME>_SLOT_NAME,當你有兩個或以上的插槽時,或在提示時選擇該插槽,來將後續應用程式更新部署到暫存插槽。 若有插槽,強制從 CI 直接部署到主線,請改設 AZD_DEPLOY_<SERVICE_NAME>_IGNORE_SLOTS 為 true 。
  5. 驗證分階段部署。
  6. 執行 azd appservice swap --src <slot> --dst @main 以促進這次發行。
  7. 如果需要,執行反向交換來還原。