Schnellstart: Erstellen einer serverlosen App mit Azure Functions und Azure SignalR Service in Python
Erste Schritte mit Azure SignalR Service unter Verwendung von Azure Functions und Python zum Erstellen einer serverlosen Anwendung, die Nachrichten an Clients überträgt. Sie führen die Funktion in der lokalen Umgebung aus und stellen dabei eine Verbindung mit einer Azure SignalR Service-Instanz in der Cloud her. Im Rahmen dieser Schnellstartanleitung fallen in Ihrem Azure-Konto ggf. geringfügige Kosten im Centbereich an.
Hinweis
Sie finden den in diesem Artikel erwähnten Code auf GitHub.
Wichtig
Unformatierte Verbindungszeichenfolgen werden in diesem Artikel nur zu Demonstrationszwecken angezeigt.
Eine Verbindungszeichenfolge enthält die Autorisierungsinformationen, die Ihre Anwendung für den Zugriff auf den Azure SignalR-Dienst benötigt. Der Zugriffsschlüssel in der Verbindungszeichenfolge ähnelt einem Stammkennwort für Ihren Dienst. Schützen Sie Ihre Zugriffsschlüssel in Produktionsumgebungen immer sorgfältig. Verwenden Sie Azure Key Vault, um Ihre Schlüssel sicher zu verwalten und zu rotieren, Ihre Verbindungszeichenfolge mithilfe von Microsoft Entra ID zu schützen und den Zugriff mit Microsoft Entra ID zu autorisieren.
Geben Sie Zugriffsschlüssel nicht an andere Benutzer weiter, vermeiden Sie das Hartcodieren, und speichern Sie die Schlüssel nicht als Klartext, auf den andere Benutzer Zugriff haben. Rotieren Sie die Schlüssel, wenn Sie glauben, dass sie möglicherweise gefährdet sind.
Voraussetzungen
Dieser Schnellstart kann unter MacOS, Windows oder Linux ausgeführt werden. Sie benötigen Folgendes:
Voraussetzung | BESCHREIBUNG |
---|---|
Ein Azure-Abonnement | Falls Sie über kein Azure-Abonnement verfügen, erstellen Sie ein kostenloses Azure-Konto. |
Ein Code-Editor | Sie müssen einen Code-Editor wie Visual Studio Code installieren. |
Azure Functions Core Tools | Erfordert Version 2.7.1505 oder höher, um die Python Azure Functions-Apps lokal auszuführen. |
Python 3.7 und höher | Azure Functions erfordert mindestens Python 3.7. Siehe Unterstützte Python-Versionen. |
Azurite | Die SignalR-Bindung benötigt Azure Storage. Sie können einen lokalen Speicheremulator verwenden, wenn eine Funktion lokal ausgeführt wird. |
Azure-Befehlszeilenschnittstelle | Optional können Sie mit der Azure CLI eine Azure SignalR Service-Instanz erstellen. |
Erstellen einer Instanz des Azure SignalR-Diensts
In diesem Abschnitt erstellen Sie eine einfache Azure SignalR-Instanz für Ihre App. In den folgenden Schritten wird das Azure-Portal für die Erstellung einer neuen Instanz verwendet. Sie können jedoch auch die Azure CLI verwenden. Weitere Informationen finden Sie unter dem Befehl az signalr create in der Azure SignalR Service-CLI-Referenz.
- Melden Sie sich beim Azure-Portal an.
- Wählen Sie links oben auf der Seite die Option + Ressource erstellen aus.
- Geben Sie auf der Seite Ressource erstellen im Textfeld Dienste und Marketplace durchsuchen den Text signalr ein und wählen Sie dann SignalR Service aus der Liste aus.
- Klicken Sie auf der Seite SignalR Service auf Erstellen.
- Geben Sie auf der Registerkarte Grundlagen die grundlegenden Informationen für Ihre neue SignalR Service-Instanz ein. Geben Sie die folgenden Werte ein:
Feld | Empfohlener Wert | BESCHREIBUNG |
---|---|---|
Abonnement | Auswählen Ihres Abonnements | Wählen Sie das Abonnement aus, das Sie verwenden möchten, um eine neue SignalR Service-Instanz zu erstellen. |
Ressourcengruppe | Erstellen einer Ressourcengruppe namens SignalRTestResources | Wählen Sie eine Ressourcengruppe für Ihre SignalR-Ressource aus, oder erstellen Sie eine. Es ist hilfreich, für dieses Tutorial eine neue Ressourcengruppe zu erstellen, anstatt eine vorhandene Ressourcengruppe zu verwenden. Löschen Sie die Ressourcengruppe, um nach Abschluss des Tutorials Ressourcen freizugeben. Durch das Löschen einer Ressourcengruppe werden auch alle Ressourcen dieser Gruppe gelöscht. Diese Aktion kann nicht rückgängig gemacht werden. Bevor Sie eine Ressourcengruppe löschen, stellen Sie sicher, dass sie keine Ressourcen enthält, die Sie behalten möchten. Weitere Informationen finden Sie unter Verwenden von Ressourcengruppen zum Verwalten von Azure-Ressourcen. |
Ressourcenname | testsignalr | Geben Sie für die SignalR-Ressource einen eindeutigen Ressourcennamen ein. Wenn testsignalr bereits in Ihrer Region belegt ist, fügen Sie Ziffern oder Zeichen hinzu, bis der Name eindeutig ist. Der Name muss zwischen 1 und 63 Zeichen lang sein und darf nur Zahlen, Buchstaben und den Bindestrich ( - ) enthalten. Der Name darf weder mit dem Bindestrich beginnen oder enden noch mehrere aufeinanderfolgende Bindestriche enthalten. |
Region | Wählen Sie Ihre Region aus. | Wählen Sie die entsprechende Region für Ihre neue SignalR Service-Instanz aus. Azure SignalR Service ist derzeit nicht in allen Regionen verfügbar. Weitere Informationen finden Sie unter Verfügbare Produkte nach Region. |
Preisstufe | Klicken Sie auf Ändern und dann auf Free (nur Dev/Test). Klicken Sie auf Auswählen, um Ihre Tarifauswahl zu bestätigen. | Azure SignalR Service bietet drei Tarife: Free, Standard und Premium. Für Tutorials wird der Tarif Free verwendet, sofern in den Voraussetzungen nichts anderes angegeben ist. Weitere Informationen zu den Funktionsunterschieden zwischen Tarifen und Preisen finden Sie unter Azure SignalR Service – Preise. |
Dienstmodus | Wählen Sie den entsprechenden Dienstmodus | Verwenden Sie Standard, wenn Sie die SignalR-Hublogik in Ihren Web-Apps hosten und den SignalR Service als Proxy verwenden. Verwenden Sie Serverlos, wenn Sie serverlose Technologien wie Azure Functions verwenden, um die SignalR-Hublogik zu hosten. Der Modus Klassisch ist nur für die Abwärtskompatibilität vorgesehen und wird nicht empfohlen. Weitere Informationen finden Sie unter Dienstmodi in Azure SignalR Service. |
Sie müssen die Einstellungen auf den Registerkarten Netzwerk und Tags für die SignalR-Tutorials nicht ändern.
- Klicken Sie unten auf der Registerkarte Grundlagen auf die Schaltfläche Überprüfen und erstellen.
- Überprüfen Sie auf der Registerkarte Überprüfen und erstellen die Werte und klicken Sie dann auf Erstellen. Die Bereitstellung dauert ein paar Augenblicke.
- Klicken Sie nach Abschluss der Bereitstellung auf die Schaltfläche Zu Ressource wechseln.
- Klicken Sie auf der SignalR-Ressourcenseite im Menü auf der linken Seite unter Einstellungen auf Schlüssel.
- Kopieren Sie die Verbindungszeichenfolge für den Primärschlüssel. Sie benötigen diese Verbindungszeichenfolge später in diesem Tutorial, um Ihre App zu konfigurieren.
Erstellen eines Azure Functions-Projekts
Erstellen Sie ein lokales Azure Functions-Projekt.
- Erstellen Sie über die Befehlszeile ein Verzeichnis für das Projekt.
- Wechseln Sie in das Projektverzeichnis.
- Verwenden Sie den Azure Functions-Befehl
func init
, um Ihr Funktionsprojekt zu initialisieren.
# Initialize a function project
func init --worker-runtime python
Erstellen der Funktionen
Nachdem Sie ein Projekt initialisiert haben, müssen Sie die Funktionen erstellen. Dieses Projekt erfordert drei Funktionen:
index
: Hostet eine Webseite für einen Client.negotiate
: Wird vom Client zum Abrufen eines Zugriffstoken verwendet.broadcast
: Verwendet einen Zeittrigger, um Nachrichten regelmäßig an alle Clients zu übertragen.
Wenn Sie den Befehl func new
aus dem Stammverzeichnis des Projekts ausführen, fügt die Azure Functions Core Tools den Funktionscode in der Datei function_app.py
an. Sie bearbeiten die Parameter bei Bedarf, indem Sie den Standardcode durch den App-Code ersetzen.
Erstellen der Indexfunktion
Sie können diese Beispielfunktion als Vorlage für Ihre eigenen Funktionen verwenden.
Öffnen Sie die Datei function_app.py
. Diese Datei enthält Ihre Funktionen. Ändern Sie zunächst die Datei so, dass sie die erforderlichen Importanweisungen enthält, und definieren Sie globale Variablen, die wir in den folgenden Funktionen verwenden werden.
import azure.functions as func
import os
import requests
import json
app = func.FunctionApp()
etag = ''
start_count = 0
- Fügen Sie die Funktion
index
hinzu, indem Sie den folgenden Code hinzufügen
@app.route(route="index", auth_level=func.AuthLevel.ANONYMOUS)
def index(req: func.HttpRequest) -> func.HttpResponse:
f = open(os.path.dirname(os.path.realpath(__file__)) + '/content/index.html')
return func.HttpResponse(f.read(), mimetype='text/html')
Diese Funktion hostet eine Website für einen Client.
Erstellen der Negotiatefunktion
Fügen Sie die Funktion negotiate
hinzu, indem Sie den folgenden Code hinzufügen.
Unformatierte Verbindungszeichenfolgen werden in diesem Artikel nur zu Demonstrationszwecken angezeigt. Schützen Sie Ihre Zugriffsschlüssel in Produktionsumgebungen immer sorgfältig. Verwenden Sie Azure Key Vault, um Ihre Schlüssel sicher zu verwalten und zu rotieren, Ihre Verbindungszeichenfolge mithilfe von Microsoft Entra ID zu schützen und den Zugriff mit Microsoft Entra ID zu autorisieren.
@app.route(route="negotiate", auth_level=func.AuthLevel.ANONYMOUS, methods=["POST"])
@app.generic_input_binding(arg_name="connectionInfo", type="signalRConnectionInfo", hubName="serverless", connectionStringSetting="AzureSignalRConnectionString")
def negotiate(req: func.HttpRequest, connectionInfo) -> func.HttpResponse:
return func.HttpResponse(connectionInfo)
Mit dieser Funktion kann ein Client ein Zugriffstoken abrufen.
Erstellen einer Broadcastfunktion
Fügen Sie die Funktion broadcast
hinzu, indem Sie den folgenden Code hinzufügen
@app.timer_trigger(schedule="*/1 * * * *", arg_name="myTimer",
run_on_startup=False,
use_monitor=False)
@app.generic_output_binding(arg_name="signalRMessages", type="signalR", hubName="serverless", connectionStringSetting="AzureSignalRConnectionString")
def broadcast(myTimer: func.TimerRequest, signalRMessages: func.Out[str]) -> None:
global etag
global start_count
headers = {'User-Agent': 'serverless', 'If-None-Match': etag}
res = requests.get('https://api.github.com/repos/azure/azure-functions-python-worker', headers=headers)
if res.headers.get('ETag'):
etag = res.headers.get('ETag')
if res.status_code == 200:
jres = res.json()
start_count = jres['stargazers_count']
signalRMessages.set(json.dumps({
'target': 'newMessage',
'arguments': [ 'Current star count of https://api.github.com/repos/azure/azure-functions-python-worker is: ' + str(start_count) ]
}))
Diese Funktion verwendet einen Zeittrigger, um Nachrichten regelmäßig an alle Clients zu übertragen.
Erstellen eines Azure Functions-Projekts
Erstellen Sie ein lokales Azure Functions-Projekt.
- Erstellen Sie über die Befehlszeile ein Verzeichnis für das Projekt.
- Wechseln Sie in das Projektverzeichnis.
- Verwenden Sie den Azure Functions-Befehl
func init
, um Ihr Funktionsprojekt zu initialisieren.
# Initialize a function project
func init --worker-runtime python --model v1
Erstellen der Funktionen
Nachdem Sie ein Projekt initialisiert haben, müssen Sie die Funktionen erstellen. Dieses Projekt erfordert drei Funktionen:
index
: Hostet eine Webseite für einen Client.negotiate
: Wird vom Client zum Abrufen eines Zugriffstoken verwendet.broadcast
: Verwendet einen Zeittrigger, um Nachrichten regelmäßig an alle Clients zu übertragen.
Wenn Sie den Befehl func new
im Stammordner des Projekts ausführen, erstellt Azure Functions Core Tools Standardfunktionsquelldateien und speichert sie in einem Ordner, der nach der Funktion benannt ist. Sie bearbeiten die Dateien nach Bedarf, indem Sie den Standardcode durch den App-Code ersetzen.
Erstellen der Indexfunktion
Sie können diese Beispielfunktion als Vorlage für Ihre eigenen Funktionen verwenden.
- Führen Sie den folgenden Befehl aus, um die Funktion
index
zu erstellen.
func new -n index -t HttpTrigger
- Bearbeiten Sie index/function.json und ersetzen Sie den Inhalt durch den folgenden JSON-Code:
{
"bindings": [
{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
}
]
}
- Bearbeiten Sie index/_init_.py und ersetzen Sie den Inhalt durch den folgenden Code:
import os
import azure.functions as func
def main(req: func.HttpRequest) -> func.HttpResponse:
f = open(os.path.dirname(os.path.realpath(__file__)) + '/../content/index.html')
return func.HttpResponse(f.read(), mimetype='text/html')
Erstellen der Negotiatefunktion
- Führen Sie den folgenden Befehl aus, um die Funktion
negotiate
zu erstellen.
func new -n negotiate -t HttpTrigger
- Bearbeiten Sie negotiate/function.json und ersetzen Sie den Inhalt durch den folgenden JSON-Code:
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
},
{
"type": "signalRConnectionInfo",
"name": "connectionInfo",
"hubName": "serverless",
"connectionStringSetting": "AzureSignalRConnectionString",
"direction": "in"
}
]
}
- Bearbeiten Sie negotiate/_init_.py und ersetzen Sie den Inhalt durch den folgenden Code:
import azure.functions as func
def main(req: func.HttpRequest, connectionInfo) -> func.HttpResponse:
return func.HttpResponse(connectionInfo)
Erstellen einer Broadcastfunktion
- Führen Sie den folgenden Befehl aus, um die Funktion
broadcast
zu erstellen.
func new -n broadcast -t TimerTrigger
# install requests
pip install requests
- Bearbeiten Sie broadcast/function.json und ersetzen Sie den Inhalt durch den folgenden Code:
{
"scriptFile": "__init__.py",
"bindings": [
{
"name": "myTimer",
"type": "timerTrigger",
"direction": "in",
"schedule": "*/5 * * * * *"
},
{
"type": "signalR",
"name": "signalRMessages",
"hubName": "serverless",
"connectionStringSetting": "AzureSignalRConnectionString",
"direction": "out"
}
]
}
- Bearbeiten Sie broadcast/_init_.py und ersetzen Sie den Inhalt durch den folgenden Code:
import requests
import json
import azure.functions as func
etag = ''
start_count = 0
def main(myTimer: func.TimerRequest, signalRMessages: func.Out[str]) -> None:
global etag
global start_count
headers = {'User-Agent': 'serverless', 'If-None-Match': etag}
res = requests.get('https://api.github.com/repos/azure/azure-signalr', headers=headers)
if res.headers.get('ETag'):
etag = res.headers.get('ETag')
if res.status_code == 200:
jres = res.json()
start_count = jres['stargazers_count']
signalRMessages.set(json.dumps({
'target': 'newMessage',
'arguments': [ 'Current star count of https://github.com/Azure/azure-signalr is: ' + str(start_count) ]
}))
Erstellen der Datei „index.html”
Die Clientschnittstelle für diese App ist eine Webseite. Die Funktion index
liest HTML-Inhalt aus der Datei content/index.html.
- Erstellen Sie einen Ordner namens
content
in Ihrem Projektstammordner. - Erstellen Sie die Datei content/index.html.
- Kopieren Sie den folgenden Inhalt in die Datei content/index.html und speichern Sie sie:
<html>
<body>
<h1>Azure SignalR Serverless Sample</h1>
<div id="messages"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/3.1.7/signalr.min.js"></script>
<script>
let messages = document.querySelector('#messages');
const apiBaseUrl = window.location.origin;
const connection = new signalR.HubConnectionBuilder()
.withUrl(apiBaseUrl + '/api')
.configureLogging(signalR.LogLevel.Information)
.build();
connection.on('newMessage', (message) => {
document.getElementById("messages").innerHTML = message;
});
connection.start()
.catch(console.error);
</script>
</body>
</html>
Hinzufügen der SignalR Service-Verbindungszeichenfolge zu den Functions-App-Einstellungen
Der letzte Schritt besteht darin, die SignalR Service-Verbindungszeichenfolge in den Einstellungen der Azure Functions-App festzulegen.
Gehen Sie im Azure-Portal zu der zuvor bereitgestellten SignalR-Instanz.
Wählen Sie Schlüssel aus, um die Verbindungszeichenfolgen für die SignalR-Dienstinstanz anzuzeigen.
Kopieren Sie die primäre Verbindungszeichenfolge und führen Sie den folgenden Befehl aus:
func settings add AzureSignalRConnectionString "<signalr-connection-string>"
Lokales Ausführen der Azure Functions-App
Starten Sie den Azurite-Speicheremulator:
azurite
Führen Sie die Azure Functions-App in der lokalen Umgebung aus:
func start
Hinweis
Wenn Lesefehler im Blobspeicher angezeigt werden, stellen Sie sicher, dass die Einstellung „AzureWebJobsStorage” in der Datei local.settings.json auf UseDevelopmentStorage=true
festgelegt ist.
Nachdem nun die Azure Functions-App lokal ausgeführt wird, gehen Sie zu http://localhost:7071/api/index
. Auf der Seite wird die aktuelle Sternanzahl für das GitHub-Repository Azure/azure-signalr angezeigt. Wenn Sie für das Repository in GitHub einen Stern vergeben oder entfernen, wird die Anzahl von Sternen alle paar Sekunden aktualisiert.
Bereinigen von Ressourcen
Wenn Sie diese App nicht weiter verwenden möchten, löschen Sie alle von diesem Schnellstart erstellten Ressourcen. Führen Sie dazu folgende Schritte durch, damit keine Gebühren anfallen:
Klicken Sie ganz links im Azure-Portal auf Ressourcengruppen und anschließend auf die erstellte Ressourcengruppe. Alternativ können Sie das Suchfeld verwenden, um nach der Ressourcengruppe anhand ihres Namens zu suchen.
Wählen im Fenster, das geöffnet wird, die Ressourcengruppe aus, und klicken Sie dann auf Ressourcengruppe löschen.
Geben Sie in dem neuen Fenster den Namen der zu löschenden Ressourcengruppe ein, und klicken Sie dann auf Löschen.
Treten Probleme auf? Verwenden Sie den Leitfaden zur Problembehandlung, oder informieren Sie uns.
Nächste Schritte
In diesem Schnellstart haben Sie eine lokale serverlose Echtzeitanwendung erstellt und ausgeführt. Informieren Sie sich als Nächstes ausführlicher über die Verwendung der bidirektionalen Kommunikation zwischen den Clients und Azure Functions mit SignalR Service.