Início Rápido: Executar tarefas agendadas usando o Funções do Azure

Neste artigo, utiliza a CLI do Azure Developer (azd) para criar uma função de gatilho de temporizador para executar uma tarefa programada no Funções do Azure. Depois de verificar o código localmente, desdobra-o numa nova aplicação de função sem servidor que cria a correr num plano de Consumo Flex no Funções do Azure.

O código-fonte do projeto utiliza azd para criar a aplicação de funções e os recursos relacionados e para desplegar o seu código no Azure. Essa implantação segue as práticas recomendadas atuais para implantações seguras e escaláveis do Funções do Azure.

Por defeito, o plano Flex Consumption segue um modelo de faturação de pagamento pelo que usar , o que significa que pode completar este artigo e apenas incorrer num pequeno custo de alguns cêntimos USD ou menos na sua conta Azure.

Este artigo suporta a versão 4 do modelo de programação Node.js para o Funções do Azure.

Este artigo suporta a versão 2 do modelo de programação Python para o Funções do Azure.

Pré-requisitos

  • Kit de desenvolvimento Java 17
    • Se usar outra versão suportada de Java, deve atualizar a configuração do projeto.
    • Defina a variável de ambiente JAVA_HOME para o local de instalação da versão correta do Java Development Kit (JDK).
  • Apache Maven 3.8.x

Inicializar o projeto

Use o azd init comando para criar um projeto de código local do Funções do Azure a partir de um modelo.

  1. No terminal local ou prompt de comando, execute este azd init comando em uma pasta vazia:

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

    Este comando extrai os arquivos de projeto do repositório de modelos e inicializa o projeto na pasta atual. O -e sinalizador define um nome para o ambiente atual. No azd, o ambiente mantém um contexto de implantação exclusivo para seu aplicativo e você pode definir mais de um. O nome do ambiente também é usado no nome do grupo de recursos que crias no Azure.

  2. Execute este comando para navegar até à pasta da app:

    cd src
    
  3. Crie um arquivo chamado local.settings.json na src pasta que contém esses dados JSON:

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

    Esse arquivo é necessário quando executado localmente.

  1. No terminal local ou prompt de comando, execute este azd init comando em uma pasta vazia:

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

    Este comando extrai os arquivos de projeto do repositório de modelos e inicializa o projeto na pasta atual. O -e sinalizador define um nome para o ambiente atual. No azd, o ambiente mantém um contexto de implantação exclusivo para seu aplicativo e você pode definir mais de um. O nome do ambiente também é usado no nome do grupo de recursos que crias no Azure.

  2. Crie um arquivo chamado local.settings.json na src pasta que contém esses dados JSON:

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

    Esse arquivo é necessário quando executado localmente.

  1. No terminal local ou prompt de comando, execute este azd init comando em uma pasta vazia:

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

    Este comando extrai os arquivos de projeto do repositório de modelos e inicializa o projeto na pasta atual. O -e sinalizador define um nome para o ambiente atual. No azd, o ambiente mantém um contexto de implantação exclusivo para seu aplicativo e você pode definir mais de um. O nome do ambiente também é usado no nome do grupo de recursos que crias no Azure.

  2. Crie um arquivo chamado local.settings.json na src pasta que contém esses dados JSON:

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

    Esse arquivo é necessário quando executado localmente.

Criar e ativar um ambiente virtual

Na pasta raiz, execute estes comandos para criar e ativar um ambiente virtual chamado .venv:

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

Se o Python não instalar o pacote venv na sua distribuição Linux, execute o seguinte comando:

