Übung: Erstellen einer Azure-Funktion zur Simulation von Telemetriedaten
Für das vorliegende Beispiel soll Ereignissourcing verwendet werden. Sie erstellen also eine Funktion, die Telemetriedaten simuliert und diese an einen Event Hub sendet. Später kann eine andere Funktion auf dieses Ereignis lauschen, es verarbeiten und in einer Datenbank speichern, die mit Azure Cosmos DB erstellt wurde.
Vorbereiten der Umgebung
Sie definieren einige Umgebungsvariablen, um alle folgenden Befehle so kurz und verständlich wie möglich zu halten. Definieren Sie die <value>
-Platzhalter. Fügen Sie anschließend die folgenden Befehle in Ihr Terminal oder Befehlszeilentool ein, und führen Sie sie aus:
RESOURCE_GROUP=<value>
EVENT_HUB_NAMESPACE=<value>
EVENT_HUB_NAME=<value>
EVENT_HUB_AUTHORIZATION_RULE=<value>
COSMOS_DB_ACCOUNT=<value>
STORAGE_ACCOUNT=<value>
FUNCTION_APP=<value>
LOCATION=<value>
Hinweis
Zum Festlegen der LOCATION-Variable können Sie den az functionapp list-consumption-locations
-Befehl ausführen und den nächstgelegene Standort verwenden.
Erstellen der erforderlichen Komponenten
Das Bereitstellen der Ressourcen in Azure nimmt einige Zeit in Anspruch. Aus diesem Grund beginnen Sie frühzeitig mit der Erstellung der Komponenten, um später lange Wartezeiten zu vermeiden.
Erstellen einer Ressourcengruppe
Es empfiehlt sich immer, alle Ressourcen eines Trainings, eines POC (Proof of Concept) oder eines Prototyps in einer Ressourcengruppe zu binden. So lassen sich alle verwendeten Dienste mit einem Befehl einfach bereinigen. Um eine Ressourcengruppe am angegebenen Speicherort zu erstellen, führen Sie den folgenden Befehl im Terminal aus:
az group create \
--name $RESOURCE_GROUP \
--location $LOCATION
Erstellen und Konfigurieren eines Event Hubs
Für den Event Hub muss der Namespace angegeben werden, an dem er lauschen soll. Außerdem müssen Sie die Autorisierungsregel auf Listen
und Send
festlegen.
az eventhubs namespace create \
--resource-group $RESOURCE_GROUP \
--name $EVENT_HUB_NAMESPACE
az eventhubs eventhub create \
--resource-group $RESOURCE_GROUP \
--name $EVENT_HUB_NAME \
--namespace-name $EVENT_HUB_NAMESPACE \
az eventhubs eventhub authorization-rule create \
--resource-group $RESOURCE_GROUP \
--name $EVENT_HUB_AUTHORIZATION_RULE \
--eventhub-name $EVENT_HUB_NAME \
--namespace-name $EVENT_HUB_NAMESPACE \
--rights Listen Send
Erstellen, Konfigurieren und Bereitstellen der Azure-Funktion
Für ein möglichst realistisches Beispiel erstellen Sie eine Azure-Funktion und simulieren Telemetriedaten. Sie könnten auch ein IoT-Gerät an Ihre Azure-Funktion binden, um echte Daten zu erfassen. Da mit dieser Funktion ein Ereignis erzeugt wird, fügen Sie ein p- oder -p-Flag hinzu.
az storage account create \
--resource-group $RESOURCE_GROUP \
--name $STORAGE_ACCOUNT"p" \
--sku Standard_LRS
az functionapp create \
--resource-group $RESOURCE_GROUP \
--name $FUNCTION_APP"-p"\
--storage-account $STORAGE_ACCOUNT"p" \
--consumption-plan-location $LOCATION \
--runtime java \
--functions-version 4
Hinweis
Verwenden Sie functions-version 4, da die Versionen 2 und 3 seit Dezember 2022 als veraltet gelten.
Wenn die Funktionsanwendung mit dem az functionapp create
-Befehl erstellt wird, wird auch eine Application Insights-Ressource mit dem gleichen Namen erstellt. Diese Ressource wird später zur Überwachung verwendet.
Um die Verbindungszeichenfolgen für das Speicherkonto und den Event Hub abzurufen, verwenden Sie die folgenden Befehle, um sie in Umgebungsvariablen zu speichern, und zeigen Sie sie dann mit dem Befehl echo
an.
AZURE_WEB_JOBS_STORAGE=$( \
az storage account show-connection-string \
--resource-group $RESOURCE_GROUP \
--name $STORAGE_ACCOUNT"p" \
--query connectionString \
--output tsv)
echo $AZURE_WEB_JOBS_STORAGE
EVENT_HUB_CONNECTION_STRING=$( \
az eventhubs eventhub authorization-rule keys list \
--resource-group $RESOURCE_GROUP \
--name $EVENT_HUB_AUTHORIZATION_RULE \
--eventhub-name $EVENT_HUB_NAME \
--namespace-name $EVENT_HUB_NAMESPACE \
--query primaryConnectionString \
--output tsv)
echo $EVENT_HUB_CONNECTION_STRING
Um die Verbindungszeichenfolgen in den Anwendungseinstellungen Ihres Azure Function-Kontos zu speichern, führen Sie den folgenden Befehl im Terminal aus:
az functionapp config appsettings set \
--resource-group $RESOURCE_GROUP \
--name $FUNCTION_APP"-p" \
--settings \
AzureWebJobsStorage=$AZURE_WEB_JOBS_STORAGE \
EventHubConnectionString=$EVENT_HUB_CONNECTION_STRING
Der Event Hub für Ihre Azure-Ressourcen und die Azure-Funktion werden jetzt erstellt und so konfiguriert, dass sie ordnungsgemäß zusammen ausgeführt werden.
Erstellen Sie als Nächstes ein lokales Functions-Projekt mit Maven.
mvn archetype:generate --batch-mode \
-DarchetypeGroupId=com.microsoft.azure \
-DarchetypeArtifactId=azure-functions-archetype \
-DappName=$FUNCTION_APP"-p" \
-DresourceGroup=$RESOURCE_GROUP \
-DappRegion=$LOCATION \
-DappServicePlanName=$LOCATION"plan" \
-DgroupId=com.learn \
-DartifactId=telemetry-functions-producer
Dieser Befehl generiert mehrere Dateien in einem telemetry-functions-producer
-Ordner:
- Die
pom.xml
-Builddatei mit vordefinierten Azure-Abhängigkeiten - Die
local.settings.json
-Datei, die die Anwendungseinstellungen für die lokale Bereitstellung und manuelle Tests enthält - Eine
host.json
-Datei, die das Azure Functions-Erweiterungspaket aktiviert - Eine
Function.java
-Datei, die die HTTP-Standardtriggerfunktion enthält - Einige Testdateien, die in diesem Learn-Modul nicht verwendet werden
Da die Testdateien in diesem Learn-Modul keine Anwendung finden, können Sie sie auch löschen.
cd telemetry-functions-producer
rm -r src/test
Für die lokale Ausführung müssen die Anwendungseinstellungen abgerufen und in der local.settings.json
-Datei gespeichert werden. Mit dem Befehl fetch-app-settings
können Sie diesen Vorgang automatisieren.
func azure functionapp fetch-app-settings $FUNCTION_APP"-p"
Öffnen Sie anschließend die Datei Function.java
, und ersetzen Sie den Inhalt durch den folgenden Code:
package com.learn;
import com.microsoft.azure.functions.annotation.EventHubOutput;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.TimerTrigger;
import com.microsoft.azure.functions.ExecutionContext;
public class Function {
@FunctionName("generateSensorData")
@EventHubOutput(
name = "event",
eventHubName = "", // blank because the value is included in the connection string
connection = "EventHubConnectionString")
public TelemetryItem generateSensorData(
@TimerTrigger(
name = "timerInfo",
schedule = "*/10 * * * * *") // every 10 seconds
String timerInfo,
final ExecutionContext context) {
context.getLogger().info("Java Timer trigger function executed at: " + java.time.LocalDateTime.now());
double temperature = Math.random() * 100;
double pressure = Math.random() * 50;
return new TelemetryItem(temperature, pressure);
}
}
Die Funktion generateSensorData
simuliert einen Sensor, der Temperatur- und Druckmesswerte an den Event Hub sendet. Ein Trigger mit Timer führt die Funktion alle 10 Sekunden aus, und eine Event Hub-Ausgabebindung sendet den Rückgabewert an den Event Hub.
Wenn der Event Hub die Nachricht empfängt, generiert er ein Ereignis.
Die von dieser Funktion verwendeten Daten werden mit einer Klasse namens „TelemetryItem“ gespeichert, die Sie implementieren müssen. Erstellen Sie eine neue Datei mit dem Namen „TelemetryItem.java“ im gleichen Speicherort wie „Function.java“, und fügen Sie den folgenden Code hinzu:
package com.learn;
public class TelemetryItem {
private String id;
private double temperature;
private double pressure;
private boolean isNormalPressure;
private status temperatureStatus;
static enum status {
COOL,
WARM,
HOT
}
public TelemetryItem(double temperature, double pressure) {
this.temperature = temperature;
this.pressure = pressure;
}
public String getId() {
return id;
}
public double getTemperature() {
return temperature;
}
public double getPressure() {
return pressure;
}
@Override
public String toString() {
return "TelemetryItem={id=" + id + ",temperature="
+ temperature + ",pressure=" + pressure + "}";
}
public boolean isNormalPressure() {
return isNormalPressure;
}
public void setNormalPressure(boolean isNormal) {
this.isNormalPressure = isNormal;
}
public status getTemperatureStatus() {
return temperatureStatus;
}
public void setTemperatureStatus(status temperatureStatus) {
this.temperatureStatus = temperatureStatus;
}
}
Lokales Ausführen
Bei lokaler Ausführung von Azure Functions werden die Ereignisse bereits weltweit gestreamt. Sie können sie auch im Azure-Portal anzeigen.
mvn clean package
mvn azure-functions:run
Nach einigen Build- und Startnachrichten wird eine Ausgabe wie im folgenden Beispiel für jede Ausführung der Funktion angezeigt:
[2021-01-19T16:25:40.005Z] Executing 'Functions.generateSensorData' (Reason='Timer fired at 2021-01-19T17:25:40.0044630+01:00', Id=fcf567a3-03ec-4159-9714-aa4449861b30)
[2021-01-19T16:25:40.011Z] Java Timer trigger function executed at: 2021-01-19T17:25:40.009405
[2021-01-19T16:25:40.013Z] Function "generateSensorData" (Id: fcf567a3-03ec-4159-9714-aa4449861b30) invoked by Java Worker
[2021-01-19T16:25:40.048Z] Executed 'Functions.generateSensorData' (Succeeded, Id=fcf567a3-03ec-4159-9714-aa4449861b30, Duration=43ms)
Hinweis
Bevor Sie die Funktion in der Azure-Cloud bereitstellen und ausführen, können Sie Ereignisse weltweit von Ihrem lokalen Computer aus senden. Dies ist sehr nützlich für das Entwickeln, Debuggen und lokale Testen.
In Azure bereitstellen
Sie können Funktionen in Azure bereitstellen, indem Sie den Befehl mvn azure-functions:deploy
ausführen und mit den nächsten Schritten fortfahren.
mvn azure-functions:deploy