在本文中,您會建立在 Linux 容器中執行的函式應用程式,並將其部署至 Azure Functions。
在容器中將您的函式程式碼部署至 Azure Functions 需要Premium 計劃或專用 (App Service) 計劃的主機支援。 完成本文會在您的 Azure 帳戶中衍生一些費用 (以美元計價),您可以在完成時清除資源,將這些成本降到最低。
提示
對於大多數容器化工作負載,建議將功能應用程式放在 Azure 容器應用程式 中,而非 Premium 或 Dedicated 方案。 容器應用程式提供一個完全託管、無伺服器的環境,內建事件驅動擴展、可擴展至零及 GPU 支援。 要開始,請參考 Azure 容器應用程式 上的「建立你的第一個容器化函式」。
選擇您的開發語言
首先,你使用 Azure Functions 工具,透過語言專用的 Linux 基礎映像,在 Docker 容器中建立專案程式碼作為函式應用程式。 務必在文章頂端選取您所選擇的語言。
Core Tools 會自動為您的專案產生 Dockerfile,其中使用最新版本的正確基底映像,以符合您的函式語言。 您應該定期從最新的基礎映像更新容器,並從容器的更新版本重新部署。 欲了解更多資訊,請參閱 建立容器化函式應用程式。
必要條件
開始之前,您必須符合下列需求:
安裝 .NET SDK。
安裝 Azure Functions Core Tools 版本 4.0.5198 或更新版本。
- 安裝 Azure Functions Core Tools 4.x 版。
- 安裝一個 Azure Functions 支援的 Node.js 版本。
- 安裝一個 Azure Functions 支援的 Python 版本。
- 安裝 .NET SDK。
安裝 Azure Functions 支援的 Java 開發者套件版本。
安裝 Apache Maven 3.0 或更新版本。
- 安裝 Azure CLI 2.4 或更新版本。
如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
要將你建立的容器化函式應用程式映像檔發佈到容器登錄檔,你需要在本地電腦上運行 Docker ID 和 Docker 桌面 。 如果您沒有 Docker 識別碼,則可以建立 Docker 帳戶。
- Azure 容器註冊表
- Docker Hub (英文)
你也需要完成容器登錄快速入門中建立 容器登錄 的部分。 記下完整合格的登入伺服器名稱。
建立並啟用虛擬環境
在適用的資料夾中執行下列命令,以建立並啟用名為 .venv 的虛擬環境。 務必使用 Azure Functions 支援的其中一個 Python 版本。
python -m venv .venv
source .venv/bin/activate
如果 Python 未在您的 Linux 發行版本上安裝 venv 套件,請執行下列命令:
sudo apt-get install python3-venv
您將在這個已啟用的虛擬環境中執行所有後續命令。
建立並測試本機函式專案
在終端機或命令提示字元中,針對您選擇的語言執行下列命令,以在目前的資料夾中建立函式應用程式專案:
func init --worker-runtime dotnet-isolated --docker
func init --worker-runtime node --language javascript --docker
func init --worker-runtime powershell --docker
func init --worker-runtime python --docker
func init --worker-runtime node --language typescript --docker
在空的資料夾中,執行下列命令以從 Maven 原型產生 Functions 專案:
mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=8 -Ddocker
-DjavaVersion 參數會告知函式執行階段要使用哪個 JAVA 版本。 若您想讓函式在 Java 11 上執行,請使用 -DjavaVersion=11。 若未指定 -DjavaVersion,Maven 預設為 JAVA 8。 如需詳細資訊,請參閱 JAVA 版本。
重要
JAVA_HOME 環境變數必須設定為正確 JDK 版本的安裝位置,才能完成本文。
Maven 會要求您提供在部署時完成產生專案所需的值。 依照提示操作並提供下列資訊:
| 提示 | 值 | 說明 |
|---|---|---|
| groupId | com.fabrikam |
此值可在所有專案中唯一識別您的專案,並遵循適用於 Java 的套件命名規則。 |
| artifactId | fabrikam-functions |
此值是 jar 的名稱 (不含版本號碼)。 |
| 版本 | 1.0-SNAPSHOT |
選取預設值。 |
| 套件 | com.fabrikam.functions |
此值是所產生函式程式碼的 Java 套件。 使用預設值。 |
輸入 Y 或按 Enter 進行確認。
Maven 會在名為 artifactId 的新資料夾中建立專案檔,在此範例中為 fabrikam-functions。
--docker 選項會產生專案的 Dockerfile,這會定義適合用於 Azure Functions 和所選執行階段的容器。
瀏覽至專案資料夾:
cd fabrikam-functions
使用下列命令將函式新增至您的專案,其中,--name 引數是函式的唯一名稱,而 --template 引數會指定函式的觸發程序。
func new 會在您的專案中建立 C# 程式碼檔案。
func new --name HttpExample --template "HTTP trigger"
使用下列命令將函式新增至您的專案,其中,--name 引數是函式的唯一名稱,而 --template 引數會指定函式的觸發程序。
func new 會建立符合函式名稱的子資料夾,其中包含名為 function.json 的組態檔。
func new --name HttpExample --template "HTTP trigger"
若要在本機測試函式,請啟動專案根資料夾中的本機 Azure Functions 執行階段主機。
為了確保該函式在 Docker 中架設時能被呼叫,請檢查授權層級是否設定為 AuthorizationLevel.Anonymous,若尚未設定,請設定。
func start
func start
npm install
npm start
mvn clean package
mvn azure-functions:run
當您看到 HttpExample 端點寫入到輸出後,請導航至該端點。 您應該會在回應輸出中看到歡迎訊息。
看到 HttpExample 端點寫入輸出之後,請瀏覽至 http://localhost:7071/api/HttpExample?name=Functions。 瀏覽器必須顯示 "hello" 訊息,回應 Functions,這是提供給 name 查詢參數的值。
按 Ctrl+C (在 macOS 上為 Command+C) 以停止主機。
建立容器映像並在本機驗證
(選用) 檢查專案根資料夾中的 Dockerfile。 Dockerfile 說明在 Linux 上執行函式應用程式所需的環境。 在 Azure Functions 基底映像頁面中可找到針對 Azure Functions 支援的完整基底映像清單。
在根專案資料夾中執行 docker build 命令,提供名稱 azurefunctionsimage 和標籤 v1.0.0。 將 <DOCKER-ID> 取代為 Docker Hub 帳戶識別碼。 此命令會建置容器的 Docker 映像。
docker build --tag <DOCKER-ID>/azurefunctionsimage:v1.0.0 .
當命令完成時,您就能在本機執行新容器。
若要驗證組建,請使用 docker run 命令在本機容器中執行映像 (同樣將 <DOCKER-ID> 取代為您的 Docker Hub 帳戶識別碼),並新增連接埠引數 -p 8080:80:
docker run -p 8080:80 -it <DOCKER-ID>/azurefunctionsimage:v1.0.0
映像檔在本機容器中啟動後,請瀏覽至 http://localhost:8080/api/HttpExample,此處必須顯示與先前相同的問候訊息。 由於您建立的 HTTP 觸發函式使用匿名授權,因此您可以直接呼叫在容器中執行的函式,而無須取得存取金鑰。 如需詳細資訊,請參閱授權金鑰。
映像在本機容器中啟動後,瀏覽至 http://localhost:8080/api/HttpExample?name=Functions,此頁面必須顯示與之前相同的「hello」訊息。 由於您建立的 HTTP 觸發函式使用匿名授權,因此您可以直接呼叫在容器中執行的函式,而無須取得存取金鑰。 如需詳細資訊,請參閱授權金鑰。
驗證容器中的函式應用程式之後,請按 Ctrl+C (在 macOS 上為 Command+C) 以停止執行。
將容器映像發佈至登錄
若要讓您的容器映像可供部署至主控環境,您必須將其推送至容器登錄。 作為安全性最佳做法,您應該使用 Azure Container Registry 實例,並強制執行受控識別型連線。 Docker Hub 會要求您使用共用秘密進行驗證,讓您的部署更容易受到攻擊。
- Azure 容器註冊表
- Docker Hub (英文)
Azure Container Registry 是私人登錄服務,用於建置、儲存和管理容器映像和相關成品。 您應該使用私人登錄服務,將容器發佈至 Azure 服務。
使用這個指令,使用你目前的 Azure 憑證登入你的登錄實例。 請將 Container 登錄實例的名稱替換
<REGISTRY-NAME>。az acr login --name <REGISTRY-NAME>使用此命令,以登錄伺服器的完整名稱為您的映像加上標籤。 以登錄登入伺服器的完整名稱取代
<LOGIN-SERVER>,並以 Docker 識別碼取代<DOCKER-ID>。docker tag <DOCKER-ID>/azurefunctionsimage:v1.0.0 <LOGIN-SERVER>/azurefunctionsimage:v1.0.0使用此命令將容器推送至您的登錄執行個體:
docker push <LOGIN-SERVER>/azurefunctionsimage:v1.0.0
為您的 Function 建立 Azure 支援資源
若要將容器部署至 Azure,您必須建立三個資源:
- 資源群組,這是相關資源的邏輯容器。
- 儲存體帳戶,用於維護函數的狀態及其他相關資訊。
- 函數應用程式,其提供執行函式程式碼的環境。 函式應用程式可對應至您的本機函式專案,並可讓您將函式分組為邏輯單位,以便管理、部署和共用資源。
重要
本文目前說明如何使用 連接字串 和其他共用密碼認證,連線到 Azure 儲存體 帳戶和容器登錄。 為了最佳安全性,建議只使用基於管理身份的連線,連接你的儲存帳號和使用 Microsoft Entra 認證的 Azure Container Registry。 如需詳細資訊,請參閱 Functions 開發人員指南。
請使用下列命令來建立這些項目。 Azure CLI 和 PowerShell 均受支援。 要使用 Azure PowerShell 建立 Azure 資源,你還需要 Az PowerShell 模組,版本為 5.9.0 或更新版本。
如果你還沒登入,請登入 Azure。
az loginaz login命令會將您登入 Azure 帳戶。在您選擇的區域中,建立名為
AzureFunctionsContainers-rg的資源群組。az group create --name AzureFunctionsContainers-rg --location <REGION>az group create命令會建立資源群組。 在前一個指令中,請用 az account list-locations 指令回傳的可用區域代碼,替換<REGION>為你附近的區域。在您的資源群組和區域中建立一般用途的儲存體帳戶。
az storage account create --name <STORAGE_NAME> --location <REGION> --resource-group AzureFunctionsContainers-rg --sku Standard_LRSaz storage account create命令會建立儲存體帳戶。在前面的例子中,請將名稱替換
<STORAGE_NAME>成你選擇且在 Azure 儲存體 中唯一的名稱。 儲存名稱可包含 3 至 24 個字元、數字及小寫字母。Standard_LRS會指定受 Functions 支援的一般用途帳戶。使用此命令,在
myPremiumPlan定價層 ()、您的--sku EP1及 Linux 容器 (<REGION>) 中,建立名為--is-linux的 Azure Functions 進階方案。az functionapp plan create --resource-group AzureFunctionsContainers-rg --name myPremiumPlan --location <REGION> --number-of-workers 1 --sku EP1 --is-linux我們在此使用進階方案,其可視需要進行調整。 如需有關託管的詳細資訊,請參閱 Azure Functions 託管計劃比較。 如需如何計算成本的詳細資訊,請參閱 Functions 定價頁面。
此命令也會在相同的資源群組中建立相關聯的 Azure 應用程式 Insights 實例,您可以用於監視您的函數應用程式及檢視日誌。 如需詳細資訊,請參閱監視 Azure Functions。 在您啟用此執行個體之前,並不會產生任何成本。
使用映像在 Azure 上建立及設定函式應用程式
Azure 上的函數應用程式會在您的 Azure Functions 主機方案中管理函數的執行。 在這一節中,您會使用上一節的 Azure 資源,從容器登錄中的映像建立函式應用程式,並使用 Azure 儲存體的連接字串加以設定。
根據你的容器登錄檔,使用以下指令建立函式應用程式:
- Azure 容器註冊表
- Docker Hub (英文)
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --resource-group AzureFunctionsContainers-rg --plan myPremiumPlan --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --registry-username <USERNAME> --registry-password <SECURE_PASSWORD>請在此範例中將
<STORAGE_NAME>替換成您在上一節使用的儲存帳戶名稱。 此外,將<APP_NAME>取代為適合您的全域唯一名稱,並將<DOCKER_ID>或<LOGIN_SERVER>分別取代為您的 Docker Hub 帳戶識別碼或容器登錄伺服器。 從自訂容器登錄進行部署時,映像名稱會指示登錄的 URL。當您第一次建立函數應用程式時,會從您的 Docker Hub 中提取初始映像。 您也可以從容器登錄啟用持續部署至 Azure。
提示
請使用
DisableColorhost.json 檔案中的設定,防止 ANSI 控制字元寫入容器日誌。使用下列命令,取得您所建立之儲存體帳戶的連接字串:
az storage account show-connection-string --resource-group AzureFunctionsContainers-rg --name <STORAGE_NAME> --query connectionString --output tsv儲存體帳戶的連接字串可使用
az storage account show-connection-string命令傳回。重要
本文目前說明如何使用 連接字串 連線到預設記憶體帳戶。 為了獲得最佳安全性,您應該改為使用 Microsoft Entra 驗證來建立 Azure 儲存體 的受控識別型連線。 如需詳細資訊,請參閱 Functions 開發人員指南。
將 `
<STORAGE_NAME>` 替換為您之前建立的儲存帳戶名稱。使用下列命令,將設定新增至函式應用程式:
az functionapp config appsettings set --name <APP_NAME> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage=<CONNECTION_STRING>用
az functionapp config appsettings set指令建立設定。在此命令中,將
<APP_NAME>替換為您的函式應用程式名稱,將<CONNECTION_STRING>替換為上一個步驟中的連接字串。 連接字串 是一串長編碼字串,開頭為DefaultEndpointProtocol=。函式現在可以使用此連接字串來存取儲存體帳戶。
在 Azure 上驗證您的函式
將映像部署至 Azure 中的函數應用程式後,您可以透過 HTTP 要求叫用函式。
執行下列
az functionapp function show命令以取得新函式的 URL:az functionapp function show --resource-group AzureFunctionsContainers-rg --name <APP_NAME> --function-name HttpExample --query invokeUrlTemplate以函式應用程式的名稱取代
<APP_NAME>。
- 使用您剛才取得的 URL 來呼叫
HttpExample函式端點,並附加查詢字串?name=Functions。
- 使用您剛才取得的 URL 來呼叫
HttpExample函式端點。
當您瀏覽至此 URL 時,瀏覽器必須在本機執行函式時顯示類似的輸出。
清除資源
如果你想繼續使用本文中建立的資源來使用 Azure Functions,你可以保留所有這些資源。 因為你為 Azure Functions 建立了高級方案,你每天會持續產生一到兩美元的費用。
為了避免持續的費用,刪除 AzureFunctionsContainers-rg 資源群組以清理該群組中的所有資源。
az group delete --name AzureFunctionsContainers-rg