Code muss auf Anfrage oder nach Zeitplan laufen? HTTP- und Timer-Funktionen erstellen

Veröffentlicht am:

CloudTrips benötigt einen kleinen API-Endpunkt und einen wiederkehrenden Hintergrundjob. Azure Functions führt Code aus, wenn ein Trigger ausgelöst wird, und skaliert die zugrunde liegende Rechenleistung, ohne dass ein dauerhaft verwalteter Server erforderlich ist.

Function App: Gemeinsamer Host sowie Konfigurations-, Deployment- und Skalierungsrahmen
HTTP Function: Läuft beim Eingang einer HTTP-Anfrage
Timer Function: Läuft nach einem CRON-Zeitplan

Beide Funktionen können eine Function App teilen, weil sie zur selben kleinen Anwendung gehören und denselben Lebenszyklus verwenden. Der spätere Durable- Functions-Trip nutzt eine separate App, weil er zustandsbehaftete Workflow-Orchestrierung einführt.

Erstelle die Function App

Suche nach Function App, wähle Create, dann Flex Consumption und Select. Trage ein:

Subscription: CloudTrips TEST
Resource group: rg-cloudtrips-functions-test-weu
Function App name: func-cloudtrips-events-dmytro-test-weu
Region: West Europe
Runtime stack: Node.js
Version: 22 LTS
Instance size: 2048 MB

Der Function-App-Name muss global eindeutig sein. Verwende die neueste im Portal angebotene Node.js-LTS-Version, falls 22 LTS nicht mehr angezeigt wird.

Erstelle unter Storage das standardmäßige Host-Storage-Konto. Eine Function App verwendet Storage für Host-Koordination, Triggerzustand und Deployment-Pakete. Es ist auch dann erforderlich, wenn der Funktionscode keine Geschäftsdaten speichert.

Lasse unter Monitoring Enable Application Insights aktiviert. Wähle unter Authentication Managed identity for all resources. Übernimm die übrigen Standardwerte und wähle Review + create > Create.

Flex Consumption ist der empfohlene serverlose Plan, skaliert im Leerlauf auf null und berechnet hauptsächlich Ausführungen und verbrauchte Ressourcen. Application Insights und Storage können geringe Zusatzkosten verursachen.

Create Function App mit Node.js im Flex-Consumption-Plan

Erstelle das lokale Projekt

Erstelle auf deinem Mac diese Struktur:

cloudtrips-functions/
├── host.json
├── package.json
└── src/
    └── functions/
        ├── http.js
        └── timer.js
mkdir -p cloudtrips-functions/src/functions
cd cloudtrips-functions

Erstelle host.json:

{
  "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": false
      }
    }
  }
}

Deaktiviertes Sampling erleichtert es, die wenigen Timer-Aufrufe dieses Labs zu finden. In einer stark ausgelasteten Produktions-App begrenzt Sampling normalerweise Telemetriemenge und Kosten.

Erstelle package.json:

{
  "name": "cloudtrips-functions",
  "version": "1.0.0",
  "main": "src/functions/*.js",
  "scripts": {
    "start": "func start"
  },
  "dependencies": {
    "@azure/functions": "^4.7.2"
  }
}

Das main-Muster teilt dem Node.js-v4-Programmiermodell mit, wo es die Funktionsregistrierungen laden soll.

Füge die HTTP-Funktion hinzu

Erstelle src/functions/http.js:

const { app } = require('@azure/functions');

app.http('cloudTripsHttp', {
  methods: ['GET'],
  authLevel: 'anonymous',
  route: 'cloudtrips',
  handler: async (request, context) => {
    const name = request.query.get('name') || 'traveler';
    context.log(`HTTP request received for ${name}`);

    return {
      headers: { 'Content-Type': 'application/json' },
      jsonBody: {
        message: `Hello, ${name}!`,
        trigger: 'HTTP'
      }
    };
  }
});

