在 Azure Arc 上建立您的第一個容器化 Azure Functions (預覽)

在本文中,您會建立在Linux容器中執行的函式應用程式,並從容器登錄將它 部署到已啟用 Azure Arc 的 Kubernetes 叢集 。 當您建立自己的容器時,您可以自定義函式應用程式的執行環境。 若要深入瞭解,請參閱 Azure Arc 上的 App Service、Functions 和 Logic Apps。

注意

目前預覽支援將自定義容器部署至已啟用 Azure Arc 的 Kubernetes 叢集。

您也可以將函式發佈至已啟用 Azure Arc 的 Kubernetes 叢集,而不需要先建立容器。 若要深入瞭解,請參閱 在 Azure Arc 上建立您的第一個函式 (預覽)

選擇您的開發語言

首先,您會使用 Azure Functions 工具,使用特定語言的 Linux 基底映射,在 Docker 容器中建立專案程式代碼作為函式應用程式。 請務必在文章頂端選取您選擇的語言。

Core Tools 會自動為您的項目產生 Dockerfile,而該專案會針對函式語言使用最新版的正確基底映像。 您應該定期從最新的基底映射更新容器,並從容器的更新版本重新部署。 如需詳細資訊,請參閱 建立容器化函式應用程式

必要條件

開始之前,您必須具備下列需求:

如果您沒有 Azure 訂閱,請在開始之前,先建立 Azure 免費帳戶

若要將您建立的容器化函式應用程式映像發佈至容器登錄,您需要在本機計算機上執行的 Docker 標識符和 Docker 。 如果您沒有 Docker 識別符,您可以 建立 Docker 帳戶

您也需要完成 Container Registry 快速入門的建立容器登錄 區段,以建立登錄實例。 記下完整的登入伺服器名稱。

建立並啟用虛擬環境

在適當的資料夾中,執行下列命令來建立並啟動名為 .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 會告知 Functions 運行時間要使用的 Java 版本。 若您想讓函式在 Java 11 上執行,請使用 -DjavaVersion=11。 當您未指定 -DjavaVersion時,Maven 預設為 Java 8。 如需詳細資訊,請參閱 Java 版本

重要

JAVA_HOME環境變數必須設定為正確 JDK 版本的安裝位置,才能完成本文。

Maven 會要求您提供完成部署時產生專案所需的值。 請遵循提示並提供下列資訊:

提示 Description
groupId com.fabrikam 值,可針對所有專案唯一識別您的專案,並遵循 Java 的套件命名規則
artifactId fabrikam-functions 值,這個值是 jar 的名稱,不含版本號碼。
version 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" --authlevel anonymous

使用下列命令將函式新增至專案,其中 --name 自變數是函式的唯一名稱,而 --template 自變數會指定函式的觸發程式。 func new 會建立符合函式名稱的子資料夾,其中包含名為 function.json的組態檔。

func new --name HttpExample --template "HTTP trigger" --authlevel anonymous

若要在本機測試函式,請在專案資料夾的根目錄中啟動本機 Azure Functions 執行時間主機。

func start  
func start  
npm install
npm start
mvn clean package  
mvn azure-functions:run

看到寫入輸出的 HttpExample 端點之後,請流覽至該端點。 您應該會在回應輸出中看到歡迎訊息。

看到寫入輸出的 HttpExample 端點之後,請瀏覽至 http://localhost:7071/api/HttpExample?name=Functions。 瀏覽器必須顯示回顯 Functions的 「hello」 訊息,也就是提供給 name 查詢參數的值。

Ctrl+C (macOS 上的命令+C) 以停止主機。

建置容器映像並在本機驗證

(選擇性) 檢查項目資料夾根目錄中的 DockerfileDockerfile 描述在 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 Hub 帳戶識別碼再次取代 <DOCKER_ID> ,並將埠自變數新增為 -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 上的命令+C) 停止執行。

將容器映像發佈至登錄

若要讓您的容器映像可供部署至裝載環境,您必須將其推送至容器登錄。

Azure Container Registry 是私人登錄服務,用於建置、儲存和管理容器映像和相關成品。 您應該使用私人登錄服務將容器發佈至 Azure 服務。

  1. 使用下列命令登入您的登入您的登入者:

    az acr login --name <REGISTRY_NAME>
    

    在上一個命令中,將 取代 <REGISTRY_NAME> 為您的 Container Registry 實例名稱。

  2. 使用下列命令,以登入伺服器的完整名稱標記映像:

    docker tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 
    

    取代登入伺服器的完整名稱,並以<DOCKER_ID>您的 Docker 識別碼取代 <LOGIN_SERVER>

  3. 使用下列命令將容器推送至您的登錄實例:

    docker push <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
    
  4. 使用下列命令來啟用內建系統管理員帳戶,讓 Functions 可以使用使用者名稱和密碼連線到登錄:

    az acr update -n <REGISTRY_NAME> --admin-enabled true
    
  1. 使用下列命令來擷取管理員使用者名稱和密碼,Functions 必須連線到登錄:

    az acr credential show -n <REGISTRY_NAME> --query "[username, passwords[0].value]" -o tsv
    

    重要

    系統管理員帳戶用戶名稱和密碼是重要的認證。 請務必安全地儲存它們,絕不會儲存在公用存放庫等可存取的位置。

