Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
In questo articolo, integrerai una coda di Azure Storage con la funzione e l'account di archiviazione creati nell'articolo introduttivo rapido precedente. È possibile ottenere questa integrazione usando un binding di output che scrive i dati di una richiesta HTTP in un messaggio della coda. Il completamento di questo articolo non comporta costi aggiuntivi oltre ai pochi centesimi di dollaro USA della guida di avvio rapido precedente. Per ulteriori informazioni sulle associazioni, vedere i concetti di trigger e associazioni in Azure Functions.
Configurare l'ambiente locale
Prima di iniziare, è necessario completare l'articolo Quickstart: Creare un Azure Functions project dalla riga di comando. Se le risorse sono già state eliminate alla fine di questo articolo, eseguire di nuovo i passaggi per ricreare l'app per le funzioni e le risorse correlate in Azure.
Prima di iniziare, è necessario completare l'articolo Quickstart: Creare un Azure Functions project dalla riga di comando. Se le risorse sono già state eliminate alla fine di questo articolo, eseguire di nuovo i passaggi per ricreare l'app per le funzioni e le risorse correlate in Azure.
Prima di iniziare, è necessario completare l'articolo Quickstart: Creare un Azure Functions project dalla riga di comando. Se le risorse sono già state eliminate alla fine di questo articolo, eseguire di nuovo i passaggi per ricreare l'app per le funzioni e le risorse correlate in Azure.
Prima di iniziare, è necessario completare l'articolo Quickstart: Creare un Azure Functions project dalla riga di comando. Se le risorse sono già state eliminate alla fine di questo articolo, eseguire di nuovo i passaggi per ricreare l'app per le funzioni e le risorse correlate in Azure.
Prima di iniziare, è necessario completare l'articolo Quickstart: Creare un Azure Functions project dalla riga di comando. Se le risorse sono già state eliminate alla fine di questo articolo, eseguire di nuovo i passaggi per ricreare l'app per le funzioni e le risorse correlate in Azure.
Prima di iniziare, è necessario completare l'articolo Quickstart: Creare un Azure Functions project dalla riga di comando. Se le risorse sono già state eliminate alla fine di questo articolo, eseguire di nuovo i passaggi per ricreare l'app per le funzioni e le risorse correlate in Azure.
Recuperare la stringa di connessione di Azure Storage
Importante
Questo articolo illustra attualmente come connettersi all'account Azure Storage usando il connection string, che contiene una chiave privata condivisa. L'uso di un connection string semplifica la verifica degli aggiornamenti dei dati nell'account storage. Per una maggiore sicurezza, è consigliabile usare invece le identità gestite per la connessione all'account storage. Per altre informazioni, vedere Connessioni nella Guida per sviluppatori.
In precedenza, hai creato un account di archiviazione di Azure per l'uso dell'applicazione di funzioni. Il connection string per questo account viene archiviato in modo sicuro nelle impostazioni dell'app in Azure. Scaricando l'impostazione nel file local.settings.json, è possibile usare la connessione per scrivere in una coda di Storage nello stesso account quando si esegue la funzione in locale.
Dalla radice del progetto, eseguire il comando seguente, sostituendo
<APP_NAME>con il nome della funzione app del passaggio precedente. Questo comando sovrascrive tutti i valori esistenti nel file.func azure functionapp fetch-app-settings <APP_NAME>Aprire il file local.settings.json e individuare il valore denominato
AzureWebJobsStorage, ovvero la stringa di connessione dell'account di archiviazione. Usi il nomeAzureWebJobsStoragee la stringa di connessione nel resto di questo articolo.
Importante
Poiché il file local.settings.json contiene segreti scaricati da Azure, escludere sempre questo file dal controllo del codice sorgente. Il file .gitignore creato con il progetto funzioni locali esclude il file per impostazione predefinita.
Registrare le estensioni delle associazioni
Ad eccezione dei trigger HTTP e timer, i binding vengono implementati come pacchetti di estensione. Eseguire il comando dotnet add package seguente nella finestra terminale per aggiungere il pacchetto di estensione Storage al project.
dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues --prerelease
È ora possibile aggiungere l'associazione di output storage al project.
Aggiungere una definizione di binding di output alla funzione
Anche se una funzione può avere un solo trigger, può avere più associazioni di input e output, che consente di connettersi ad altri servizi e risorse Azure senza scrivere codice di integrazione personalizzato.
Quando si usa il modello di programmazione Node.js v4, gli attributi di associazione vengono definiti direttamente nel file ./src/functions/HttpExample.js . Nella guida di avvio rapido precedente, il file contiene già un binding HTTP definito dal metodo app.http.
const { app } = require('@azure/functions');
app.http('httpTrigger', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
handler: async (request, context) => {
try {
context.log(`Http function processed request for url "${request.url}"`);
const name = request.query.get('name') || (await request.text());
context.log(`Name: ${name}`);
if (!name) {
return { status: 404, body: 'Not Found' };
}
return { body: `Hello, ${name}!` };
} catch (error) {
context.log(`Error: ${error}`);
return { status: 500, body: 'Internal Server Error' };
}
},
});
Quando si usa il modello di programmazione Node.js v4, gli attributi di associazione vengono definiti direttamente nel file ./src/functions/HttpExample.js . Nella guida di avvio rapido precedente, il file contiene già un binding HTTP definito dal metodo app.http.
import {
app,
HttpRequest,
HttpResponseInit,
InvocationContext,
} from '@azure/functions';
export async function httpTrigger1(
request: HttpRequest,
context: InvocationContext,
): Promise<HttpResponseInit> {
context.log(`Http function processed request for url "${request.url}"`);
const name = request.query.get('name') || (await request.text()) || 'world';
return { body: `Hello, ${name}!` };
}
app.http('httpTrigger1', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
handler: httpTrigger1,
});
Questi binding vengono dichiarati nel file function.json nella cartella della funzione. Dall'argomento di avvio rapido precedente il file function.json nella cartella HttpExample contiene due binding nella raccolta bindings:
Quando si usa il modello di programmazione Python v2, gli attributi di associazione vengono definiti direttamente nel file function_app.py come elementi decorator. Dalla precedente guida di avvio rapido, il file function_app.py già contiene un binding basato sull'elemento Decorator:
import azure.functions as func
import logging
app = func.FunctionApp()
@app.function_name(name="HttpTrigger1")
@app.route(route="hello", auth_level=func.AuthLevel.ANONYMOUS)
L'elemento Decorator route aggiunge il binding HttpTrigger e HttpOutput alla funzione, consentendo l'attivazione della funzione quando le richieste HTTP raggiungono la route indicata.
Per scrivere in una coda di Azure Storage da questa funzione, aggiungere il decoratore queue_output al codice della funzione.
@app.queue_output(arg_name="msg", queue_name="outqueue", connection="AzureWebJobsStorage")
Nel decoratore arg_name identifica il parametro di binding a cui si fa riferimento nel codice, queue_name è il nome della coda su cui scrive il binding e connection è il nome di un'impostazione dell'applicazione che contiene la stringa di connessione per l'account di archiviazione. Nei quickstart si usa lo stesso account di archiviazione dell'app per le funzioni, che si trova nell'impostazione AzureWebJobsStorage (dal file local.settings.json). Se queue_name non esiste, il binding lo crea al primo utilizzo.
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "Request",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "Response"
}
]
Per scrivere in una coda di Azure Storage:
Aggiungere una proprietà
extraOutputsalla configurazione dell'associazione{ methods: ['GET', 'POST'], extraOutputs: [sendToQueue], // add output binding to HTTP trigger authLevel: 'anonymous', handler: () => {} }Aggiungere una funzione
output.storageQueuesopra la chiamataapp.httpconst sendToQueue: StorageQueueOutput = output.storageQueue({ queueName: 'outqueue', connection: 'AzureWebJobsStorage', });
Il secondo binding nella raccolta è denominato res. Questo binding http è un binding di output (out) usato per scrivere la risposta HTTP.
Per scrivere in una coda Azure Storage da questa funzione, aggiungere un'associazione out di tipo queue con il nome msg, come illustrato nel codice seguente:
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "Request",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "Response"
},
{
"type": "queue",
"direction": "out",
"name": "msg",
"queueName": "outqueue",
"connection": "AzureWebJobsStorage"
}
]
}
Per un tipo queue, è necessario specificare il nome della coda in queueName e specificare il name della connessione Azure Storage (dal file local.settings.json) in connection.
In un project C# le associazioni vengono definite come attributi di associazione nel metodo della funzione. Definizioni specifiche dipendono dal fatto che l'app venga eseguita in-process (libreria di classi C#) o in un processo di lavoro isolato.
Aprire il file HttpExample.cs del progetto e aggiungere la seguente classe: MultiResponse
public class MultiResponse
{
[QueueOutput("outqueue", Connection = "AzureWebJobsStorage")]
public string[] Messages { get; set; }
public IActionResult HttpResponse { get; set; }
}
La classe MultiResponse consente di scrivere in una coda di storage denominata outqueue e un messaggio http riuscito. È possibile inviare più messaggi alla coda perché l'attributo QueueOutput viene applicato a una matrice di stringhe.
La proprietà Connection imposta il connection string per l'account storage. In questo caso, è possibile omettere Connection perché si sta già usando l'account storage predefinito.
In un project Java, le associazioni vengono definite come annotazioni di associazione nel metodo della funzione. Il file function.json viene quindi generato automaticamente in base a queste annotazioni.
Passare al percorso del codice della funzione in src/main/java, aprire il file di progetto Function.java e aggiungere il seguente parametro alla definizione del metodo run:
@QueueOutput(name = "msg", queueName = "outqueue", connection = "AzureWebJobsStorage") OutputBinding<String> msg
Il parametro connection. Passare l'impostazione dell'applicazione che contiene il connection string dell'account Storage anziché passare il connection string stesso.
La definizione del run metodo deve ora essere simile all'esempio seguente:
@FunctionName("HttpTrigger-Java")
public HttpResponseMessage run(
@HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.FUNCTION)
HttpRequestMessage<Optional<String>> request,
@QueueOutput(name = "msg", queueName = "outqueue", connection = "AzureWebJobsStorage")
OutputBinding<String> msg, final ExecutionContext context) {
...
}
Per altre informazioni sui dettagli delle associazioni, vedere Azure Functions concetti relativi a trigger e associazioni e configurazione dell'output della coda.
Aggiungere il codice per usare il binding di output
Una volta definita l'associazione della coda, è possibile aggiornare la funzione per ricevere il parametro di output msg e scrivere i messaggi nella coda.
Aggiornare HttpExample\function_app.py in modo che corrisponda al codice seguente, aggiungendo il parametro msg alla definizione della funzione e msg.set(name) sotto l'istruzione if name::
import azure.functions as func
import logging
app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@app.route(route="HttpExample")
@app.queue_output(arg_name="msg", queue_name="outqueue", connection="AzureWebJobsStorage")
def HttpExample(req: func.HttpRequest, msg: func.Out [func.QueueMessage]) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
name = req.params.get('name')
if not name:
try:
req_body = req.get_json()
except ValueError:
pass
else:
name = req_body.get('name')
if name:
msg.set(name)
return func.HttpResponse(f"Hello, {name}. This HTTP triggered function executed successfully.")
else:
return func.HttpResponse(
"This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.",
status_code=200
)
Il parametro msg è un'istanza del azure.functions.Out class. Il metodo set scrive un messaggio stringa nella coda. In questo caso, è il name passato alla funzione nella stringa di query dell'URL.
Aggiungere il codice che usa l'oggetto del binding di output in context.extraOutputs per creare un messaggio della coda. Aggiungere questo codice prima dell'istruzione return.
context.extraOutputs.set(sendToQueue, [msg]);
A questo punto, la funzione potrebbe essere come indicato di seguito:
const { app, output } = require('@azure/functions');
const sendToQueue = output.storageQueue({
queueName: 'outqueue',
connection: 'AzureWebJobsStorage',
});
app.http('HttpExample', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
extraOutputs: [sendToQueue],
handler: async (request, context) => {
try {
context.log(`Http function processed request for url "${request.url}"`);
const name = request.query.get('name') || (await request.text());
context.log(`Name: ${name}`);
if (name) {
const msg = `Name passed to the function ${name}`;
context.extraOutputs.set(sendToQueue, [msg]);
return { body: msg };
} else {
context.log('Missing required data');
return { status: 404, body: 'Missing required data' };
}
} catch (error) {
context.log(`Error: ${error}`);
return { status: 500, body: 'Internal Server Error' };
}
},
});
Aggiungere il codice che usa l'oggetto del binding di output in context.extraOutputs per creare un messaggio della coda. Aggiungere questo codice prima dell'istruzione return.
context.extraOutputs.set(sendToQueue, [msg]);
A questo punto, la funzione potrebbe essere come indicato di seguito:
import {
app,
output,
HttpRequest,
HttpResponseInit,
InvocationContext,
StorageQueueOutput,
} from '@azure/functions';
const sendToQueue: StorageQueueOutput = output.storageQueue({
queueName: 'outqueue',
connection: 'AzureWebJobsStorage',
});
export async function HttpExample(
request: HttpRequest,
context: InvocationContext,
): Promise<HttpResponseInit> {
try {
context.log(`Http function processed request for url "${request.url}"`);
const name = request.query.get('name') || (await request.text());
context.log(`Name: ${name}`);
if (name) {
const msg = `Name passed to the function ${name}`;
context.extraOutputs.set(sendToQueue, [msg]);
return { body: msg };
} else {
context.log('Missing required data');
return { status: 404, body: 'Missing required data' };
}
} catch (error) {
context.log(`Error: ${error}`);
return { status: 500, body: 'Internal Server Error' };
}
}
app.http('HttpExample', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
handler: HttpExample,
});
Aggiungere il codice che usa il cmdlet Push-OutputBinding per scrivere un testo nella coda usando il binding di output msg. Aggiungere questo codice prima di impostare lo stato OK nell'istruzione if.
$outputMsg = $name
Push-OutputBinding -name msg -Value $outputMsg
A questo punto, la funzione deve essere come indicato di seguito:
using namespace System.Net
# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)
# Write to the Azure Functions log stream.
Write-Host "PowerShell HTTP trigger function processed a request."
# Interact with query parameters or the body of the request.
$name = $Request.Query.Name
if (-not $name) {
$name = $Request.Body.Name
}
if ($name) {
# Write the $name value to the queue,
# which is the name passed to the function.
$outputMsg = $name
Push-OutputBinding -name msg -Value $outputMsg
$status = [HttpStatusCode]::OK
$body = "Hello $name"
}
else {
$status = [HttpStatusCode]::BadRequest
$body = "Please pass a name on the query string or in the request body."
}
# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
StatusCode = $status
Body = $body
})
Sostituire il metodo esistente Run con il codice seguente:
[Function("HttpExample")]
public MultiResponse Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequest req)
{
_logger.LogInformation("C# HTTP trigger function processed a request.");
var message = "Welcome to Azure Functions!";
// Return a response to both HTTP trigger and storage output binding.
return new MultiResponse()
{
// Write a single message.
Messages = new string[] { message },
HttpResponse = new OkObjectResult(message)
};
}
Ora è possibile usare il nuovo parametro msg per scrivere nel binding di output dal codice della funzione. Aggiungere la seguente riga di codice prima della risposta di successo per aggiungere il valore di name al binding di output msg.
msg.setValue(name);
Quando si usa un'associazione di output, non è necessario usare il codice Azure Storage SDK per l'autenticazione, ottenere un riferimento alla coda o scrivere dati. Queste attività vengono eseguite automaticamente dal runtime di Funzioni e dal binding di output.
Il run metodo deve ora essere simile all'esempio seguente:
public HttpResponseMessage run(
@HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> request,
@QueueOutput(name = "msg", queueName = "outqueue",
connection = "AzureWebJobsStorage") OutputBinding<String> msg,
final ExecutionContext context) {
context.getLogger().info("Java HTTP trigger processed a request.");
// Parse query parameter
String query = request.getQueryParameters().get("name");
String name = request.getBody().orElse(query);
if (name == null) {
return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
.body("Please pass a name on the query string or in the request body").build();
} else {
// Write the name to the message queue.
msg.setValue(name);
return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
}
}
Aggiornare i test
Poiché l'archetipo crea anche un set di test, è necessario aggiornare questi test per gestire il nuovo parametro msg nella firma del metodo run.
Passare al percorso del codice di test in src/test/java, aprire il file Function.java project e sostituire la riga di codice in //Invoke con il codice seguente:
@SuppressWarnings("unchecked")
final OutputBinding<String> msg = (OutputBinding<String>)mock(OutputBinding.class);
final HttpResponseMessage ret = new Function().run(req, msg, context);
Si noti che non è necessario scrivere codice per l'autenticazione, ottenendo un riferimento alla coda o scrivendo dati. Tutte queste attività di integrazione vengono gestite in modo pratico nel runtime di Azure Functions e nell'associazione di output della coda.
Eseguire la funzione in locale
Eseguire la funzione avviando l'host di runtime Azure Functions locale dalla cartella LocalFunctionProj.
func startVerso la fine dell'output, devono essere visualizzate le righe seguenti:
Nota
Se HttpExample non viene visualizzato come illustrato in precedenza, è probabile che l'host sia stato avviato dall'esterno della cartella radice del project. In tal caso, usare Ctrl+C per arrestare l'host, passare alla cartella radice del project ed eseguire di nuovo il comando precedente.
Copiare l'URL della funzione HTTP da questo output in un browser e aggiungere la stringa di query
?name=<YOUR_NAME>, rendendo l'URL completo comehttp://localhost:7071/api/HttpExample?name=Functions. Il browser dovrebbe visualizzare un messaggio di risposta che restituisce il valore della stringa di query. Il terminale in cui è stato avviato il progetto mostra anche l'output del log durante le richieste.Al termine, premere CTRL+C e digitare
yper arrestare l'host delle funzioni.
Visualizzare il messaggio nella coda Azure Storage
È possibile visualizzare la coda nel Azure portal o nel Microsoft Azure Storage Explorer. È anche possibile visualizzare la coda nella Azure CLI, come descritto nei passaggi seguenti:
Aprire il file local.setting.json della funzione project e copiare il valore connection string. In un terminale o in una finestra di comando eseguire il comando seguente per creare una variabile di ambiente denominata
AZURE_STORAGE_CONNECTION_STRINGe incollare le connection string specifiche al posto di<MY_CONNECTION_STRING>. Questa variabile di ambiente indica che non è necessario fornire il connection string a ogni comando successivo usando l'argomento--connection-string.export AZURE_STORAGE_CONNECTION_STRING="<MY_CONNECTION_STRING>"(Facoltativo) Usare il comando
az storage queue listper visualizzare le code di Storage nell'account. L'output di questo comando deve includere una coda denominataoutqueue, creata quando la funzione ha scritto il primo messaggio in tale coda.az storage queue list --output tsvUsare il comando
az storage message getper leggere il messaggio da questa coda, che deve essere il valore specificato durante il test della funzione in precedenza. Il comando legge e rimuove il primo messaggio dalla coda.echo `echo $(az storage message get --queue-name outqueue -o tsv --query '[].{Message:content}') | base64 --decode`Poiché il corpo del messaggio viene archiviato base64 codificato, il messaggio deve essere decodificato prima che venga visualizzato. Dopo aver eseguito
az storage message get, il messaggio viene rimosso dalla coda. Se è presente un solo messaggio inoutqueue, quando si esegue questo comando una seconda volta non viene recuperato alcun messaggio e si riceve invece un errore.
Ridistribuire il project in Azure
Dopo aver verificato localmente che la funzione ha scritto un messaggio nella coda di Azure Storage, è possibile ridistribuire il project per aggiornare l'endpoint in esecuzione in Azure.
Nella cartella LocalFunctionsProj usare il comando func azure functionapp publish per ridistribuire il project, sostituendo<APP_NAME> con il nome dell'app.
func azure functionapp publish <APP_NAME>
Nella cartella project locale usare il comando Maven seguente per ripubblicare il project:
mvn azure-functions:deploy
Verificare in Azure
Come nella guida rapida precedente, usare un browser o CURL per testare la funzione ridistribuita.
Esaminare di nuovo la coda Storage, come descritto nella sezione precedente, per verificare che contenga il nuovo messaggio scritto nella coda.
Pulire le risorse
Al termine, usare il comando seguente per eliminare il gruppo di risorse e tutte le relative risorse contenute per evitare di sostenere ulteriori costi.
az group delete --name AzureFunctionsQuickstart-rg
Passaggi successivi
Hai aggiornato la tua funzione attivata da HTTP per scrivere dati in una coda di archiviazione Storage. A questo punto è possibile ottenere altre informazioni sullo sviluppo di funzioni dalla riga di comando usando Core Tools e Azure CLI:
Informazioni di riferimento per sviluppatori Azure Functions C#