anonymous hält den Lab-Endpunkt einfach aufrufbar. Produktions-APIs verwenden normalerweise Function Keys, App Service Authentication, API Management oder eine andere Authentifizierungsschicht.

Füge die Timer-Funktion hinzu

Erstelle src/functions/timer.js:

const { app } = require('@azure/functions');

app.timer('cloudTripsTimer', {
  schedule: '0 */5 * * * *',
  handler: async (timer, context) => {
    context.log(`CloudTrips scheduled job ran at ${new Date().toISOString()}`);

    if (timer.isPastDue) {
      context.warn('The timer invocation was later than scheduled.');
    }
  }
});

Timer-Ausdrücke von Azure Functions besitzen sechs Felder:

Sekunde Minute Stunde Tag Monat Wochentag
0       */5    *      *   *     *          → alle fünf Minuten

Der Zeitplan wird standardmäßig in UTC ausgewertet. Der Functions-Host koordiniert den Timer über sein Storage-Konto, damit skalierte Instanzen nicht alle denselben geplanten Durchlauf ausführen.

Stelle beide Funktionen bereit

Erstelle aus cloudtrips-functions ein Deployment-Paket mit dem Projektinhalt, nicht mit dem übergeordneten Ordner:

zip -r cloudtrips-functions.zip host.json package.json src

Stelle es bereit und lasse Azure die Node-Abhängigkeit remote installieren:

az functionapp deployment source config-zip \
  --resource-group rg-cloudtrips-functions-test-weu \
  --name func-cloudtrips-events-dmytro-test-weu \
  --src cloudtrips-functions.zip \
  --build-remote true

Flex Consumption verwendet hinter diesem Befehl One Deploy: Azure speichert und bindet das Deployment-Paket ein, statt Dateien direkt im Portal zu bearbeiten. Warte auf das Befehlsende und öffne anschließend Functions in der Function App. Sowohl cloudTripsHttp als auch cloudTripsTimer sollten erscheinen.

Functions-Seite mit cloudTripsHttp und cloudTripsTimer

Teste den HTTP-Trigger

Öffne cloudTripsHttp, wähle Get Function URL und kopiere die URL. Rufe sie auf deinem Mac mit dem Query-Parameter auf:

curl --fail --show-error \
  '<FUNCTION_URL>?name=Dmytro'

Das ? beginnt den Query-String der URL und name=Dmytro liefert den von der Funktion gelesenen Parameter name. Da dieser Trip authLevel: 'anonymous' verwendet, enthält die kopierte Function URL normalerweise noch keinen ?code=...-Query-String. Erwartetes JSON:

{"message":"Hello, Dmytro!","trigger":"HTTP"}

Die Anfrage ist das Ereignis, das diese Funktion auslöst.

Terminal mit erfolgreicher JSON-Antwort von cloudTripsHttp

Prüfe den Timer-Trigger

Warte mindestens fünf Minuten. Öffne cloudTripsTimer, wähle Monitor und öffne Invocations. Die Übertragung nach Application Insights kann mehrere Minuten dauern. Aktualisiere die Ansicht, bis eine erfolgreiche Ausführung erscheint. Öffne sie und bestätige, dass ihre Logs Folgendes enthalten:

CloudTrips scheduled job ran at

Der Timer besitzt keine öffentliche URL. Der Functions-Host ruft ihn anhand des CRON-Zeitplans auf und zeichnet die Ausführung in Application Insights auf.

Monitor-Seite der Timer-Funktion mit erfolgreicher geplanter Ausführung

Bereinigen

Lösche die eigenständige Ressourcengruppe und damit Function App, Storage, Monitoring-Ressourcen und fortlaufende Kosten:

az group delete \
  --name rg-cloudtrips-functions-test-weu \
  --yes

Bestätige die Löschung:

az group exists --name rg-cloudtrips-functions-test-weu

Erwartetes Ergebnis: false.