Code muss auf Anfrage oder nach Zeitplan laufen? HTTP- und Timer-Funktionen erstellen
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.

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.

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.

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.

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.