本文使用 Azure 开发人员 CLI (azd) 创建计时器触发器函数,以在 Azure Functions 中运行计划任务。 在本地验证代码后,将其部署到您创建的在 Azure Functions 的弹性消耗计划中运行的新无服务器函数应用。
项目源用于 azd 创建函数应用和相关资源,并将代码部署到 Azure。 此部署遵循安全且可缩放的 Azure Functions 部署的当前最佳做法。
默认情况下,弹性消耗计划遵循 即用即付 计费模型,这意味着你可以完成此操作,并且只需在 Azure 帐户中花费几美分甚至更少。
重要
本文目前仅在 C#、Python 和 TypeScript 中受支持。 若要完成快速入门,请在文章顶部选择其中一种受支持的语言。
先决条件
- Node.js 22 或更高版本
Python 3.11 或更高版本
在本地终端或命令提示符下,在空文件夹中运行此
azd init命令:azd init --template functions-quickstart-dotnet-azd-timer -e scheduled-dotnet此命令从模板存储库中拉取项目文件,并在当前文件夹中初始化项目。
-e标志设置当前环境的名称。 在azd,环境维护您应用程序的独特部署上下文,并且您可以定义多个。 环境名称还用于在 Azure 中创建的资源组的名称。运行以下命令以导航到应用文件夹:
cd src在包含此 JSON 数据的 文件夹中创建名为 local.settings.json
src的文件:{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", "TIMER_SCHEDULE": "*/30 * * * * *" } }在本地运行时,需要此文件。
在本地终端或命令提示符下,在空文件夹中运行此
azd init命令:azd init --template functions-quickstart-typescript-azd-timer -e scheduled-ts此命令从模板存储库中拉取项目文件,并在当前文件夹中初始化项目。
-e标志设置当前环境的名称。 在azd,环境维护您应用程序的独特部署上下文,并且您可以定义多个。 环境名称还用于在 Azure 中创建的资源组的名称。在包含此 JSON 数据的 文件夹中创建名为 local.settings.json
src的文件:{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "node", "TIMER_SCHEDULE": "*/30 * * * * *" } }在本地运行时,需要此文件。
在本地终端或命令提示符下,在空文件夹中运行此
azd init命令:azd init --template functions-quickstart-python-azd-timer -e scheduled-py此命令从模板存储库中拉取项目文件,并在当前文件夹中初始化项目。
-e标志设置当前环境的名称。 在azd,环境维护您应用程序的独特部署上下文,并且您可以定义多个。 环境名称还用于在 Azure 中创建的资源组的名称。在包含此 JSON 数据的 文件夹中创建名为 local.settings.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
在本地环境中运行
在终端或命令提示符下从应用文件夹运行以下命令:
func start
在终端或命令提示符下从应用文件夹运行以下命令:
npm install npm start
当 Functions 主机在本地项目文件夹中启动时,它会将有关计时器触发的函数的信息写入终端输出。 应会看到计时器触发的函数根据代码中定义的计划执行。
默认计划是
*/30 * * * * *每 30 秒运行一次。完成后,在终端窗口中按 Ctrl+C 停止
func.exe主机进程。
- 运行
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 中 Flex Consumption 计划中的新函数应用。
小窍门
该项目包括一组 Bicep 文件,azd 使用这些文件可以按照最佳做法为 Flex 消耗计划创建安全部署。
运行以下命令,让
azd在 Azure 中创建所需的 Azure 资源,并将代码项目部署到新的函数应用:azd up根文件夹包含
azure.yaml所需的azd定义文件。如果尚未登录,系统会要求使用 Azure 帐户进行身份验证。
出现提示时,请提供以下所需的部署参数:
参数 Description Azure 订阅 要在其中创建资源的订阅。 Azure 位置 要在其中创建包含新 Azure 资源的资源组的 Azure 区域。 仅显示当前支持 Flex 消耗计划的区域。 azd up命令使用你对这些提示的回复和 Bicep 配置文件来完成这些部署任务:创建和配置这些所需的 Azure 资源(等效于
azd provision):- Flex 消耗计划和函数应用
- Azure 存储(必需)和 Application Insights(推荐)
- 帐户的访问策略和角色
- 使用托管标识(而不是存储的连接字符串)的服务到服务连接
- 安全运行函数应用和其他 Azure 资源的虚拟网络
打包代码并将其部署到部署容器(等效于
azd deploy)。 然后,应用将启动并在已部署的包中运行。
命令成功完成后,你会看到指向所创建资源的链接。
验证部署
部署完成后,计时器触发器函数会根据其计划自动在 Azure 中运行。
在 Azure 门户中,转到新的函数应用。
从左侧菜单中选择 日志流 ,实时监视函数执行。
应会看到日志条目,这些日志条目显示计时器触发器函数根据其计划执行。
重新部署代码
azd up根据需要多次运行命令,以便预配 Azure 资源并将代码更新部署到函数应用。
注释
已部署的代码文件始终被最新的部署包覆盖。
对 azd 提示的初始响应和 azd 生成的任何环境变量都本地存储在你的命名环境中。 使用 azd env get-values 命令查看创建 Azure 资源时使用的环境中的所有变量。
清理资源
使用完函数应用和相关资源后,请使用此命令从 Azure 中删除函数应用及其相关资源,并避免产生任何进一步的成本:
azd down --no-prompt
注释
--no-prompt 选项指示 azd 在未经你确认的情况下删除资源组。
此命令不会影响本地代码项目。