sudo apt-get install python3-venv
  1. No terminal local ou prompt de comando, execute este azd init comando em uma pasta vazia:

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

    Este comando extrai os arquivos de projeto do repositório de modelos e inicializa o projeto na pasta atual. O -e sinalizador define um nome para o ambiente atual. No azd, o ambiente mantém um contexto de implantação exclusivo para seu aplicativo e você pode definir mais de um. O nome do ambiente também é usado no nome do grupo de recursos que crias no Azure.

  2. Execute este comando para navegar até à pasta da app:

    cd src
    
  3. Crie um arquivo chamado local.settings.json na src pasta que contém esses dados JSON:

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

    Esse arquivo é necessário quando executado localmente.

  1. No terminal local ou prompt de comando, execute este azd init comando em uma pasta vazia:

    azd init --template functions-quickstart-javascript-azd-timer -e scheduled-js
    

    Este comando extrai os arquivos de projeto do repositório de modelos e inicializa o projeto na pasta atual. O -e sinalizador define um nome para o ambiente atual. No azd, o ambiente mantém um contexto de implantação exclusivo para seu aplicativo e você pode definir mais de um. O nome do ambiente também é usado no nome do grupo de recursos que crias no Azure.

  2. Crie um arquivo chamado local.settings.json na src pasta que contém esses dados JSON:

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

    Esse arquivo é necessário quando executado localmente.

  1. No terminal local ou prompt de comando, execute este azd init comando em uma pasta vazia:

    azd init --template functions-quickstart-powershell-azd-timer -e scheduled-ps
    

    Este comando extrai os arquivos de projeto do repositório de modelos e inicializa o projeto na pasta atual. O -e sinalizador define um nome para o ambiente atual. No azd, o ambiente mantém um contexto de implantação exclusivo para seu aplicativo e você pode definir mais de um. O nome do ambiente também é usado no nome do grupo de recursos que crias no Azure.

  2. Execute este comando para navegar até à pasta da app:

    cd src
    
  3. Crie um arquivo chamado local.settings.json na src pasta que contém esses dados JSON:

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

    Esse arquivo é necessário quando executado localmente.

Executar no seu ambiente local

  1. Numa janela de terminal separada, inicie o emulador de armazenamento Azurite:

    azurite
    

    O processo local Functions host utiliza o emulador Azurite para a ligação interna de armazenamento (AzureWebJobsStorage) exigida pelo runtime.

  1. Execute este comando a partir da pasta da sua aplicação num terminal ou linha de comandos:

    func start
    
  1. Execute este comando a partir da pasta da sua aplicação num terminal ou linha de comandos:

    mvn clean package
    mvn azure-functions:run
    
  1. Execute este comando a partir da pasta da sua aplicação num terminal ou linha de comandos:

    npm install
    func start  
    
  1. Execute este comando a partir da pasta da sua aplicação num terminal ou linha de comandos:

    npm install
    npm start  
    
  1. Quando o host das Funções inicia na pasta local do projeto, ele registra informações sobre a função acionada pelo Temporizador no output do terminal. Deverias ver a tua função ativada pelo temporizador a ser executada com base no cronograma definido no teu código.

    O horário padrão é */30 * * * * *, que corre a cada 30 segundos.

  2. Quando terminar, pressione Ctrl+C na janela do terminal para interromper o processo do func.exe host.

  1. Execute deactivate para desligar o ambiente virtual.

Rever o código (opcional)

Pode rever o código que define a função de disparo do temporizador:

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!");
            }
        }
    }
}

Você pode revisar o projeto de modelo completo aqui.

package com.function;

import com.microsoft.azure.functions.ExecutionContext;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.TimerTrigger;
import java.time.LocalDateTime;

/**
 * Timer-triggered Azure Function that demonstrates scheduled execution.
 */
public class TimerFunction {
    @FunctionName("timerFunction")
    public void run(
            @TimerTrigger(name = "timerInfo", schedule = "%TIMER_SCHEDULE%") String timerInfo,
            final ExecutionContext context) {

        context.getLogger().info("Java Timer trigger function executed at: " + LocalDateTime.now());

        if (timerInfo != null && timerInfo.contains("\"isPastDue\":true")) {
            context.getLogger().warning("The timer is running late!");
        }
    }
}

Você pode revisar o projeto de modelo completo aqui.