建立 App Service Kubernetes 環境

開始之前,您必須 為已啟用 Azure Arc 的 Kubernetes 叢集建立 App Service Kubernetes 環境

注意

當您建立環境時,請務必記下包含自定義位置的自定義位置名稱和資源群組的名稱。 您可以使用這些來尋找自定義位置識別碼,您在環境中建立函式應用程式時需要此識別碼。

如果您未建立環境,請洽詢叢集管理員。

新增 Azure CLI 擴充功能

在 Azure Cloud Shell啟動 Bash 環境。

因為這些 CLI 命令還不是核心 CLI 集合的一部分,請使用下列命令加以新增:

az extension add --upgrade --yes --name customlocation
az extension remove --name appservice-kube
az extension add --upgrade --yes --name appservice-kube

建立 Azure 資源

您必須先建立兩個資源,才能將容器部署至新的 App Service Kubernetes 環境:

  • 儲存體 帳戶。 雖然本文會建立記憶體帳戶,但在某些情況下,可能不需要記憶體帳戶。 如需詳細資訊,請參閱 記憶體考慮一文中的已啟用 Azure Arc 的叢集
  • 函式應用程式,提供執行容器的內容。 函式應用程式會在 App Service Kubernetes 環境中執行,並對應至您的本機函式專案。 函式應用程式可讓您將多個函式以邏輯單位分組,以方便您管理、部署和共用資源。

注意

函式應用程式會在專用 (App Service) 方案中的 App Service Kubernetes 環境中執行。 當您在沒有現有方案的情況下建立函式應用程式時,會為您建立方案。

建立 儲存體 帳戶

使用 az storage account create 命令,在您的資源群組和區域中建立一般用途的記憶體帳戶:

az storage account create --name <STORAGE_NAME> --location westeurope --resource-group myResourceGroup --sku Standard_LRS

注意

在某些情況下,可能不需要記憶體帳戶。 如需詳細資訊,請參閱 記憶體考慮一文中的已啟用 Azure Arc 的叢集

在上一個範例中,將 取代<STORAGE_NAME>為您適用的名稱,並在 Azure 儲存體 中是唯一的。 名稱必須包含三到 24 個字元的數位和小寫字母。 Standard_LRS會指定 Functions 支援的一般用途帳戶。 此值 --location 是標準 Azure 區域。

建立函數應用程式

執行 az functionapp create 命令,在環境中建立新的函式應用程式。

az functionapp create --name <APP_NAME> --custom-location <CUSTOM_LOCATION_ID> --storage-account <STORAGE_NAME> --resource-group AzureFunctionsContainers-rg --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --registry-username <USERNAME> --registry-password <SECURE_PASSWORD> 

在此範例中,將 取代 <CUSTOM_LOCATION_ID> 為您為App Service Kubernetes環境決定的自定義位置標識碼。 此外,請將 取代<STORAGE_NAME>為您在上一個步驟中使用的帳戶名稱,<APP_NAME>並以全域唯一名稱取代 ,或<DOCKER_ID><LOGIN_SERVER>分別取代為您的 Docker Hub 帳戶標識碼或 Container Registry 伺服器。 當您從自定義容器登錄進行部署時,映像名稱會指出登錄的URL。

當您第一次建立函式應用程式時,它會從 Docker Hub 提取初始映像。

設定必要的應用程式設定

執行下列命令來建立記憶體帳戶的應用程式設定 連接字串:

storageConnectionString=$(az storage account show-connection-string --resource-group AzureFunctionsContainers-rg --name <STORAGE_NAME> --query connectionString --output tsv)
az functionapp config appsettings set --name <app_name> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage=$storageConnectionString

此程式代碼必須在 Cloud Shell 或本機電腦上的 Bash 中執行。 取代為記憶體帳戶名稱,並以<APP_NAME>函式應用程式名稱取代 <STORAGE_NAME>

在 Azure 上叫用函式

因為您的函式會使用 HTTP 觸發程式,所以您會在瀏覽器中對其 URL 提出 HTTP 要求,或使用 curl 之類的工具來叫用它。

將 publish 命令輸出中顯示的完整 叫用 URL 複製到瀏覽器網址列,並附加查詢參數 ?name=Functions。 當您在本機執行函式時,瀏覽器應該會顯示類似的輸出。

The output of the function run on Azure in a browser

清除資源

如果您想要使用本文中建立的資源繼續使用 Azure Function,您可以將所有這些資源都保留到位。

當您完成此函式應用程式部署時,請刪除 AzureFunctionsContainers-rg 資源群組以清除該群組中的所有資源:

az group delete --name AzureFunctionsContainers-rg

這隻會移除本文中建立的資源。 基礎 Azure Arc 環境仍已就緒。

下一步