Guida introduttiva: Creare un'app serverless con Funzioni di Azure e Servizio Azure SignalR in Python
Iniziare a usare Servizio Azure SignalR usando Funzioni di Azure e Python per creare un'applicazione serverless che trasmette messaggi ai client. Si eseguirà la funzione nell'ambiente locale, connettendosi a un'istanza di Servizio Azure SignalR nel cloud. Il completamento di questa guida introduttiva comporta un costo ridotto di pochi centesimi di USD o inferiore nell'account Azure.
Nota
È possibile ottenere il codice in questo articolo da GitHub.
Importante
Le stringa di connessione non elaborate vengono visualizzate in questo articolo solo a scopo dimostrativo.
Un stringa di connessione include le informazioni di autorizzazione necessarie per consentire all'applicazione di accedere alle Servizio Azure SignalR. La chiave di accesso all'interno della stringa di connessione è simile a una password radice per il servizio. Negli ambienti di produzione proteggere sempre le chiavi di accesso. Usare Azure Key Vault per gestire e ruotare le chiavi in modo sicuro e proteggere i stringa di connessione usando Microsoft Entra ID e autorizzare l'accesso con Microsoft Entra ID.
Evitare di distribuire le chiavi di accesso ad altri utenti, impostarle come hardcoded o salvarle in un file di testo normale accessibile ad altri. Ruotare le chiavi se si ritiene che siano state compromesse.
Prerequisiti
Questa guida introduttiva può essere eseguita su macOS, Windows o Linux. È necessario quanto segue:
Prerequisito | Descrizione |
---|---|
Una sottoscrizione di Azure | Se non si ha una sottoscrizione di Azure, creare un account Azure gratuito |
Editor di codice | È necessario un editor di codice, ad esempio Visual Studio Code. |
Azure Functions Core Tools | Richiede la versione 2.7.1505 o successiva per eseguire app per le funzioni di Azure Python in locale. |
Python 3.7+ | Funzioni di Azure richiede Python 3.7+. Vedere Versioni di Python supportate. |
Azzurrite | L'associazione SignalR richiede Archiviazione di Azure. È possibile usare un emulatore di archiviazione locale quando una funzione è in esecuzione in locale. |
Interfaccia della riga di comando di Azure | Facoltativamente, è possibile usare l'interfaccia della riga di comando di Azure per creare un'istanza di Servizio Azure SignalR. |
Creare un'istanza del servizio Azure SignalR
In questa sezione viene creata un'istanza di Azure SignalR di base da usare per l'app. I passaggi seguenti usano il portale di Azure per creare una nuova istanza, ma è anche possibile usare l'interfaccia della riga di comando di Azure. Per altre informazioni, vedere il comando az signalr create in Informazioni di riferimento sull'interfaccia della riga di comando per il Servizio Azure SignalR.
- Accedere al portale di Azure.
- Nell'angolo in alto a sinistra della pagina selezionare + Crea una risorsa.
- Nella casella di testo Servizi di ricerca e marketplace della pagina Crea una risorsa immettere signalr e quindi selezionare Servizio SignalR dall'elenco.
- Nella pagina Servizio SignalR selezionare Crea.
- Nella scheda Informazioni di base immettere le informazioni essenziali per la nuova istanza del servizio SignalR. Immettere i valori seguenti:
Campo | Valore consigliato | Descrizione |
---|---|---|
Abbonamento | Scegliere la sottoscrizione in uso | Selezionare la sottoscrizione da usare per creare una nuova istanza del servizio SignalR. |
Gruppo di risorse | Creare un gruppo di risorse denominato SignalRTestResources | Selezionare o creare un gruppo di risorse per la risorsa SignalR. È utile creare un nuovo gruppo di risorse per questa esercitazione anziché usare un gruppo di risorse esistente. Per liberare risorse dopo aver completato l'esercitazione, eliminare il gruppo di risorse. L'eliminazione di un gruppo di risorse elimina anche tutte le risorse che appartengono al gruppo. Non è possibile annullare questa azione. Prima di eliminare un gruppo di risorse, assicurarsi che non contenga risorse da conservare. Per altre informazioni, vedere Using resource groups to manage your Azure resources (Uso di Gruppi di risorse per gestire le risorse di Azure). |
Nome risorsa | testsignalr | Immettere un nome risorsa univoco da usare per la risorsa SignalR. Se testsignalr è già in uso nell'area, aggiungere una cifra o un carattere fino a quando il nome non è univoco. Il nome deve essere una stringa contenente da 1 a 63 caratteri che possono includere solo numeri, lettere e il segno meno ( - ). Il nome non può iniziare o terminare con un trattino e non sono consentiti più trattini consecutivi. |
Area | Scegli la tua area geografica | Selezionare l'area appropriata per la nuova istanza del servizio SignalR. Il Servizio Azure SignalR non è attualmente disponibile in tutte le aree. Per altre informazioni, vedere Disponibilità del Servizio Azure SignalR a livello di area |
Piano tariffario | Selezionare Modifica e quindi scegliere Gratuito (solo sviluppo/test). Scegliere Seleziona per confermare la scelta del piano tariffario. | Il Servizio Azure SignalR ha tre piani tariffari: Gratuito, Standard e Premium. Le esercitazioni usano il livello Gratuito, a meno che non sia specificato diversamente nei prerequisiti. Per altre informazioni sulle differenze di funzionalità tra i livelli e i prezzi, vedere Prezzi del Servizio Azure SignalR |
Modalità di servizio | Scegliere la modalità di servizio appropriata | Usare Predefinita quando si ospita la logica dell'hub SignalR nelle app Web e si usa il Servizio SignalR come proxy. Usare Serverless quando si usano tecnologie serverless come Funzioni di Azure per ospitare la logica dell'hub SignalR. La modalità Classica è disponibile solo ai fini della compatibilità con le versioni precedenti e non è consigliabile usarla. Per altre informazioni, vedere Modalità di servizio nel Servizio Azure SignalR. |
Non è necessario modificare le impostazioni nelle schede Rete e Tag per le esercitazioni su SignalR.
- Selezionare il pulsante blu Rivedi e crea nella parte inferiore della scheda Informazioni di base.
- Nella scheda Rivedi e crea rivedere i valori e quindi selezionare Crea. Il completamento della distribuzione richiede alcuni istanti.
- Dopo avere completato la distribuzione, selezionare il pulsante Vai alla risorsa.
- Nella pagina della risorsa SignalR selezionare Chiavi dal menu a sinistra, in Impostazioni.
- Copiare la Stringa di connessione per la chiave primaria. Questa stringa di connessione è necessaria per configurare l'app più avanti in questa esercitazione.
Creare il progetto funzione di Azure
Creare un progetto di funzione di Azure locale.
- Da una riga di comando creare una directory per il progetto.
- Modificare il percorso alla directory del progetto.
- Usare il comando Funzioni di Azure
func init
per inizializzare il progetto di funzione.
# Initialize a function project
func init --worker-runtime python
Creare le funzioni
Dopo aver inizializzato un progetto, è necessario creare funzioni. Questo progetto richiede tre funzioni:
-
index
: ospita una pagina Web per un client. -
negotiate
: consente a un client di ottenere un token di accesso. -
broadcast
: usa un trigger di tempo per trasmettere periodicamente i messaggi a tutti i client.
Quando si esegue il func new
comando dalla directory radice del progetto, Funzioni di Azure Core Tools aggiunge il codice della funzione nel function_app.py
file. Si modificherà il contenuto degli annunci dei parametri in base alle esigenze sostituendo il codice predefinito con il codice dell'app.
Creare la funzione index
È possibile usare questa funzione di esempio come modello per le proprie funzioni.
Apri il file function_app.py
. Questo file conterrà le funzioni. Prima di tutto, modificare il file in modo da includere le istruzioni import necessarie e definire variabili globali che verranno usate nelle funzioni seguenti.
import azure.functions as func
import os
import requests
import json
app = func.FunctionApp()
etag = ''
start_count = 0
- Aggiungere la funzione
index
aggiungendo il codice seguente
@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')
Questa funzione ospita una pagina Web per un client.
Creare la funzione negotiate
Aggiungere la funzione negotiate
aggiungendo il codice seguente.
Le stringa di connessione non elaborate vengono visualizzate in questo articolo solo a scopo dimostrativo. Negli ambienti di produzione proteggere sempre le chiavi di accesso. Usare Azure Key Vault per gestire e ruotare le chiavi in modo sicuro e proteggere i stringa di connessione usando Microsoft Entra ID e autorizzare l'accesso con Microsoft Entra ID.
@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)
Questa funzione consente a un client di ottenere un token di accesso.
Creare una funzione di trasmissione.
Aggiungere la funzione broadcast
aggiungendo il codice seguente
@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) ]
}))
Questa funzione usa un trigger di tempo per trasmettere periodicamente i messaggi a tutti i client.
Creare il progetto funzione di Azure
Creare un progetto di funzione di Azure locale.
- Da una riga di comando creare una directory per il progetto.
- Modificare il percorso alla directory del progetto.
- Usare il comando Funzioni di Azure
func init
per inizializzare il progetto di funzione.
# Initialize a function project
func init --worker-runtime python --model v1
Creare le funzioni
Dopo aver inizializzato un progetto, è necessario creare funzioni. Questo progetto richiede tre funzioni:
-
index
: ospita una pagina Web per un client. -
negotiate
: consente a un client di ottenere un token di accesso. -
broadcast
: usa un trigger di tempo per trasmettere periodicamente i messaggi a tutti i client.
Quando si esegue il func new
comando dalla directory radice del progetto, il Funzioni di Azure Core Tools crea i file di origine delle funzioni predefiniti e li archivia in una cartella denominata dopo la funzione. I file verranno modificati in base alle esigenze sostituendo il codice predefinito con il codice dell'app.
Creare la funzione index
È possibile usare questa funzione di esempio come modello per le proprie funzioni.
- Eseguire il comando seguente per creare la
index
funzione .
func new -n index -t HttpTrigger
- Modificare l'indice/function.json e sostituire il contenuto con il codice JSON seguente:
{
"bindings": [
{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
}
]
}
- Modificare index/_init_.py e sostituire il contenuto con il codice seguente:
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')
Creare la funzione negotiate
- Eseguire il comando seguente per creare la
negotiate
funzione .
func new -n negotiate -t HttpTrigger
- Modificare negotiate/function.json e sostituire il contenuto con il codice JSON seguente:
{
"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"
}
]
}
- Modificare negotiate/_init_.py e sostituire il contenuto con il codice seguente:
import azure.functions as func
def main(req: func.HttpRequest, connectionInfo) -> func.HttpResponse:
return func.HttpResponse(connectionInfo)
Creare una funzione di trasmissione.
- Eseguire il comando seguente per creare la
broadcast
funzione .
func new -n broadcast -t TimerTrigger
# install requests
pip install requests
- Modificare broadcast/function.json e sostituire il contenuto con il codice seguente:
{
"scriptFile": "__init__.py",
"bindings": [
{
"name": "myTimer",
"type": "timerTrigger",
"direction": "in",
"schedule": "*/5 * * * * *"
},
{
"type": "signalR",
"name": "signalRMessages",
"hubName": "serverless",
"connectionStringSetting": "AzureSignalRConnectionString",
"direction": "out"
}
]
}
- Modificare broadcast/_init_.py e sostituire il contenuto con il codice seguente:
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) ]
}))
Creare il file index.html
L'interfaccia client per questa app è una pagina Web. La index
funzione legge il contenuto HTML dal file content/index.html .
- Creare una cartella denominata
content
nella cartella radice del progetto. - Creare il file content/index.html.
- Copiare il contenuto seguente nel file content/index.html e salvarlo:
<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>
Aggiungere il Servizio SignalR stringa di connessione alle impostazioni dell'app per le funzioni
L'ultimo passaggio consiste nell'impostare il Servizio SignalR stringa di connessione nelle impostazioni dell'app per le funzioni di Azure.
Nella portale di Azure passare all'istanza di SignalR distribuita in precedenza.
Selezionare Chiavi per visualizzare le stringhe di connessione per l'istanza del servizio SignalR.
Copiare il stringa di connessione primario ed eseguire il comando :
func settings add AzureSignalRConnectionString "<signalr-connection-string>"
Eseguire l'app per le funzioni di Azure in locale
Avviare l'emulatore di archiviazione Di Azurite:
azurite
Eseguire l'app per le funzioni di Azure nell'ambiente locale:
func start
Nota
Se vengono visualizzati errori di lettura nell'archivio BLOB, assicurarsi che l'impostazione "AzureWebJobsStorage" nel file local.settings.json sia impostata su UseDevelopmentStorage=true
.
Dopo aver eseguito la funzione di Azure in locale, passare a http://localhost:7071/api/index
. Nella pagina viene visualizzato il numero di stelle corrente per il repository Azure/azure-signalr di GitHub. Quando si star o unstar il repository in GitHub, il conteggio aggiornato verrà visualizzato ogni pochi secondi.
Pulire le risorse
Se non si intende continuare a usare l'app, eliminare tutte le risorse create tramite questa guida di avvio rapido eseguendo i passaggi seguenti, per evitare qualsiasi addebito:
Nel portale di Azure selezionare Gruppi di risorse all'estrema sinistra e quindi selezionare il gruppo di risorse creato. In alternativa, è possibile usare la casella di ricerca per trovare il gruppo di risorse in base al nome.
Nella finestra che si apre selezionare il gruppo di risorse e quindi fare clic su Elimina gruppo di risorse.
Nella nuova finestra digita il nome del gruppo di risorse da eliminare e quindi fai clic su Elimina.
Problemi? Vedere la guida alla risoluzione dei problemi oppure segnalarli.
Passaggi successivi
In questa guida introduttiva è stata creata ed eseguita un'applicazione serverless in tempo reale in locale. Altre informazioni su come usare la comunicazione bidirezionale tra client e funzioni di Azure con Servizio SignalR.