共用方式為


快速入門:使用 Azure Functions 建置可調整的 Web API

在這個快速入門中,你會使用 Azure Developer 的命令列工具,建立一個可擴展的網頁 API,並以函式端點回應 HTTP 請求。 在本機測試程式碼之後,您會將其部署到您在 Azure Functions 的彈性使用量方案中執行的新無伺服器函數應用程式。

專案來源使用 Azure Developer CLI (azd) 來簡化將您的程式碼部署到 Azure。 此部署遵循目前安全且可調整的 Azure Functions 部署最佳做法。

預設情況下,Flex Consumption 方案採用按 使用量付費 的計費模式,這表示完成此快速啟動會在你的 Azure 帳戶中產生幾美元或更少的費用。

Prerequisites

初始化專案

使用命令 azd init 從範本建立本機 Azure Functions 程式碼專案。

  1. 在您的本機終端機或命令提示字元中,於空白資料夾中執行此 azd init 命令:

    azd init --template functions-quickstart-dotnet-azd -e httpendpoint-dotnet
    

    此命令會從範本存放庫提取專案檔,並初始化目前資料夾中的專案。 -e 旗標會設定目前環境的名稱。 在 azd 中,該環境會為您的應用程式維護一個唯一的部署內容,而您可以定義多個部署內容。 它也用於您在 Azure 中建立的資源群組名稱。

  2. 執行此命令以導覽至 http 應用程式資料夾:

    cd http
    
  3. 在包含此 JSON 資料的 http 資料夾中,建立名為 local.settings.json 的檔案:

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
        }
    }
    

    在本機執行時,需要此檔案。

  1. 在您的本機終端機或命令提示字元中,於空白資料夾中執行此 azd init 命令:

    azd init --template azure-functions-java-flex-consumption-azd -e httpendpoint-java 
    

    此命令會從範本存放庫提取專案檔,並初始化目前資料夾中的專案。 -e 旗標會設定目前環境的名稱。 在 azd 中,該環境會為您的應用程式維護一個唯一的部署內容,而您可以定義多個部署內容。 它也用於您在 Azure 中建立的資源群組名稱。

  2. 執行此命令以導覽至 http 應用程式資料夾:

    cd http
    
  3. 在包含此 JSON 資料的 http 資料夾中,建立名為 local.settings.json 的檔案:

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "java"
        }
    }
    

    在本機執行時,需要此檔案。

  1. 在您的本機終端機或命令提示字元中,於空白資料夾中執行此 azd init 命令:

    azd init --template functions-quickstart-javascript-azd -e httpendpoint-js
    

    此命令會從範本存放庫提取專案檔案,並在根資料夾中初始化專案。 -e 旗標會設定目前環境的名稱。 在 azd 中,該環境會為您的應用程式維護一個唯一的部署內容,而您可以定義多個部署內容。 它也用於您在 Azure 中建立的資源群組名稱。

  2. 在根資料夾中建立一個名為 local.settings.json 的檔案,內容包含此 JSON 資料:

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "node"
        }
    }
    

    在本機執行時,需要此檔案。

  1. 在您的本機終端機或命令提示字元中,於空白資料夾中執行此 azd init 命令:

    azd init --template functions-quickstart-powershell-azd -e httpendpoint-ps
    

    此命令會從範本存放庫提取專案檔案,並在根資料夾中初始化專案。 -e 旗標會設定目前環境的名稱。 在 azd 中,該環境會為您的應用程式維護一個唯一的部署內容,而您可以定義多個部署內容。 它也用於您在 Azure 中建立的資源群組名稱。

  2. 執行此命令以導覽至 src 應用程式資料夾:

    cd src
    
  3. 在包含此 JSON 資料的 src 資料夾中,建立名為 local.settings.json 的檔案:

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "powershell",
            "FUNCTIONS_WORKER_RUNTIME_VERSION": "7.2"
        }
    }
    

    在本機執行時,需要此檔案。

  1. 在您的本機終端機或命令提示字元中,於空白資料夾中執行此 azd init 命令:

    azd init --template functions-quickstart-typescript-azd -e httpendpoint-ts
    

    此命令會從範本存放庫提取專案檔案,並在根資料夾中初始化專案。 -e 旗標會設定目前環境的名稱。 在 azd 中,該環境會為您的應用程式維護一個唯一的部署內容,而您可以定義多個部署內容。 環境名稱也會用在你在 Azure 建立的資源群組名稱中。

  2. 在根資料夾中建立一個名為 local.settings.json 的檔案,內容包含此 JSON 資料:

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "node"
        }
    }
    

    在本機執行時,需要此檔案。

  1. 在您的本機終端機或命令提示字元中,於空白資料夾中執行此 azd init 命令:

    azd init --template functions-quickstart-python-http-azd -e httpendpoint-py
    

    此命令會從範本存放庫提取專案檔案,並在根資料夾中初始化專案。 -e 旗標會設定目前環境的名稱。 在 azd 中,該環境會為您的應用程式維護一個唯一的部署內容,而您可以定義多個部署內容。 環境名稱也會用在你在 Azure 建立的資源群組名稱中。

  2. 在根資料夾中建立一個名為 local.settings.json 的檔案,內容包含此 JSON 資料:

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "python"
        }
    }
    

    在本機執行時,需要此檔案。

