分層配置

Azure Developer CLI (azd) 支援分層配置,你可以用它在檔案 azure.yaml 中定義多個配置層。 每一層都指向自己的基礎設施即程式碼(IaC)範本。 CLI 會一次佈建一個層,並按照各層之間的相依關係依序進行。 你也可以獨立配置或拆除單一圖層。

此功能解決了一層資源依賴另一層資源的複雜依賴情境。 與其將 IaC 與命令式鉤腳本混合,不如透過分層配置讓一切保持聲明式。

備註

分層配置目前仍為測試版功能。 了解更多版本控制策略。

何時使用分層配置

當單一 azd provision 部署無法一次處理所有基礎設施需求時,就使用分層配置。 考慮在以下情況下使用分層配置:

  • 循環依賴:有些資源需要參考其他必須先建立的資源,例如虛擬網路必須存在,才能設定私有端點。
  • 基礎基礎架構與應用程式基礎架構不同:你管理共享的網路、安全或身份資源,與每個應用程式的資源分開管理。
  • 需要獨立的生命週期管理:你會在不同時間更新和拆除不同的基礎設施元件。 例如,一個網路層可能壽命較長,而應用層則經常被重新部署。
  • 擁有不同基礎設施群組的 Monorepo 專案:單一儲存庫包含多個獨立服務(如事件中心、容器應用程式及函式應用程式),每個服務都有自己的基礎設施範本。

在 azure.yaml 中配置圖層

在 infra 檔案的 azure.yaml 區段下方定義圖層。 每一層都需要namepath指向包含該層 IaC 範本的目錄。

name: my-app
infra:
  layers:
    - name: networking
      path: ./infra/networking
    - name: application
      path: ./infra/application
services:
  api:
    project: ./src/api
    language: js
    host: containerapp

這很重要

層處理順序:azd provision 根據圖層的相依關係處理圖層。 對於 Bicep 層以及自訂或延伸提供者,azd 會透過掃描參數檔案(*.bicepparam 和 *.parameters.json)中的環境變數參考與層輸出參考來推斷相依性,並據此安排各層的順序,而不是嚴格遵循 azure.yaml 中列出的順序。 沒有推斷或宣告依賴的層會依照列出的順序執行。 azd down 遵循相應的反序,因此依賴層會先被移除,然後才移除它們所依賴的層。 使用 dependsOn 屬性來宣告 azd 無法推斷的順序。

圖層屬性

每一層都支援以下特性:

房產 為必填項目 Description
name Yes 這是該層的獨特名稱。 在針對特定圖層時使用這個名稱。
path Yes 包含此層 IaC 模板的目錄的相對路徑。
module 否 圖層目錄中模組名稱。 預設為 main。
provider 否 此層的 IaC 提供者(bicep 或 terraform)。 如果你沒特別指定,它會從根節點 infra.provider 繼承。
dependsOn 否 該層依賴的其他層名稱。 當順序很重要,但 azd 無法從參數參照推斷相依性時,請使用此屬性。

這很重要

當你定義 infra.layers 時,無法在根層對該區段 infra(path,module,deploymentStacks)宣告其他屬性。 你必須在每一層內指定所有基礎設施配置。

目錄結構

一個典型使用分層配置的專案可能具有以下目錄結構:

my-app/
├── azure.yaml
├── infra/
│   ├── networking/
│   │   └── main.bicep
│   └── application/
│       └── main.bicep
└── src/
    └── api/
        └── ...

每個圖層目錄都包含完整的 IaC 範本集,就像標準 azd 專案的 infra 目錄一樣。

配置與管理圖層

你可以一次配置所有層,或依名稱鎖定特定層。 以下章節說明常見的配置、拆除及刷新層狀態指令。

配置所有層

執行 azd provision 時不帶任何參數,以佈建所有層:

azd provision

azd 逐層處理,確保每一層都會在任何依賴該層的層開始之前完成。 對於 Bicep 圖層及自訂或擴充提供者,azd會從環境變數與圖層輸出參考 與*.bicepparam*.parameters.json檔案推斷相依關係,因此執行順序可能與 中azure.yaml列出的順序不同。 沒有推斷或宣告依賴的層會依照列出的順序執行。 此過程保證依賴資源在參考圖層部署前已存在。

配置特定層

若要只配置特定層,請以參數傳遞層名:

azd provision networking

此指令僅部署該層中定義的 networking 資源。 配置特定層級在以下情況下非常有用:

  • 你在開發時是在單層上反覆迭代。
  • 你需要更新一層,但不重新部署其他層。
  • 你是在現有基礎設施上建立新層。

拆掉所有層層

在沒有提供參數的情況下執行 azd down 以從所有層移除資源。 當存在多層時,則 azd 以 配置順序相反 的方式處理,使得依賴的資源會先被移除,而不是它們依賴的基礎資源:

azd down

解除特定層

若要只拆解特定一層,請將層名作為參數傳遞:

azd down application

