共用方式為


快速入門:從命令行在 Azure 中建立函式

在本文中,您會使用本機命令行工具來建立回應 HTTP 要求的函式。 在本機驗證程式代碼之後,您會將其部署至 Azure Functions 中的無伺服器 Flex Consumption 主控方案。

完成本快速入門後,您的 Azure 帳戶中會產生幾美分或更少的少許費用。

請務必在文章頂端選取您慣用的開發語言。

Prerequisites

  • Go,建議使用最新版本。 請使用 go version 命令來檢查您的版本。

安裝 Azure Functions Core Tools

安裝 Core Tools 的建議方式取決於本機開發電腦的作業系統。

下列步驟使用 Windows 安裝程式 (MSI) 來安裝 Core Tools v4.x。 如需其他套件型安裝程式的詳細資訊,請參閱 Core Tools 讀我檔案

根據您的 Windows 版本,下載並執行 Core Tools 安裝程式:

如果您之前使用 Windows 安裝程式 (MSI) 在 Windows 上安裝 Core Tools,則應該先從 [新增移除程式] 解除安裝舊版本,再安裝最新版本。

建立並啟用虛擬環境

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

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

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

sudo apt-get install python3-venv

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

建立本機程式代碼專案和函式

在 Azure Functions 中,你的程式碼專案是一個包含一個或多個獨立函式的應用程式,每個函式會回應特定觸發器。 專案中的所有函式都會共用相同的組態,並部署為單元至 Azure。 在本節中,您會建立包含單一函式的程式代碼專案。

  1. 在終端機或命令提示字元中,執行此命令 func init 以在目前資料夾中建立函式應用程式專案:

    func init --worker-runtime dotnet-isolated 
    
  1. 在終端機或命令提示字元中,執行此命令 func init 以在目前資料夾中建立函式應用程式專案:

    func init --worker-runtime node --language javascript 
    
  1. 在終端機或命令提示字元中,執行此命令 func init 以在目前資料夾中建立函式應用程式專案:

    func init --worker-runtime powershell 
    
  1. 在終端機或命令提示字元中,執行此命令 func init 以在目前資料夾中建立函式應用程式專案:

    func init --worker-runtime python 
    
  1. 在終端機或命令提示字元中,執行此命令 func init 以在目前資料夾中建立函式應用程式專案:

    func init --worker-runtime node --language typescript 
    
  1. 在終端機或命令提示字元中,執行此命令 func init 以在目前資料夾中建立函式應用程式專案:

    func init --worker-runtime custom 
    
  1. 在空白資料夾中,執行此命令 mvn 以從 Azure Functions Maven 原型產生程式代碼專案:

    mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=17
    

    Important

    • 如果您希望函式在 Java 11 上執行,請使用 -DjavaVersion=11。 若要深入瞭解,請參閱 Java 版本
    • 請將環境變數設 JAVA_HOME 為正確版本 JDK 的安裝位置以完成本文。
  2. Maven 會要求您提供在部署時完成產生專案所需的值。
    出現提示時,請提供下列值:

    Prompt Value Description
    groupId com.fabrikam 此值可在所有專案中唯一識別您的專案,並遵循適用於 Java 的套件命名規則
    artifactId fabrikam-functions 此值是 jar 的名稱 (不含版本號碼)。
    version 1.0-SNAPSHOT 選擇預設值。
    package com.fabrikam 此值是所產生函式程式碼的 Java 套件。 使用預設值。
  3. 輸入 Y 或按 Enter 進行確認。

    Maven 會在名為 artifactId 的新資料夾中建立項目檔,在此範例中為 fabrikam-functions

  4. 瀏覽至專案資料夾:

    cd fabrikam-functions
    

    您可以在 \src\main\java\com\fabrikam 專案目錄的 Function.java中檢閱新 HTTP 觸發程式函式的範本產生程式代碼。

  1. 使用此指令 func new 將函式新增至您的專案:

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

    新的程式代碼檔案會新增至您的專案。 在此情況下,--name 參數是您函數的唯一名稱(HttpExample),而 --template 參數設置 HTTP 觸發器。

