共用方式為


在 Azure 容器應用程式上建立您的第一個容器化函式

在本文中,您會建立在 Linux 容器中執行的函數應用程式,並從容器登錄將其部署至 Azure 容器應用程式環境。 藉由部署至容器應用程式,您可以將函式應用程式整合至雲端原生微服務中。 如需詳細資訊,請參閱 Azure Functions 的 Azure 容器應用程式裝載

本文說明如何建立在 Linux 容器中執行的函式,並將容器部署至容器應用程式環境。

完成本快速入門會在 Azure 帳戶中產生一些小額費用 (以美元計價),您可以在完成時清除資源,將這些成本降到最低。

選擇您的開發語言

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

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

必要條件

開始之前,您必須符合下列需求:

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

若要將您所建立的容器化函式應用程式映像發佈至容器登錄,您需要 Docker 識別碼,並在本機電腦上執行 Docker。 如果您沒有 Docker 識別碼,則可以建立 Docker 帳戶

您也需要完成 Azure Container Registry 快速入門的建立容器登錄一節,以建立登錄執行個體。 記下完整的登入伺服器名稱。

建立並啟用虛擬環境

在適用的資料夾中執行下列命令,以建立並啟用名為 .venv 的虛擬環境。 務必使用 Azure Functions 支援的其中一個 Python 版本

python -m venv .venv
source .venv/bin/activate

如果 Python 未在您的 Linux 發行版本上安裝 venv 套件,請執行下列命令:

sudo apt-get install python3-venv

您將在這個已啟用的虛擬環境中執行所有後續命令。

建立和測試本機 Functions 專案

在終端機或命令提示字元中,針對您選擇的語言執行下列命令,以在目前的資料夾中建立函式應用程式專案:

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 會要求您提供在部署時完成產生專案所需的值。 依照提示操作並提供下列資訊:

提示 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"

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

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

若要在本機測試函式,請啟動專案根資料夾中的本機 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。 瀏覽器必須顯示 "hello" 訊息,回應 Functions,這是提供給 name 查詢參數的值。

