共用方式為


快速入門:使用 Azure Functions 執行排程任務

在本文中,你會使用 Azure Developer CLI(azd)來建立一個計時器觸發函式,在 Azure Functions 中執行排程任務。 在本地驗證程式碼後,你會部署到你在 Azure Functions 中以 Flex Consumption 計畫建立的新無伺服器函式應用程式。

專案原始碼用 azd 來建立函式應用程式及相關資源,並將程式碼部署到 Azure。 此部署遵循目前安全且可調整的 Azure Functions 部署最佳做法。

預設情況下,Flex Consumption 方案採用按 使用量付費 的計費模式,這表示你可以完成本文,且在 Azure 帳戶中只需花費幾美元或更少的費用。

這很重要

雖然所有語言都支援 執行排程任務 ,但這個快速入門情境目前僅包含 C#、Python 和 TypeScript 的範例。 要完成此快速入門,請在文章頂端選擇其中一種支援語言。

先決條件

初始化專案

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

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

    azd init --template functions-quickstart-dotnet-azd-timer -e scheduled-dotnet
    

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

  2. 執行這個指令,可以切換到應用程式資料夾:

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

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

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

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

    azd init --template functions-quickstart-typescript-azd-timer -e scheduled-ts
    

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

  2. 在包含此 JSON 資料的 資料夾中,建立名為 src 的檔案:

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "node",
            "TIMER_SCHEDULE": "*/30 * * * * *"
        }
    }
    

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

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

    azd init --template functions-quickstart-python-azd-timer -e scheduled-py
    

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

  2. 在包含此 JSON 資料的 資料夾中,建立名為 src 的檔案:

    {
        "IsEncrypted": false,
        "Values": {
            "AzureWebJobsStorage": "UseDevelopmentStorage=true",
            "FUNCTIONS_WORKER_RUNTIME": "python",
            "TIMER_SCHEDULE": "*/30 * * * * *"
        }
    }
    

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

建立並啟用虛擬環境

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

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

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

sudo apt-get install python3-venv

在您的本機環境中執行

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

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

    npm install
    npm start  
    
  1. 當 Functions 主機程式在你的本地專案資料夾啟動時,它會將計時器觸發函式的資訊寫入終端輸出。 你應該會看到你的計時器觸發函式根據程式碼中定義的排程執行。

    預設的排程是 */30 * * * * *,每 30 秒運行一次。

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

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

檢閱程式碼 (選用)

你可以參考定義計時器觸發函數的程式碼:

using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Timer;
using Microsoft.Extensions.Logging;

namespace Company.Function
{
    public class timerFunction
    {
        private readonly ILogger _logger;

        public timerFunction(ILoggerFactory loggerFactory)
        {
            _logger = loggerFactory.CreateLogger<timerFunction>();
        }

        [Function("timerFunction")]
        public void Run(
            [TimerTrigger("%TIMER_SCHEDULE%", RunOnStartup = true)] TimerInfo myTimer,
            FunctionContext context
        )
        {
            _logger.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");

            if (myTimer.IsPastDue)
            {
                _logger.LogWarning("The timer is running late!");
            }
        }
    }
}

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

import { app, InvocationContext, Timer } from '@azure/functions';

export async function timerFunction(myTimer: Timer, context: InvocationContext): Promise<void> {
    context.log(`TypeScript Timer trigger function executed at: ${new Date().toISOString()}`);

    if (myTimer.isPastDue) {
        context.warn("The timer is running late!");
    }
}

app.timer('timerFunction', {
    schedule: '%TIMER_SCHEDULE%',
    runOnStartup: true,
    handler: timerFunction
});

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

import datetime
import logging

import azure.functions as func

# Create the function app instance
app = func.FunctionApp()

@app.timer_trigger(schedule="%TIMER_SCHEDULE%", 
                   arg_name="mytimer", 
                   run_on_startup=True,
                   use_monitor=False) 
def timer_function(mytimer: func.TimerRequest) -> None:
    utc_timestamp = datetime.datetime.now(datetime.timezone.utc).isoformat()
    
    logging.info(f'Python timer trigger function executed at: {utc_timestamp}')
    
    if mytimer.past_due:
        logging.warning('The timer is running late!')

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

在你本地驗證功能後,就可以發佈到 Azure。

部署至 Azure

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

小提示

此專案包含一組 Bicep 檔案,讓 azd 用來建立符合最佳做法之彈性使用量方案的安全部署。

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

    azd up
    

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

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

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

    參數 Description
    Azure 訂用帳戶 建立您資源所在位置的訂用帳戶。
    Azure 位置 要在其中建立包含新 Azure 資源之資源群組所在的 Azure 區域。 只會顯示目前支援彈性使用量方案的區域。

    azd up 命令會透過 Bicep 組態檔使用您對這些提示的回應,以完成這些部署工作:

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

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

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

確認部署

部署完成後,你的計時器觸發函式會根據 Azure 的排程自動開始執行。

  1. Azure 入口網站,進入你的新函數應用。

  2. 從左側選單選擇 日誌串流 ,即可即時監控你的函式執行。

  3. 你應該會看到日誌條目,顯示你的計時器觸發函數依照排程執行。

重新部署程式碼

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

備註

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

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

清理資源

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

azd down --no-prompt

備註

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

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