專案根資料夾包含項目的各種檔案,包括名為 local.settings.jsonhost.json的 組態檔。 因為 local.settings.json 可以包含從 Azure 下載的秘密,因此檔案預設會從原始檔控制中排除在 .gitignore 檔案中。

建立和建置您的函式

HttpExample 資料夾中的 function.json 檔案會宣告 HTTP 觸發程序函式。 您可以藉由新增處理常式並將其編譯為可執行檔來完成函式。

  1. Ctrl + N (macOS 上為 Cmd + N) 以建立新檔案。 在函式應用程式根目錄中將它儲存為 handler.go (在與 host.json 相同的資料夾中)。

  2. handler.go 中,新增下列程式碼並儲存檔案。 這是您的 Go 自訂處理常式。

    package main
    
    import (
        "fmt"
        "log"
        "net/http"
        "os"
    )
    
    func helloHandler(w http.ResponseWriter, r *http.Request) {
        message := "This HTTP triggered function executed successfully. Pass a name in the query string for a personalized response.\n"
        name := r.URL.Query().Get("name")
        if name != "" {
            message = fmt.Sprintf("Hello, %s. This HTTP triggered function executed successfully.\n", name)
        }
        fmt.Fprint(w, message)
    }
    
    func main() {
        listenAddr := ":8080"
        if val, ok := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT"); ok {
            listenAddr = ":" + val
        }
        http.HandleFunc("/api/HttpExample", helloHandler)
        log.Printf("About to listen on %s. Go to https://127.0.0.1%s/", listenAddr, listenAddr)
        log.Fatal(http.ListenAndServe(listenAddr, nil))
    }
    
  3. Ctrl + Shift +` 或從 [終端機] 功能表中選取 [新增終端機],以在 VS Code 中開啟新的整合式終端機。

  4. 使用下列命令編譯您的自訂處理常式。 名為 handler 的可執行檔 (Windows 上為 handler.exe) 會在函式應用程式根資料夾中輸出。

    go build handler.go
    

設定函式應用程式

函式主機必須設定為在啟動時執行您的自訂處理常式二進位檔案。

  1. 開啟 host.json

  2. customHandler.description 區段中,將 defaultExecutablePath 的值設定為 handler (在 Windows 上,將其設定為 handler.exe)。

  3. customHandler 區段中,新增名為 enableForwardingHttpRequest 的屬性,並將其值設定為 true。 對於只包含 HTTP 觸發程序的函式,此設定透過允許您使用一般 HTTP 要求,而不是自訂處理常式要求承載來簡化程式設計。

  4. 確認 customHandler 區段看起來像此範例。 儲存檔案。

    "customHandler": {
      "description": {
        "defaultExecutablePath": "handler",
        "workingDirectory": "",
        "arguments": []
      },
      "enableForwardingHttpRequest": true
    }
    

函式應用程式已設定為啟動您的自訂處理常式可執行檔。

在本機執行函式

在本機執行專案並呼叫函式端點,以確認您的新函式。

  1. 使用此命令,在專案資料夾根目錄中啟動本地 Azure Functions 執行階段主機:

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

    在輸出接近尾聲時,會出現以下幾行:

     ...
    
     Now listening on: http://0.0.0.0:7071
     Application started. Press Ctrl+C to shut down.
    
     Http Functions:
    
             HttpExample: [GET,POST] http://localhost:7071/api/HttpExample
     ...
    
     
  2. 將此輸出中的HttpExample函式複製 URL 並貼到瀏覽器中,然後瀏覽至該函式的 URL。 您應該會收到一個包含「你好,世界!」訊息內容的成功回覆。

    Note

    因為本地執行時不會強制執行存取金鑰授權,回傳的函式 URL 不會包含存取金鑰值,你也不需要它來呼叫函式。

  3. 完成時,請使用 Ctrl+C 並選擇 y 停止函式主機。

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

您必須先建立下列資源,才能將函式程式代碼部署至 Azure:

  • 資源群組,這是相關資源的邏輯容器。
  • 預設儲存體帳戶,由 Functions 主機用來維護函式的狀態和其他資訊。
  • 使用者指派的受控識別,由 Functions 主機用來連線到預設儲存體帳戶。
  • 函式應用程式,可提供用來執行函式程式碼的環境。 函式應用程式可對應至您的本機函式專案,並可讓您將函式分組為邏輯單位,以便管理、部署和共用資源。

使用這些步驟中的 Azure CLI 命令來建立必要的資源。

  1. 如果您尚未登入 Azure,請於此時登入:

    az login
    

    az login 命令會將您登入 Azure 帳戶。 在 Azure Cloud Shell 中執行時,請略過此步驟。

  2. 如果您尚未這麼做,請使用此命令 az extension add 來安裝 Application Insights 擴充功能:

    az extension add --name application-insights
    
  3. 使用此 az group create 命令,在所選區域中建立名為 AzureFunctionsQuickstart-rg 的資源群組:

    az group create --name "AzureFunctionsQuickstart-rg" --location "<REGION>"
    

    在此範例中,將 <REGION> 替換為距您較近且支援 Flex Consumption 方案的區域。 使用 az functionapp list-flexconsumption-locations 命令來檢視目前支持的區域清單。

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

    az storage account create --name <STORAGE_NAME> --location "<REGION>" --resource-group "AzureFunctionsQuickstart-rg" \
    --sku "Standard_LRS" --allow-blob-public-access false --allow-shared-key-access false
    

    在此範例中,將 <STORAGE_NAME> 替換為適合您的名稱,並確保該名稱在 Azure 儲存體中是唯一的。 名稱只能包含 3 到 24 個字元的數字和小寫字母。 Standard_LRS 會指定受 Functions 支援的一般用途帳戶。 此新帳戶只能使用已授與特定資源許可權Microsoft Entra 驗證的身分識別來存取。

  5. 使用此腳本來建立使用者指派的受控識別、使用 jq剖析 對象的傳回 JSON 屬性,並在預設記憶體帳戶中授與 Storage Blob Data Owner 許可權:

    output=$(az identity create --name "func-host-storage-user" --resource-group "AzureFunctionsQuickstart-rg" --location <REGION> \
    --query "{userId:id, principalId: principalId, clientId: clientId}" -o json)
    
    userId=$(echo $output | jq -r '.userId')
    principalId=$(echo $output | jq -r '.principalId')
    clientId=$(echo $output | jq -r '.clientId')
    
    storageId=$(az storage account show --resource-group "AzureFunctionsQuickstart-rg" --name <STORAGE_NAME> --query 'id' -o tsv)
    az role assignment create --assignee-object-id $principalId --assignee-principal-type ServicePrincipal \
    --role "Storage Blob Data Owner" --scope $storageId
    

    如果您在本機 Bash 殼層中沒有 jq 公用程式,則可在 Azure Cloud Shell 中使用。 在這裡範例中,分別以預設記憶體帳戶名稱和區域取代 <STORAGE_NAME><REGION>

    az identity create 命令會建立名為 func-host-storage-user的身分識別。 傳回的 principalId 是用來使用 az role assignment create 指令,將許可權指派給預設儲存帳戶的這個新身分識別。 az storage account show命令是用來取得記憶體帳戶標識碼。

  6. 使用此 az functionapp create 命令在 Azure 中建立函式應用程式:

    az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \
    --runtime dotnet-isolated --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \
    --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"
    
    az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \
    --runtime java --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \
    --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"
    
    az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \
    --runtime node --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \
    --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"
    
    az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \
    --runtime python --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \
    --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"
    
    az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \
    --runtime python --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \
    --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"
    
    az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \
    --runtime other --storage-account <STORAGE_NAME> \
    --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"
    

    在此範例中,請將這些佔位元取代為適當的值:

    • <APP_NAME>:適合您的全域唯一名稱。 <APP_NAME> 也是函式應用程式的預設 DNS 網域。
    • <STORAGE_NAME>:您在上一個步驟中使用的帳戶名稱。
    • <REGION>:您目前的區域。
    • <LANGUAGE_VERSION>:在適用時,使用你在本地驗證過的 支援語言堆疊版本

    此命令可在彈性使用量方案中建立在您指定的語言執行階段中執行的函式應用程式,而此應用程式在此處產生的使用量是免費的。 此命令也會在相同的資源群組中建立相關聯的 Azure Application Insights 實例,讓您用來監視函式應用程式執行和檢視記錄。 如需詳細資訊,請參閱監視 Azure Functions。 在您啟用此執行個體之前,並不會產生任何成本。

  7. 使用此腳本,將使用者指派的受控識別新增至 Application Insights 實例中的 監視計量發行者 角色:

    appInsights=$(az monitor app-insights component show --resource-group "AzureFunctionsQuickstart-rg" \
        --app <APP_NAME> --query "id" --output tsv)
    principalId=$(az identity show --name "func-host-storage-user" --resource-group "AzureFunctionsQuickstart-rg" \
        --query principalId -o tsv)
    az role assignment create --role "Monitoring Metrics Publisher" --assignee $principalId --scope $appInsights
    

    在此範例中,以您的函式應用程式名稱取代 <APP_NAME>az role assignment create 命令會將使用者新增至角色。 Application Insights 執行個體的資源識別碼和使用者的主體識別碼分別是使用 az monitor app-insights component showaz identity show 命令來取得。

更新應用程式設定

若要讓函式主機透過共享秘密連接至預設儲存體帳戶,請將AzureWebJobsStorage連接字串設定替換為多個以AzureWebJobsStorage__為前綴的設定。 這些設定會定義複雜的設定,以便應用程式以使用者指派的受控識別來連線到儲存體和 Application Insights。

  1. 使用此腳本來取得使用者指派受控識別的用戶端識別符,並用它來定義記憶體和 Application Insights 的受控識別連線:

    clientId=$(az identity show --name func-host-storage-user \
        --resource-group AzureFunctionsQuickstart-rg --query 'clientId' -o tsv)
    az functionapp config appsettings set --name <APP_NAME> --resource-group "AzureFunctionsQuickstart-rg" \
        --settings AzureWebJobsStorage__accountName=<STORAGE_NAME> \
        AzureWebJobsStorage__credential=managedidentity AzureWebJobsStorage__clientId=$clientId \
        APPLICATIONINSIGHTS_AUTHENTICATION_STRING="ClientId=$clientId;Authorization=AAD"
    

    在這裡文稿中,分別以函式應用程式和記憶體帳戶的名稱取代 <APP_NAME><STORAGE_NAME>

  2. 執行 az functionapp config appsettings delete 命令來移除現有的 AzureWebJobsStorage 連接字串設定,其中包含共用的秘密密鑰:

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

    在此範例中,將 <APP_NAME> 取代為您的函式應用程式的名稱。

此時,Functions 主機可以透過管理身份而非共享秘密,安全連接儲存帳號。 您現在可以將專案程式代碼部署到 Azure 資源。

將函式專案部署至 Azure

在 Azure 中成功建立函式應用程式之後,您就可以開始使用 func azure functionapp publish 命令來部署本機函式專案。

  1. 在您的根專案資料夾中,執行此 func azure functionapp publish 命令:

    func azure functionapp publish <APP_NAME>
    

    在此範例中,使用您的應用程式名稱取代 <APP_NAME>。 成功的部署會顯示類似下列輸出的結果 (為了簡單起見,已將其截斷):

     ...
    
     Getting site publishing info...
     Creating archive for current directory...
     Performing remote build for functions project.
    
     ...
    
     Deployment successful.
     Remote build succeeded!
     Syncing triggers...
     Functions in msdocs-azurefunctions-qs:
         HttpExample - [httpTrigger]
             Invoke url: https://msdocs-azurefunctions-qs.azurewebsites.net/api/httpexample
     
  2. 在你的本地終端機或命令提示字元中,執行此指令取得 URL 端點值,包括存取鍵:

    func azure functionapp list-functions <APP_NAME> --show-keys
    

    在這個例子中,再次將 <APP_NAME> 替換成您的應用程式名稱。

  3. 複製回傳的端點 URL 和金鑰,然後用來呼叫函式端點。

更新 pom.xml 檔案

在你成功在 Azure 建立函式應用程式後,更新 pom.xml 檔案,讓 Maven 能部署到你的新應用程式。 否則,Maven 會在部署時建立一組新的 Azure 資源。

  1. 在 Azure Cloud Shell 中,使用此命令 az functionapp show 來取得新使用者指派受控識別的部署容器 URL 和識別碼:

    az functionapp show --name <APP_NAME> --resource-group AzureFunctionsQuickstart-rg  \
        --query "{userAssignedIdentityResourceId: properties.functionAppConfig.deployment.storage.authentication.userAssignedIdentityResourceId, \
        containerUrl: properties.functionAppConfig.deployment.storage.value}"
    

    在此範例中,將 <APP_NAME> 取代為您的函式應用程式的名稱。

  2. 在專案根目錄中,透過文字編輯器開啟 pom.xml 檔案,找到該 properties 元素,並更新以下特定屬性值:

    屬性名稱 Value
    java.version 使用您在本機驗證的相同 支援語言堆疊版本 , 例如 17
    azure.functions.maven.plugin.version 1.37.1
    azure.functions.java.library.version 3.1.0
    functionAppName 在 Azure 中的功能應用程式名稱。
  3. 尋找 configuration 區段 azure-functions-maven-plugin,並以此 XML 片段取代。

    <configuration>
        <appName>${functionAppName}</appName>
        <resourceGroup>AzureFunctionsQuickstart-rg</resourceGroup>
        <pricingTier>Flex Consumption</pricingTier>
        <region>....</region>
        <runtime>
            <os>linux</os>
            <javaVersion>${java.version}</javaVersion>
        </runtime>
        <deploymentStorageAccount>...</deploymentStorageAccount>
        <deploymentStorageResourceGroup>AzureFunctionsQuickstart-rg</deploymentStorageResourceGroup>
        <deploymentStorageContainer>...</deploymentStorageContainer>
        <storageAuthenticationMethod>UserAssignedIdentity</storageAuthenticationMethod>
        <userAssignedIdentityResourceId>...</userAssignedIdentityResourceId>
        <appSettings>
            <property>
                <name>FUNCTIONS_EXTENSION_VERSION</name>
                <value>~4</value>
            </property>
        </appSettings>
    </configuration>
    
  4. 在新的 configuration 元素中,對省略號 (...) 值進行這些特定的取代:

    Configuration Value
    region 現有函式應用程式的區域代碼,例如 eastus
    deploymentStorageAccount 儲存體帳戶的名稱。
    deploymentStorageContainer 部署共用的名稱,其在您取得的 \ 值中 containerUrl 之後。
    userAssignedIdentityResourceId 您所取得受控識別的完整資源識別碼。
  5. 將變更儲存至 pom.xml 檔案。

您現在可以使用 Maven 將程式代碼專案部署到現有的應用程式。

將函式專案部署至 Azure

  1. 從命令提示字元執行此命令:

    mvn clean package azure-functions:deploy
    
  2. 部署成功後,執行 Core Tools 指令取得 URL 端點值,包括存取金鑰:

    func azure functionapp list-functions <APP_NAME> --show-keys
    

    在這個例子中,再次將 <APP_NAME> 替換成您的應用程式名稱。

  3. 複製回傳的端點 URL 和金鑰,然後用來呼叫函式端點。

在 Azure 上叫用函式

因為你的函式使用 HTTP 觸發器並支援 GET 請求,你透過函式層級存取鍵對其 URL 發出 HTTP 請求來呼叫它。 在瀏覽器中執行 GET 請求是最簡單的方式。

把你複製的網址和存取金鑰貼到瀏覽器網址列。

端點 URL 看起來應該像下列範例:

https://contoso-app.azurewebsites.net/api/httpexample?code=aabbccdd...

在這種情況下,在對端點 URL 發出 GET 請求時,你也必須在查詢字串中提供存取金鑰。 建議使用存取金鑰來限制隨機用戶端的存取權限。 使用 HTTP 用戶端發送 POST 請求時,應該在標頭中提供存取金鑰 x-functions-key

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

清理資源

如果您要繼續進行下一個步驟並新增 Azure 儲存體佇列輸出繫結,請保留您所有的資源,因為在後續的工作還會用到。

否則,請使用下列命令刪除資源群組及其包含的所有資源,以避免產生額外的成本。

az group delete --name AzureFunctionsQuickstart-rg

後續步驟