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.

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.

  1. Melden Sie sich beim Azure-Portal an.
  2. Wählen Sie links oben auf der Seite die Option + Ressource erstellen aus.
  3. 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.
  4. Klicken Sie auf der Seite SignalR Service auf Erstellen.
  5. 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.

  1. Klicken Sie unten auf der Registerkarte Grundlagen auf die Schaltfläche Überprüfen und erstellen.
  2. Überprüfen Sie auf der Registerkarte Überprüfen und erstellen die Werte und klicken Sie dann auf Erstellen. Die Bereitstellung dauert ein paar Augenblicke.
  3. Klicken Sie nach Abschluss der Bereitstellung auf die Schaltfläche Zu Ressource wechseln.
  4. Klicken Sie auf der SignalR-Ressourcenseite im Menü auf der linken Seite unter Einstellungen auf Schlüssel.
  5. 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.

  1. Erstellen Sie über die Befehlszeile ein Verzeichnis für das Projekt.
  2. Wechseln Sie in das Projektverzeichnis.
  3. 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 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.

  1. Führen Sie den folgenden Befehl aus, um die Funktion index zu erstellen.
func new -n index -t HttpTrigger
  1. 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"
    }
  ]
}
  1. 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

  1. Führen Sie den folgenden Befehl aus, um die Funktion negotiate zu erstellen.
func new -n negotiate -t HttpTrigger
  1. 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"
    }
  ]
}
  1. 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

  1. Führen Sie den folgenden Befehl aus, um die Funktion broadcast zu erstellen.
func new -n broadcast -t TimerTrigger
# install requests
pip install requests
  1. 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"
    }
  ]
}
  1. 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.

  1. Erstellen Sie einen Ordner namens content in Ihrem Projektstammordner.
  2. Erstellen Sie die Datei content/index.html.
  3. 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.

  1. Gehen Sie im Azure-Portal zu der zuvor bereitgestellten SignalR-Instanz.

  2. Wählen Sie Schlüssel aus, um die Verbindungszeichenfolgen für die SignalR-Dienstinstanz anzuzeigen.

    Screenshot of Azure SignalR service Keys page.

  3. 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:

  1. 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.

  2. Wählen im Fenster, das geöffnet wird, die Ressourcengruppe aus, und klicken Sie dann auf Ressourcengruppe löschen.

  3. 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.