Ctrl+C (在 macOS 上為 Command+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_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 Container Registry 是私人登錄服務,用於建置、儲存和管理容器映像和相關成品。 您應該使用私人登錄服務,將容器發佈至 Azure 服務。

  1. 使用此指令,以使用您目前的 Azure 認證登入您的登錄執行個體:

    az acr login --name <REGISTRY_NAME>
    

    在上一個命令中,以 Azure Container Registry 執行個體的名稱取代 <REGISTRY_NAME>

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

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

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

  3. 使用此命令將容器推送至您的登錄執行個體:

    docker push <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
    

為您的函式建立支援的 Azure 資源

若要將容器部署至 Azure,您必須建立三個資源:

  • 資源群組,這是相關資源的邏輯容器。
  • 儲存體帳戶,用來維護函數的狀態和其他資訊。
  • 具有 Log Analytics 工作區的 Azure 容器應用程式環境。
  • 使用者指派的受控識別,可讓您的函式應用程式在不使用共用秘密的情況下安全地連線到 Azure 資源。 改為使用 Microsoft Entra 驗證搭配身分識別來建立 Azure 儲存體 帳戶和 Azure Container Registry 實例的連線,這是針對此案例建議的。

注意

Docker Hub 不支援受控識別。

使用這些指令來建立所需的 Azure 資源:

  1. 如有必要,請登入 Azure:

    az login 命令會將您登入 Azure 帳戶。 當您有一個以上的訂用帳戶與您的帳戶相關聯時,請使用 az account set

  2. 執行下列命令,以將 Azure CLI 更新至最新版本:

    az upgrade
    

    如果您的 Azure CLI 版本不是最新版本,則會開始安裝。 升級方式取決於您的作業系統。 您可以在升級完成之後繼續進行。

  3. 執行下列命令,以升級 Azure 容器應用程式擴充功能,並註冊容器應用程式所需的命名空間:

    az extension add --name containerapp --upgrade -y
    az provider register --namespace Microsoft.Web 
    az provider register --namespace Microsoft.App 
    az provider register --namespace Microsoft.OperationalInsights 
    
  4. 建立名為 AzureFunctionsContainers-rg 的資源群組。

    az group create --name AzureFunctionsContainers-rg --location eastus
    

    az group create 命令會在美國東部區域建立資源群組。 如果您想改用附近的區域,請使用從 az account list-locations 命令傳回的可用區域代碼。 您必須修改後續命令,以使用自訂區域,而不是 eastus

  5. 建立啟用了工作負載設定檔的 Azure 容器應用程式環境。

    az containerapp env create --name MyContainerappEnvironment --enable-workload-profiles --resource-group AzureFunctionsContainers-rg --location eastus
    

    此命令需要幾分鐘的時間才能完成。

  6. 在資源群組和區域中建立一般用途的記憶體帳戶,而不需共用密鑰存取。

    az storage account create --name <STORAGE_NAME> --location eastus --resource-group AzureFunctionsContainers-rg --sku Standard_LRS --allow-blob-public-access false --allow-shared-key-access false
    

    命令 az storage account create 會建立只能使用已授與特定資源許可權之 entra 驗證身分識別Microsoft存取的記憶體帳戶。

    在上述範例中,請將 <STORAGE_NAME> 取代為適合您且在 Azure 儲存體中是唯一的名稱。 儲存體名稱只能包含 3 到 24 個字元的數字和小寫字母。 Standard_LRS 會指定 受 Functions 支援的一般用途帳戶。

  7. 建立受控識別,並使用 傳 principalId 回的 ,將記憶體帳戶的存取權和登錄實例中的提取許可權授與它。

    principalId=$(az identity create --name <USER_IDENTITY_NAME> --resource-group AzureFunctionsContainers-rg --location eastus --query principalId -o tsv) 
    acrId=$(az acr show --name <REGISTRY_NAME> --query id --output tsv)
    az role assignment create --assignee-object-id $principalId --assignee-principal-type ServicePrincipal --role acrpull --scope $acrId
    storageId=$(az storage account show --resource-group AzureFunctionsContainers-rg --name glengatestaca2 --query 'id' -o tsv)
    az role assignment create --assignee-object-id $principalId --assignee-principal-type ServicePrincipal --role "Storage Blob Data Owner" --scope $storageId
    

    命令 az identity create 會建立使用者指派的受控識別,而 az role assignment create 命令會將您的身分識別新增至必要的角色。 將、 <USER_IDENTITY_NAME><STORAGE_NAME> 取代<REGISTRY_NAME>為您現有的容器登錄名稱、受控識別的名稱,以及記憶體帳戶名稱。 應用程式現在可以使用受控識別來存取記憶體帳戶和 Azure Container Registry,而不需使用共用秘密。

使用映像在 Azure 上建立及設定函式應用程式

Azure 上的函數應用程式可管理 Azure 容器應用程式環境中函式的執行。 在本節中,您會使用上一節中的 Azure 資源,從容器應用程式環境中的容器登錄中的映像建立函數應用程式。 您也可以使用所需 Azure 儲存體帳戶的連線字串來設定新環境。

az functionapp create使用 命令,在 Azure Container Apps 所支援的新受控環境中建立函式應用程式。 在 az functionapp create--environment ,參數會指定 Container Apps 環境。

提示

若要確定您的函式應用程式使用以受控識別為基礎的登錄實例連線,請勿在 中az functionapp create設定 --image 參數。 當您在存放庫中設定 --image 為映像的完整名稱時,會從登錄取得共用密碼認證,並儲存在應用程式設定中。

首先,您必須取得使用者指派受控識別的完整標識符值,並具有登錄提取存取權,然後使用 az functionapp create 命令,使用預設映像和指派此身分識別來建立函式應用程式。

UAMI_RESOURCE_ID=$(az identity show --name $uami_name --resource-group $group --query id -o tsv)
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --assign-identity $UAMI_RESOURCE_ID

az functionapp create中,會將 --assign-identity 受控識別指派給新的應用程式。 由於您未在 中az functionapp create設定 --image 參數,因此會使用佔位元影像建立應用程式。

在此範例中,請將、 <STORAGE_NAME><USER_IDENTITY_NAME> 取代<APP_NAME>為新函式應用程式的名稱,以及記憶體帳戶的名稱和身分識別。

最後,您必須將 linuxFxVersion 月臺設定更新為存放庫中映像的完整名稱。 您也必須更新 acrUseManagedIdentityCredsacrUserManagedIdentityID 月台設定,以便在從登錄取得映像時使用受控識別。

UAMI_RESOURCE_ID=$(az identity show --name <USER_IDENTITY_NAME> --resource-group AzureFunctionsContainers-rg --query id -o tsv)
az resource patch --resource-group AzureFunctionsContainers-rg --name <APP_NAME> --resource-type "Microsoft.Web/sites" --properties "{ \"siteConfig\": { \"linuxFxVersion\": \"DOCKER|<REGISTRY_NAME>.azurecr.io/azurefunctionsimage:v1.0.0\", \"acrUseManagedIdentityCreds\": true, \"acrUserManagedIdentityID\":\"$UAMI_RESOURCE_ID\", \"appSettings\": [{\"name\": \"DOCKER_REGISTRY_SERVER_URL\", \"value\": \"<REGISTRY_NAME>.azurecr.io\"}]}}"

除了必要的網站設定之外, az resource patch 命令也會將 DOCKER_REGISTRY_SERVER_URL 應用程式設定更新為登錄伺服器的URL。

在此範例中,分別將、 <REGISTRY_NAME><USER_IDENTITY_NAME> 取代<APP_NAME>為函式應用程式、容器登錄和身分識別的名稱。

指定 --workload-profile-name "Consumption" 會在使用預設 Consumption 工作負載設定檔的環境中建立您的應用程式,其成本與在容器應用程式取用方案中執行的成本相同。 當您第一次建立函數應用程式時,會從您的登錄中提取初始映像。

更新應用程式設定

若要讓 Functions 主機使用共用密碼連線到預設記憶體帳戶,您必須將 連接字串 設定取代AzureWebJobsStorage為使用使用者指派的受控識別來連線到記憶體帳戶的對等設定。

  1. 移除現有的 AzureWebJobsStorage 連接字串 設定:

    az functionapp config appsettings delete --name <APP_NAME> --resource-group AzureFunctionsContainers-rg --setting-names AzureWebJobsStorage 
    

    az functionapp config appsettings delete 命令會從您的應用程式中移除此設定。 以函式應用程式的名稱取代 <APP_NAME>

  2. 新增具有 AzureWebJobsStorage__ 前置詞的對等設定,以定義使用者指派的受控識別連線至預設記憶體帳戶:

    clientId=$(az identity show --name <USER_IDENTITY_NAME> --resource-group AzureFunctionsContainers-rg --query 'clientId' -o tsv)
    az functionapp config appsettings set --name <APP_NAME> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage__accountName=<STORAGE_NAME> AzureWebJobsStorage__credential=managedidentity AzureWebJobsStorage__clientId=$clientId
    

    在此範例中,請分別將、 <USER_IDENTITY_NAME><STORAGE_NAME> 取代<APP_NAME>為函式應用程式名稱、身分識別的名稱和記憶體帳戶名稱。

此時,您的函式正在容器應用程式環境中執行,並已新增必要的應用程式設定。 如有需要,您可以按照 Functions 的標準方式在您的函式應用中新增其他設定。 如需詳細資訊,請參閱使用應用程式設定

提示

對函式程式碼進行後續變更時,您需要重建容器、將映像重新發佈至登錄,並使用新的映像版本更新函數應用程式。 如需詳細資訊,請參閱更新登錄中的映像

在 Azure 上驗證您的函式

將映像部署至 Azure 中的函數應用程式後,您可以透過 HTTP 要求叫用函式。

  1. 執行下列 az functionapp function show 命令以取得新函式的 URL:

    az functionapp function show --resource-group AzureFunctionsContainers-rg --name <APP_NAME> --function-name HttpExample --query invokeUrlTemplate 
    

    以函式應用程式的名稱取代 <APP_NAME>

  1. 使用您剛才取得的 URL 來呼叫 HttpExample 函式端點,並附加查詢字串 ?name=Functions
  1. 使用您剛才取得的 URL 來呼叫 HttpExample 函式端點。

當您瀏覽至此 URL 時,瀏覽器必須在本機執行函式時顯示類似的輸出。

要求 URL 看起來應該像這樣:

https://myacafunctionapp.kindtree-796af82b.eastus.azurecontainerapps.io/api/httpexample?name=functions

https://myacafunctionapp.kindtree-796af82b.eastus.azurecontainerapps.io/api/httpexample

清除資源

如果您想使用您在本文中建立的資源來繼續使用 Azure 函式,您可以保留所有這些資源。

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

az group delete --name AzureFunctionsContainers-rg

下一步