Deploy to Azure Functions with Azure Developer CLI

Azure Developer CLI (azd) 支援 code and container deployments to Azure Functions. 兩種模式都使用專用 function 主機 azure.yaml :

  • Code deployment 會把你建置的函式程式碼打包成壓縮檔,然後上傳到 Function App。
  • 容器部署會建置或解析容器映像,必要時將其發佈到 Azure Container Registry(ACR),並更新函式應用程式以執行映像。

Azure Functions 和 Azure App 服務 都使用Microsoft.Web/sites資源提供者,且它們的容器部署流程共享一些內部機制。 不過,他們不是同 azd 一位主機。 Functions 使用 host: function,具有 Functions 專屬的封裝與遠端建置行為,且不使用 App Service 部署槽的工作流程。

選擇部署模式

azd 從服務配置中選擇部署模式:

配置 部署模式
一個支援非 Docker language 且沒有的原始碼projectdocker.path 程式碼部署
language: docker 容器部署
docker.path帶有源語言的值 容器部署
預製車 image 容器部署

已配置的功能應用程式必須使用與服務設定相同的模式。 如果函式應用程式設定為容器,但 azure.yaml 選擇了程式碼部署,或相反, azd deploy 則會在上傳前停止並回報不匹配。

部署功能程式碼

配置一個基於程式碼的函式服務,包含原始專案、支援的語言,以及 host: function:

services:
  api:
    project: ./src/api
    language: ts
    host: function

在 azd deploy期間azd,建置專案、套用.funcignore排除、建立壓縮壓縮檔,並透過 Azure Functions 部署 API 上傳套件。

你的 Bicep 或 Terraform 必須配置一個基於程式碼的功能應用程式,並azd-service-name以服務名稱為標籤,除非你使用 resourceName 。azure.yaml 透過基礎設施即程式碼配置主機計畫、執行環境、儲存、身份、網路及應用程式設定。

配置遠端建置以部署程式碼

頂層服務 remoteBuild 特性僅適用於 Flex Consumption 計畫中基於程式碼的功能應用程式。 它控制 Azure Functions 是否使用 Oryx 來建立上傳的套件:

services:
  api:
    project: ./src/api
    language: python
    host: function
    remoteBuild: true

當你省略 remoteBuild Flex Consumption 時, azd 會根據語言和套件內容選擇預設值:

語言 預設行為
JavaScript 或 TypeScript 當 .funcignore 排除 node_modules或沒有 .funcignore 檔案存在時,會使用遠端建置。 否則,就使用本地組裝的套件。
Python 使用遠端組裝。
Go 本地建置。 Go 功能應用程式不支援遠端組裝。
其他支援語言 使用本地自製的套件。

對於 JavaScript 和 TypeScript,必須有一個明確設定 remoteBuild 的值與 .funcignore 該檔案存在的時間一致。 當.funcignore排除 node_modules時設定 remoteBuild: true 。 設定remoteBuild: false包含於套裝中。.funcignorenode_modules

不要為非彈性方案設定頂層 remoteBuild 屬性。 要啟用 Oryx 建置於其他支援方案上,請在你的基礎架構中設定 ENABLE_ORYX_BUILD=true 和 SCM_DO_BUILD_DURING_DEPLOYMENT=true Function App 的設定。

部署容器化函式

對於帶有 Dockerfile 的原始碼專案,請設定 language: docker,或保留原始碼語言並指定 docker.path。

以下範例使用帶有 Docker 檔案的 TypeScript 專案:

services:
  api:
    project: ./src/api
    language: ts
    host: function
    docker:
      path: ./Dockerfile

你也可以部署一個預設映像檔,而不需要本地專案:

services:
  api:
    host: function
    image: myregistry.azurecr.io/functions/api:1.0

對於預建映像檔,可以省略 language 或設為 docker。 不要將 project 與 image 合併。

在容器部署期間, azd

  1. 本地或遠端建置映像檔,或解析已設定好的預設映像檔。
  2. 當需要發佈時,會將映像發佈到專案中已設定的 ACR 實例。
  3. 更新函式應用程式的 linuxFxVersionDOCKER|<image>。
  4. 部署到主功能應用程式網站。

頂層服務 remoteBuild 屬性不適用於容器。 要建立包含 ACR 任務的容器映像檔,請使用 docker.remoteBuild:

services:
  api:
    project: ./src/api
    language: docker
    host: function
    docker:
      path: ./Dockerfile
      remoteBuild: true

配置容器支援的功能應用程式

azd deploy 更新圖片參考,但不會將基於程式碼的函式應用程式轉換成基於容器的功能應用。 您的基礎架構必須在部署前先配置相容的站點。

需求 詳細資訊
Linux 功能應用程式 在 Azure Functions Premium 或 Dedicated (App Service) 計劃中配置一個 Linux Function 應用程式。 Flex Consumption 不支援自訂容器。 This host: function workflow targets Microsoft.Web/sitesnot hosted on Azure 容器應用程式 on Azure Functions.
容器站點配置 將網站類型設為包含 functionapp、 linux、 container。 用一個DOCKER\|<image>值初始化linuxFxVersion。 佔位影像就足夠了,因為 azd deploy 會取代它。
容器註冊表 對於原始碼建置,可以配置一個 ACR 實例,並透過 AZURE_CONTAINER_REGISTRY_ENDPOINT 基礎設施輸出暴露其登入伺服器,或為服務進行設定 docker.registry 。 完全合格的預建 image 版本可直接使用,無需另行出版註冊。
登錄檔存取 授權發佈影像的身份在需要發佈時推送至目的地登錄檔。 另外,設定 Function App 來拉取已部署的映像檔。 對於私有 ACR 映像,請授權 Function App 的管理身份拉取權限,並設定網站使用受管理身份憑證。 對於另一個私有登錄檔,請在你的基礎設施中設定適當的拉取憑證。
功能設定 設定必要的設定,例如FUNCTIONS_EXTENSION_VERSION、FUNCTIONS_WORKER_RUNTIME、,並AzureWebJobsStorage透過 Bicep 或 Terraform。
資源探索 套用 azd-service-name 一個與服務 azure.yaml名稱相符的標籤,或明確設定 resourceName 。

主機不支援function服務層級env設定。 改在你的基礎設施中定義功能應用程式的設定。

了解部署時段

azd 總是將 function 服務部署到主要的功能應用網站。 它不會發現、提示或部署到 Function App 的插槽。 像是 App Service 欄位的設定 AZD_DEPLOY_{SERVICE}_SLOT_NAME 不會影響 Function App 部署。

如果你需要基於時段的函式發佈流程,請在 host: function 內建工作流程之外管理時段與部署。

比較函式與應用服務主機

函式與 App Service 共享 Microsoft.Web/sites 資源類型,但選擇與工作負載相符的主機:

Behavior function 主機 appservice 主機
[工作負載] Event-driven Azure Functions 網頁應用程式與 API
程式碼部署 使用 Azure Functions zip 部署流程 使用 App Service 部署流程
容器部署 在驗證網站為容器式後,更新 Function App 映像檔 在驗證網站已準備好容器後,更新網頁應用程式映像檔
遠端程式碼編譯 支援彈性消費功能應用程式的服務層級 remoteBuild 選項 沒有使用功能 remoteBuild 選項
部署位置 總是部署到主站 支援 azd App Service 時段工作流程
服務層級 env 不支援;在基礎架構中使用功能應用程式設定 在基礎架構中設定應用程式設定