Snabbstart: Köra schemalagda aktiviteter med Hjälp av Azure Functions

I den här artikeln använder du Azure Developer CLI (azd) för att skapa en Timer-utlösarfunktion för att köra en schemalagd aktivitet i Azure Functions. När du har verifierat koden lokalt distribuerar du den till en ny serverlös funktionsapp som du skapar som körs i en Flex Consumption-plan i Azure Functions.

Projektkällan använder azd för att skapa funktionsappen och relaterade resurser och för att distribuera din kod till Azure. Den här distributionen följer aktuella metodtips för säkra och skalbara Azure Functions-distributioner.

Som standard följer Flex Consumption-planen en faktureringsmodell för att betala för vad du använder , vilket innebär att du kan slutföra den här artikeln och bara medföra en liten kostnad på några USD cent eller mindre på ditt Azure-konto.

Viktigt!

Även om körning av schemalagda aktiviteter stödjer alla språk, har ett snabbstartsscenario för närvarande bara exempel för C#, Python och TypeScript. Slutför den här snabbstarten genom att välja ett av de språk som stöds överst i artikeln.

Förutsättningar

Initiera projektet

azd init Använd kommandot för att skapa ett lokalt Azure Functions-kodprojekt från en mall.

  1. Kör det här azd init kommandot i en tom mapp i den lokala terminalen eller kommandotolken:

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

    Det här kommandot hämtar projektfilerna från malllagringsplatsen och initierar projektet i den aktuella mappen. Flaggan -e anger ett namn för den aktuella miljön. I azdbehåller miljön en unik distributionskontext för din app och du kan definiera mer än en. Miljönamnet används också i namnet på den resursgrupp som du skapar i Azure.

  2. Kör det här kommandot för att navigera till appmappen:

    cd src
    
  3. Skapa en fil med namnet local.settings.json i src mappen som innehåller dessa JSON-data:

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

    Den här filen krävs när den körs lokalt.

  1. Kör det här azd init kommandot i en tom mapp i den lokala terminalen eller kommandotolken:

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

    Det här kommandot hämtar projektfilerna från malllagringsplatsen och initierar projektet i den aktuella mappen. Flaggan -e anger ett namn för den aktuella miljön. I azdbehåller miljön en unik distributionskontext för din app och du kan definiera mer än en. Miljönamnet används också i namnet på den resursgrupp som du skapar i Azure.

  2. Skapa en fil med namnet local.settings.json i src mappen som innehåller dessa JSON-data:

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

    Den här filen krävs när den körs lokalt.

  1. Kör det här azd init kommandot i en tom mapp i den lokala terminalen eller kommandotolken:

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

    Det här kommandot hämtar projektfilerna från malllagringsplatsen och initierar projektet i den aktuella mappen. Flaggan -e anger ett namn för den aktuella miljön. I azdbehåller miljön en unik distributionskontext för din app och du kan definiera mer än en. Miljönamnet används också i namnet på den resursgrupp som du skapar i Azure.

  2. Skapa en fil med namnet local.settings.json i src mappen som innehåller dessa JSON-data:

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

    Den här filen krävs när den körs lokalt.

Skapa och aktivera en virtuell miljö

I rotmappen kör du dessa kommandon för att skapa och aktivera en virtuell miljö med namnet .venv:

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

Om Python inte installerar venv-paketet på Linux-distributionen kör du följande kommando:

sudo apt-get install python3-venv

Kör i din lokala miljö

  1. Kör det här kommandot från appmappen i en terminal eller kommandotolk:

    func start
    
  1. Kör det här kommandot från appmappen i en terminal eller kommandotolk:

    npm install
    npm start  
    
  1. När Functions-värden startar i den lokala projektmappen skriver den information om Timerfunktionen som utlöses till terminalens utdata. Du bör se att din timerutlösta funktion exekverar enligt det schema som definierats i din kod.

    Standardschemat är */30 * * * * *, som körs var 30:e sekund.

  2. När du är klar trycker du på Ctrl+C i terminalfönstret för att stoppa func.exe värdprocessen.

  1. Kör deactivate för att stänga av den virtuella miljön.

Granska koden (valfritt)

Du kan granska koden som definierar timerutlösarfunktionen:

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

Du kan granska hela mallprojektet här.

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

Du kan granska hela mallprojektet här.

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

Du kan granska hela mallprojektet här.

När du har verifierat funktionen lokalt är det dags att publicera den till Azure.

Distribuera till Azure

Det här projektet är konfigurerat för att använda azd up kommandot för att distribuera koden till en ny funktionsapp i en Flex Consumption-plan i Azure.

Tips/Råd

Det här projektet innehåller en uppsättning Bicep-filer som azd använder för att skapa en säker distribution till en Flex-förbrukningsplan som följer bästa praxis.

  1. Kör det här kommandot för att azd skapa nödvändiga Azure-resurser i Azure och distribuera kodprojektet till den nya funktionsappen:

    azd up
    

    Rotmappen innehåller den azure.yaml definitionsfil som krävs av azd.

    Om du inte redan är inloggad uppmanas du att autentisera med ditt Azure-konto.

  2. Ange följande nödvändiga distributionsparametrar när du uppmanas att göra det:

    Parameter Description
    Azure-prenumeration Prenumeration där dina resurser skapas.
    Azure-lokalisering Azure-region där du kan skapa resursgruppen som innehåller de nya Azure-resurserna. Endast regioner som för närvarande stöder Flex Consumption-planen visas.

    Kommandot azd up använder ditt svar på dessa frågor med Bicep-konfigurationsfilerna för att slutföra dessa distributionsuppgifter:

    • Skapa och konfigurera de här nödvändiga Azure-resurserna (motsvarande azd provision):

      • Flex Consumption-plan och funktionsapp
      • Azure Storage (krävs) och Application Insights (rekommenderas)
      • Åtkomstprinciper och roller för ditt konto
      • Tjänst-till-tjänst-anslutningar med hanterade identiteter (i stället för lagrade anslutningssträng)
      • Virtuellt nätverk för säker körning av både funktionsappen och andra Azure-resurser
    • Paketera och distribuera koden till distributionscontainern (motsvarande azd deploy). Appen startas sedan och körs i det distribuerade paketet.

    När kommandot har slutförts visas länkar till de resurser som du har skapat.

Verifiera driftsättningen

När distributionen är klar börjar timer-utlösarfunktionen automatiskt köras i Azure baserat på dess schema.

  1. I Azure-portalen går du till din nya funktionsapp.

  2. Välj Loggström i den vänstra menyn för att övervaka funktionskörningarna i realtid.

  3. Du bör se loggposter som visar att timerutlösarfunktionen körs enligt schemat.

Distribuera om koden

azd up Kör kommandot så många gånger du behöver både etablera dina Azure-resurser och distribuera koduppdateringar till funktionsappen.

Anmärkning

Distribuerade kodfiler skrivs alltid över av det senaste distributionspaketet.

Dina första svar på azd frågor och eventuella miljövariabler som genereras av azd lagras lokalt i din namngivna miljö. azd env get-values Använd kommandot för att granska alla variabler i din miljö som användes när du skapade Azure-resurser.

Rensa resurser

När du är klar med funktionsappen och relaterade resurser använder du det här kommandot för att ta bort funktionsappen och dess relaterade resurser från Azure och undvika ytterligare kostnader:

azd down --no-prompt

Anmärkning

Alternativet --no-prompt instruerar azd dig att ta bort resursgruppen utan någon bekräftelse från dig.

Det här kommandot påverkar inte ditt lokala kodprojekt.