const { app } = require('@azure/functions');
async function timerFunction(myTimer, context) {
    context.log(`JavaScript 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,
});

Você pode revisar o projeto de modelo completo aqui.

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
});

Você pode revisar o projeto de modelo completo aqui.

# Input bindings are passed in via param block.
param($myTimer)

# Get the current universal time in the default string format.
$currentUTCtime = (Get-Date).ToUniversalTime()

# The 'IsPastDue' property is 'true' when the current function invocation is later than scheduled.
if ($myTimer.IsPastDue) {
    Write-Host "PowerShell timer is running late!"
}

# Write an information log with the current time.
Write-Host "PowerShell timer trigger function executed at: $currentUTCtime"

O disparador do temporizador é definido no respetivo function.json.

Você pode revisar o projeto de modelo completo aqui.

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!')

Você pode revisar o projeto de modelo completo aqui.

Sugestão

A runOnStartup opção é útil durante o desenvolvimento e testes porque a função é executada imediatamente assim que o host começa. Em produção, deve definir isto para false, de forma a evitar execuções inesperadas durante implementações ou reinícios.

Depois de verificares a tua função localmente, está na altura de a publicares no Azure.

Publicar no Azure

Este projeto utiliza ficheiros Bicep e o comando azd up para criar uma implementação segura numa nova aplicação funcional, num plano Flex Consumption que siga as melhores práticas.

  1. Execute este comando para criar azd os recursos necessários do Azure no Azure e implantar seu projeto de código no novo aplicativo de função:

    azd up
    

    A pasta raiz contém o arquivo de azure.yaml definição exigido pelo azd.

    Se já ainda não tiver iniciado sessão, ser-lhe-á solicitado que se autentique com a sua conta Azure.

  2. Quando solicitado, forneça estes parâmetros de implantação necessários:

    Parâmetro Description
    Subscrição do Azure Subscrição na qual os seus recursos são criados.
    localização do Azure Região do Azure na qual criar o grupo de recursos que contém os novos recursos do Azure. Apenas as regiões que atualmente suportam o plano Flex Consumption são mostradas.

    O comando azd up utiliza a tua resposta a estas solicitações nos arquivos de configuração do Bicep para executar estas tarefas de implementação:

    • Crie e configure estes recursos necessários do Azure (equivalentes a azd provision):

      • Plano Flex Consumption e aplicação funcional
      • Armazenamento do Azure (obrigatório) e Application Insights (recomendado)
      • Políticas e funções de acesso para a sua conta
      • Conexões de serviço a serviço usando identidades gerenciadas (em vez de cadeias de conexão armazenadas)
      • Rede virtual para executar com segurança o aplicativo de função e os outros recursos do Azure
    • Empacote e implante seu código no contêiner de implantação (equivalente a azd deploy). O aplicativo é então iniciado e executado no pacote implantado.

    Depois que o comando for concluído com êxito, você verá links para os recursos criados.

Verificar a implementação

Após a implementação concluída, a função de disparo do seu temporizador começa automaticamente a correr no Azure com base no seu calendário.

  1. No portal Azure, vai à tua nova aplicação de funções.

  2. Selecione Log stream no menu esquerdo para monitorizar as execuções das suas funções em tempo real.

  3. Deverias ver entradas de registo que mostram a função de disparo do teu temporizador a ser executada de acordo com o seu calendário.

Reimplantar o seu código

Executa o azd up comando tantas vezes quanto precisares tanto para provisionar os teus recursos Azure como para implementar atualizações de código na tua aplicação de funções.

Observação

Os arquivos de código implantados são sempre substituídos pelo pacote de implantação mais recente.

Suas respostas iniciais a azd prompts e quaisquer variáveis de ambiente geradas por azd são armazenadas localmente em seu ambiente nomeado. Use o azd env get-values comando para revisar todas as variáveis em seu ambiente que foram usadas ao criar recursos do Azure.

Limpeza de recursos

Quando terminar de trabalhar com a sua function app e recursos relacionados, use este comando para eliminar a function app e os seus recursos relacionados do Azure e evitar custos adicionais:

azd down --no-prompt

Observação

A --no-prompt opção instrui azd a excluir seu grupo de recursos sem uma confirmação sua.

Este comando não afeta seu projeto de código local.