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.

Den här artikeln stöder version 4 av Node.js programmeringsmodellen för Azure Functions.

Den här artikeln stöder version 2 av Python-programmeringsmodellen för Azure Functions.

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
  1. Kör det här azd init kommandot i en tom mapp i den lokala terminalen eller kommandotolken:

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

    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": "java",
            "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-javascript-azd-timer -e scheduled-js
    

    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-powershell-azd-timer -e scheduled-ps
    

    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": "powershell",
            "TIMER_SCHEDULE": "*/30 * * * * *"
        }
    }
    

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

Kör i din lokala miljö

  1. Starta Azurite Storage-emulatorn i ett separat terminalfönster:

    azurite
    

    Den lokala Functions-värdprocessen använder Azurite-emulatorn för den interna lagringsanslutningen (AzureWebJobsStorage) som krävs av körmiljön.

  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:

    mvn clean package
    mvn azure-functions:run
    
  1. Kör det här kommandot från appmappen i en terminal eller kommandotolk:

    npm install
    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.

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

Du kan granska hela mallprojektet här.

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

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.

# 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"

Timerutlösaren definieras i motsvarande function.json.

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.

Tips/Råd

Alternativet runOnStartup är användbart under utveckling och testning eftersom funktionen körs omedelbart när värden startar. I produktionsmiljö bör du ställa in detta på false för att undvika oväntade programkörningar under distributioner eller omstarter.

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

Distribuera till Azure

Det här projektet använder Bicep filer och kommandot azd up för att skapa en säker distribution till en ny funktionsapp i en Flex Consumption-plan 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.

Återdistribuera din kod

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.