建立並啟用虛擬環境

在根資料夾中,執行下列命令來建立並啟用名為 .venv 的虛擬環境:

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

如果 Python 沒有在你的 Linux 發行版安裝 venv 套件,請執行以下指令:

sudo apt-get install python3-venv

在您的本機環境中執行

  1. 在終端機或命令提示字元中,從您的應用程式資料夾執行此命令:

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

    當 Functions 主機在您的本機專案資料夾中啟動時,它會將 HTTP 觸發程序函式的 URL 端點寫入終端機輸出。

    Note

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

  2. 在瀏覽器中,前往 httpget 端點,應該會看到這個網址:

    http://localhost:7071/api/httpget

  3. 在新的終端機或命令提示字元視窗中,執行此 curl 命令,以向 httppost 端點傳送包含 JSON 承載的 POST 要求:

    curl -i http://localhost:7071/api/httppost -H "Content-Type: text/json" -d @testdata.json
    
    curl -i http://localhost:7071/api/httppost -H "Content-Type: text/json" -d "@src/functions/testdata.json"
    

    此命令會從 testdata.json 專案檔案讀取 JSON 承載資料。 您可以在 test.http 專案檔案中找到兩種 HTTP 要求的範例。

  4. 當您完成時,請在終端機視窗中按 Ctrl+C 以停止 func.exe 主機程序。

  1. 執行 deactivate 以關閉虛擬環境。

檢閱程式碼 (選用)

您可以檢閱定義這兩個 HTTP 觸發程序函式端點的程式碼:

       [Function("httpget")]
       public IActionResult Run([HttpTrigger(AuthorizationLevel.Function, "get")]
         HttpRequest req,
         string name)
       {
           var returnValue = string.IsNullOrEmpty(name)
               ? "Hello, World."
               : $"Hello, {name}.";

           _logger.LogInformation($"C# HTTP trigger function processed a request for {returnValue}.");

           return new OkObjectResult(returnValue);
       }
@FunctionName("httpget")
public HttpResponseMessage run(
        @HttpTrigger(
            name = "req",
            methods = {HttpMethod.GET},
            authLevel = AuthorizationLevel.FUNCTION)
            HttpRequestMessage<Optional<String>> request,
        final ExecutionContext context) {
    context.getLogger().info("Java HTTP trigger processed a request.");

    // Parse query parameter
    String name = Optional.ofNullable(request.getQueryParameters().get("name")).orElse("World");

    return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
}
const { app } = require('@azure/functions');

app.http('httpget', {
    methods: ['GET'],
    authLevel: 'function',
    handler: async (request, context) => {
        context.log(`Http function processed request for url "${request.url}"`);

        const name = request.query.get('name') || await request.text() || 'world';

        return { body: `Hello, ${name}!` };
    }
});
import { app, HttpRequest, HttpResponseInit, InvocationContext } from "@azure/functions";

export async function httpGetFunction(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    context.log(`Http function processed request for url "${request.url}"`);

    const name = request.query.get('name') || await request.text() || 'world';

    return { body: `Hello, ${name}!` };
};

app.http('httpget', {
    methods: ['GET'],
    authLevel: 'function',
    handler: httpGetFunction
});

function.json 檔案會定義 httpget 函式:

{
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "Request",
      "methods": [
        "get"
      ],
      "route": "httpget"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "Response"
    }
  ]
}

run.ps1 檔案會實作函式程式碼:

using namespace System.Net

# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

# Write to the Azure Functions log stream.
Write-Host "PowerShell HTTP trigger function processed a request."

# Interact with query parameters
$name = $Request.Query.name

$body = "This HTTP triggered function executed successfully. Pass a name in the query string for a personalized response."