此指令僅移除該層部署的 application 資源,其他層則保持完整。

刷新環境狀態

你可以透過使用 --layer 帶有 azd env refresh的旗標來從特定層刷新環境狀態:

azd env refresh --layer networking

此指令會根據指定層最近一次部署更新環境變數與輸出。

範例:擁有多重服務的 Monorepo

以下範例展示了包含事件中心、運行多個容器的容器應用程式,以及 Azure 函式應用程式的單一倉庫分層配置:

name: logging-app
infra:
  layers:
    - name: eventhub
      path: ./infra/eventhub
    - name: aca
      path: ./infra/aca
    - name: functionapp
      path: ./infra/functionapp
services:
  functionapp:
    resourceName: ${site_name}
    language: dotnet
    project: ./src/function/functionapp.csproj
    host: appservice
    resourceGroup: ${rg_name}

對應的目錄結構:

logging-app/
├── azure.yaml
├── infra/
│   ├── eventhub/
│   │   └── main.bicep
│   ├── aca/
│   │   └── main.bicep
│   └── functionapp/
│       └── main.bicep
└── src/
    └── function/
        └── functionapp.csproj

透過這種配置,你可以:

  1. 僅配置活動中心基礎設施: azd provision eventhub
  2. 僅配置容器應用程式基礎設施: azd provision aca
  3. 按順序配置: azd provision
  4. 只拆除功能應用層: azd down functionapp

範例:基底層與應用層

一個常見的模式將共享或基礎基礎架構與每個應用程式的基礎架構區分開:

name: my-app
infra:
  layers:
    - name: base
      path: ./infra/base
    - name: app
      path: ./infra/app
services:
  web:
    project: ./src/web
    language: js
    host: containerapp

該 base 層創造共享資源,如網路、身份與監控。 該 app 層建立應用程式專屬資源(例如容器應用程式環境與容器應用程式),以參考基礎資源。

在開發過程中,你可以先配置一次基底層,然後在應用層進行迭代:

azd provision base
azd provision app
azd provision app  # re-provision only the app layer after changes

範例:混合 IaC 提供者

每一層都可以使用不同的 IaC 供應商。 例如,你可以用 Bicep 做網路,用 Terraform 做應用層:

name: my-app
infra:
  layers:
    - name: networking
      path: ./infra/networking
      provider: bicep
    - name: application
      path: ./infra/application
      provider: terraform

內建的非 Bicep 提供者(Terraform、Pulumi、ARM 及測試提供者)無法進行依賴推論,因為 azd 無法分析其輸入中是否包含對其他層的引用。 每當層間或層與其他層之間排序重要時,請使用明確 dependsOn 的屬性:

name: my-app
infra:
  layers:
    - name: networking
      path: ./infra/networking
      provider: bicep
    - name: application
      path: ./infra/application
      provider: terraform
      dependsOn:
        - networking

考慮事項與限制條件

  • 當你配置所有層時,會 azd 根據它們的相依性逐一處理。 對於 Bicep 圖層以及自訂或延伸提供者,azd會從 *.bicepparam 和 *.parameters.json 檔案中的環境變數與圖層輸出參考推斷相依性。 沒有推斷或宣告依賴的層會依照你定義的順序執行。
  • 內建的非 Bicep 服務(Terraform、Pulumi、ARM 及測試提供者)對於依賴推論來說是不透明的。 在排序涉及這些層時,請使用明確的 dependsOn 屬性。
  • 當順序很重要,但 dependsOn 無法從參數參照推斷相依性時,也需要明確指定 azd。 例如,當某個圖層的 dependsOn hook 產生了另一個圖層會使用的值時,請使用 postprovision,因為 hook 產生的值不會以輸出參考的形式出現在 *.bicepparam 或 *.parameters.json 檔案中。
  • 當你拆解所有層時,azd 會按照與佈建順序相反的順序處理它們。
    • 如果多個層將資源部署到同一個 Azure 資源群組,且你使用預設的基於資源群組的刪除行為,執行 azd 關閉時,共享資源可能會被刪除。
    • 若要允許獨立追蹤及刪除分層式基礎架構,請執行指令 azd config set alpha.deployment.stacks on 以啟用部署堆疊。
  • 同時配置多個圖層時不能使用這個 --preview 旗標。 請指定 <layer> 名稱以使用預覽模式。
  • 各層在 IaC 的框架下獨立運作。 要在一層中引用另一層的輸出,請使用每層部署後由azd設定的環境變數。 在 *.parameters.json 或 *.bicepparam 檔案中參照這些環境變數,也能讓 azd 判斷各層之間的順序。
  • 所有標準 azd 配置功能(部署狀態快取、掛鉤、參數、Bicep 或 Terraform)皆可在每個獨立層中運作。
    • 指令層級的鉤子(例如, preprovision、 postprovision)每層會被呼叫一次。 當定義多個層時,針對每一層的掛鉤函數會依照處理層的順序執行。

後續步驟