if ($name) {
    $body = "Hello, $name. This HTTP triggered function executed successfully."
}

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = [HttpStatusCode]::OK
    Body = $body
})
@app.route(route="httpget", methods=["GET"])
def http_get(req: func.HttpRequest) -> func.HttpResponse:
    name = req.params.get("name", "World")

    logging.info(f"Processing GET request. Name: {name}")

    return func.HttpResponse(f"Hello, {name}!")

您可以在這裡檢閱完整的範本專案。

您可以在這裡檢閱完整的範本專案。

您可以在這裡檢閱完整的範本專案。

您可以在這裡檢閱完整的範本專案。

您可以在這裡檢閱完整的範本專案。

您可以在這裡檢閱完整的範本專案。

在本機驗證函式之後,是時候將它們發佈至 Azure 了。

部署至 Azure

此專案已設定為使用 azd up 命令,將此專案部署至 Azure 之彈性使用量方案中的新函數應用程式。

Tip

專案包含一組 Bicep 檔案 (位於 infra 資料夾),azd 會使用這些檔案,在符合最佳做法的彈性使用量方案上建立安全的部署。

  1. 執行此命令,讓 azd 在 Azure 中建立必要的 Azure 資源,並將程式碼專案部署至新的函數應用程式:

    azd up
    

    根資料夾包含 azd 所需的 azure.yaml 定義檔。

    如果你還沒登入,系統會要求你用 Azure 帳號進行認證。

  2. 出現提示時,請提供這些必要的部署參數:

    Parameter Description
    Azure 訂用帳戶 建立您資源所在位置的訂用帳戶。
    Azure 位置 要在其中建立包含新 Azure 資源之資源群組所在的 Azure 區域。 只會顯示目前支援彈性使用量方案的區域。
    vnetEnabled 選擇 False。 當設定為 True 時,部署會在新的虛擬網路中建立你的函式應用程式。

    azd up 指令會使用您的回應和 Bicep 設定檔來完成這些部署任務:

    • 建立和設定這些必要的 Azure 資源 (相當於 azd provision):

      • 彈性使用量方案和函數應用程式
      • Azure Storage (必要) 和 Application Insights (建議)
      • 您帳戶的存取原則和角色
      • 使用受控識別的服務對服務連線 (而不是預存的連接字串)
      • (選項)虛擬網路以安全執行函式應用程式及其他 Azure 資源
    • 將程式碼封裝並部署至部署容器 (相當於 azd deploy)。 然後,應用程式會啟動並在已部署的套件中執行。

    命令成功完成之後,您會看到所建立資源的連結。

在 Azure 上調用函式

你現在可以透過 HTTP 測試工具或瀏覽器(針對 GET 請求)向 Azure 的函式端點發送 HTTP 請求,來呼叫它們的 URL。 當您的函式在 Azure 上執行時,會強制使用存取金鑰授權,且您必須在要求中提供函式存取金鑰。

你可以用核心工具(Core Tools)讓函式的 URL 端點在 Azure 上運行。

  1. 在您的本機終端機或命令提示字元中,執行這些命令以取得 URL 端點值:

    SET APP_NAME=$(azd env get-value AZURE_FUNCTION_NAME)
    func azure functionapp list-functions $APP_NAME --show-keys
    
    $APP_NAME = azd env get-value AZURE_FUNCTION_NAME
    func azure functionapp list-functions $APP_NAME --show-keys
    

    azd env get-value 命令會從本機環境取得函數應用程式名稱。 當你使用帶有 func azure functionapp list-functions--show-keys 選項時,每個端點返回的 Invoke URL: 值會包含一個函式層級的存取金鑰。

  2. 如同之前一樣,使用您的 HTTP 測試工具來驗證在 Azure 中執行的函式應用程式中的這些 URL。

重新部署程式碼

執行 azd up 這個指令可以讓你根據需要多次配置 Azure 資源,並將程式碼更新部署到你的函式應用程式。

Note

最新的部署套件一律會覆寫已部署的程式碼檔案。

您對 azd 提示的初始回應,以及由 azd 產生的任何環境變數,都會儲存在您命名的環境中。 使用 azd env get-values 指令來檢視你在建立 Azure 資源時使用的所有變數。

清除資源

完成函式應用程式及相關資源後,請使用此指令將函式應用程式及其相關資源從 Azure 刪除,避免產生額外費用:

azd down --no-prompt

Note

--no-prompt 選項會指示 azd 刪除您的資源群組,而不需要您確認。

此命令不會影響您的本機程式碼專案。