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.
Azure Functions consente di connettere Azure servizi e altre risorse alle funzioni senza dover scrivere codice di integrazione personalizzato. Questi binding, che rappresentano sia input che output, vengono dichiarati all'interno della definizione di funzione. I dati dei binding vengono forniti alla funzione come parametri. Un trigger è un tipo speciale di binding di input. Anche se una funzione include un solo trigger, può avere più binding di input e output. Per altre informazioni, vedere Azure Functions trigger e concetti relativi alle associazioni.
Questo articolo illustra come usare Visual Studio Codice per connettere Azure Storage alla funzione creata nell'articolo di avvio rapido precedente. L'associazione di output aggiunta a questa funzione scrive i dati dalla richiesta HTTP a un messaggio in una coda di archiviazione di Azure Queue.
La maggior parte delle associazioni richiede una stringa di connessione archiviata, usata da funzioni per accedere al servizio associato. Per semplificare, utilizzi l'account di archiviazione creato con l'app per le funzioni. La connessione a questo account è già archiviata in un'impostazione dell'app denominata AzureWebJobsStorage.
Nota
Questo articolo supporta attualmente Node.js v4 per Funzioni.
Configurare l'ambiente locale
Prima di iniziare, è necessario soddisfare i requisiti seguenti:
Installare l'estensione Azure Storage per Visual Studio Code.
Installare Azure Storage Explorer. Storage Explorer è uno strumento che verrà usato per esaminare i messaggi della coda generati dall'associazione di uscita. Storage Explorer è supportato nei sistemi operativi macOS, Windows e Linux.
- Installare .NET Core CLI tools.
- Completare i passaggi descritti nella parte 1 di Creare una funzione in Azure usando Visual Studio Code.
Questo articolo presuppone che l'utente abbia già eseguito l'accesso alla sottoscrizione Azure da Visual Studio Code. È possibile accedere eseguendo Azure: Sign In dal riquadro comandi.
Scaricare le impostazioni dell'app per le funzioni
Nell'articolo di avvio rapido precedente è stata creata un'app per le funzioni in Azure insieme all'account di archiviazione necessario. Il connection string per questo account viene archiviato in modo sicuro nelle impostazioni dell'app in Azure. In questo articolo, scrivi messaggi in una coda di archiviazione all'interno dello stesso account. Per connettersi all'account storage quando si esegue la funzione in locale, è necessario scaricare le impostazioni dell'app nel file local.settings.json.
Premere F1 per aprire il riquadro comandi, quindi cercare ed eseguire il comando
Azure Functions: Download Remote Settings....Scegliere l'app per le funzioni creata nell'articolo precedente. Selezionare Sì per tutti per sovrascrivere le impostazioni locali esistenti.
Importante
Poiché il file local.settings.json contiene segreti, non viene mai pubblicato e viene escluso dal controllo del codice sorgente.
Copiare il valore
AzureWebJobsStorage, che è la chiave per il valore della stringa di connessione dell'account di archiviazione. Utilizzi questa connessione per verificare che il binding di output funzioni come previsto.
Registrare le estensioni delle associazioni
Poiché si utilizza un'associazione di output per Queue storage, è necessario che l'estensione Storage bindings sia installata prima di eseguire il progetto.
Il progetto è stato configurato per l'uso di bundle di estensioni, che installano automaticamente un set predefinito di pacchetti di estensione.
I bundle di estensione sono già abilitati nel file host.json nella radice del progetto, che dovrebbe essere simile al seguente esempio:
{
"version": "2.0",
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[3.*, 4.0.0)"
}
}
È ora possibile aggiungere l'associazione di output storage al project.
Il progetto è stato configurato per l'uso dei bundle di estensione, che installano automaticamente un set predefinito di pacchetti di estensione.
I bundle di estensione sono già abilitati nel file host.json nella radice del progetto, che dovrebbe essere simile all'esempio seguente:
{
"version": "2.0",
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
}
}
},
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[4.*, 5.0.0)"
}
}
È ora possibile aggiungere l'associazione di output storage al project.
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 un binding di output
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: 'function', handler: () => {} }Aggiungere una funzione
output.storageQueuesopra la chiamataapp.httpconst sendToQueue = output.storageQueue({ queueName: 'outqueue', connection: 'AzureWebJobsStorage', });
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: 'function', handler: () => {} }Aggiungere una funzione
output.storageQueuesopra la chiamataapp.httpconst sendToQueue: StorageQueueOutput = output.storageQueue({ queueName: 'outqueue', connection: 'AzureWebJobsStorage', });
In Funzioni ogni tipo di associazione richiede un oggetto direction, type e name univoco. Il modo in cui si definiscono questi attributi dipende dal linguaggio dell'app per le funzioni.
Gli attributi di associazione vengono definiti nel file function.json per una determinata funzione. A seconda del tipo di binding, potrebbero essere necessarie altre proprietà. La configurazione di output queue descrive i campi necessari per un'associazione di accodamento Azure Storage. L'estensione semplifica l'aggiunta di binding nel file function.json.
Per creare un binding, fare clic con il pulsante destro del mouse (CTRL+clic in macOS) sul file function.json nella cartella HttpTrigger e scegliere Aggiungi binding. Seguire i prompt per definire le proprietà seguenti per il nuovo binding:
| Prompt | Valore | Descrizione |
|---|---|---|
| Selezionare la direzione di binding | out |
Il binding è un binding di output. |
| Selezionare il binding con indicazione della direzione... | Azure Queue Storage |
L'associazione è un'associazione di coda di Azure Storage. |
| Il nome usato per identificare questo binding nel codice | msg |
Nome che identifica il parametro di binding a cui viene fatto riferimento nel codice. |
| La coda a cui verrà inviato il messaggio | outqueue |
Il nome della coda in cui scrive il binding. Se queueName non esiste, il binding lo crea al primo utilizzo. |
| Selezionare l'impostazione da "local.setting.json" | AzureWebJobsStorage |
Nome di un'impostazione dell'applicazione contenente il connection string per l'account Storage. L'impostazione AzureWebJobsStorage contiene la stringa di connessione per l'account di archiviazione creato con l'applicazione di funzioni. |
Viene aggiunto un binding all'array bindings in function.json, che dovrà essere come indicato di seguito:
"name": "msg",
"queueName": "outqueue",
"connection": "AzureWebJobsStorage"
}
]
}
Gli attributi di associazione vengono definiti mediante la decorazione di codice di funzione specifico nel file function_app.py. Usi il decoratore queue_output per aggiungere un binding di output Azure Queue storage.
Usando il decorator queue_output, la direzione dell'associazione è implicitamente "out" e il tipo è Azure Storage Queue. Aggiungi il seguente decoratore al codice della funzione in function_app.py:
@app.queue_output(arg_name="msg", queue_name="outqueue", connection="AzureWebJobsStorage")
In questo codice, arg_name identifica il parametro di associazione cui si fa riferimento nel codice, queue_name è il nome della coda in cui scrive l'associazione e connection è il nome di un'impostazione dell'applicazione che contiene la stringa di connessione per l'account di archiviazione. Nell'avvio rapido si usa lo stesso account di archiviazione dell'app per le funzioni, che si trova nell'impostazione AzureWebJobsStorage. Se queue_name non esiste, il binding lo crea al primo utilizzo.
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. Anziché la stringa di connessione stessa, si passa l'impostazione dell'applicazione che contiene la stringa di connessione dell'account di archiviazione.
La definizione del metodo run dovrà ora essere come indicato nell'esempio seguente:
@FunctionName("HttpExample")
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) {
Aggiungere il codice che usa l'associazione di output
Dopo aver definito l'associazione, è possibile usare il name dell'associazione per accedervi come attributo nella firma della funzione. Usando un binding di output, non è necessario usare il codice SDK di Azure Storage 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.
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
})
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.
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 metodo run dovrà ora essere come indicato nell'esempio seguente:
@FunctionName("HttpExample")
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);
Eseguire la funzione in locale
Visual Studio Code si integra con Azure Functions Core tools per consentire di eseguire questo project nel computer di sviluppo locale prima di eseguire la pubblicazione in Azure. Se Core Tools non è già installato in locale, viene richiesto di installarlo la prima volta che si esegue il project.
Per chiamare la funzione, premere F5 per avviare il progetto dell'applicazione funzione. Il pannello Terminale visualizza l'output di Core Tools. L'app viene avviata nel pannello Terminale. È possibile visualizzare l'endpoint dell'URL della funzione attivata da HTTP eseguita in locale.
Se non hai già installato Core Tools, seleziona Installa per installare Core Tools quando ti viene richiesto di farlo.
In caso di problemi di esecuzione in Windows, assicurarsi che il terminale predefinito per Visual Studio Codice non sia impostato su WSL Bash.Con Core Tools in esecuzione, passare all'area Azure: Functions. Sotto Functions, espandi Local Project>Functions. Fare clic con il pulsante destro del mouse (Windows) o CTRL - (macOS) sulla funzione
HttpExamplee scegliere Execute Function Now... (Esegui funzione adesso).
In Immetti corpo della richiesta premere INVIO per inviare un messaggio di richiesta alla funzione.
Quando la funzione viene eseguita in locale e restituisce una risposta, viene generata una notifica in Visual Studio Codice. Le informazioni sull'esecuzione della funzione sono visualizzate nel riquadro Terminale.
Premere CTRL+C per arrestare Core Tools e disconnettere il debugger.
Eseguire la funzione in locale
Come nell'articolo precedente, premere F5 per avviare il progetto dell'app per le funzioni e gli strumenti principali.
Con Core Tools in esecuzione, passare all'area Azure: Functions. Sotto Functions, espandi Local Project>Functions. Fare clic con il pulsante destro del mouse (ctrl+clic su Mac) sulla funzione
HttpExamplee selezionare Esegui funzione ora.....
Nel Enter request body, è possibile vedere il valore del corpo del messaggio di richiesta di
{ "name": "Azure" }. Premere INVIO per inviare il messaggio di richiesta alla funzione.Dopo la restituzione di una risposta, premere CTRL+C per arrestare Core Tools.
Poiché si usa il storage connection string, la funzione si connette all'account Azure storage durante l'esecuzione in locale. Una nuova coda denominata outqueue viene creata nel tuo account di archiviazione dal runtime delle funzioni quando l'associazione di output viene utilizzata per la prima volta. Si userà Storage Explorer per verificare che la coda sia stata creata insieme al nuovo messaggio.
Connetti Storage Explorer al tuo account
Ignorare questa sezione se è già stato installato Azure Storage Explorer e connesso all'account Azure.
Eseguire lo strumento Azure Storage Explorer, selezionare l'icona di connessione a sinistra e selezionare Aggiungi un account.
Nella finestra di dialogo Connetti scegliere Aggiungi un account Azure scegliere l'ambiente Azure e quindi selezionare Accedere in... .
Dopo aver eseguito l'accesso al tuo account, vengono visualizzati tutti gli abbonamenti di Azure associati al tuo account. Scegliere la sottoscrizione e selezionare Apri Esplora risorse.
Esaminare la coda di output
In codice Visual Studio premere F1 per aprire il riquadro comandi, quindi cercare ed eseguire il comando
Azure Storage: Open in Storage Explorere scegliere il nome dell'account storage. L'account storage viene aperto nel Azure Storage Explorer.Espandere il nodo Code e quindi selezionare la coda denominata outqueue.
La coda contiene il messaggio creato dall'associazione di output della coda quando è stata eseguita la funzione attivata da HTTP. Se è stata richiamata la funzione con il valore predefinito
namedi Azure, il messaggio della coda viene Name passato alla funzione: Azure.
Eseguire di nuovo la funzione e inviare un'altra richiesta. Nella coda è visualizzato un nuovo messaggio.
È ora possibile ripubblicare l'app per le funzioni aggiornata per Azure.
Ridistribuire e verificare l'app aggiornata
In codice Visual Studio premere F1 per aprire il riquadro comandi. Nel riquadro comandi cercare e selezionare
Azure Functions: Deploy to function app....Scegliere l'app per le funzioni creata nel primo articolo. Poiché si ridistribuisce il project nella stessa app, selezionare Deploy per ignorare l'avviso relativo alla sovrascrittura dei file.
Al termine della distribuzione, è possibile usare di nuovo la funzione Execute Now... funzionalità per attivare la funzione in Azure. Questo comando recupera automaticamente la chiave di accesso della funzione e la usa quando si chiama l'endpoint di trigger HTTP.
Anche in questo caso visualizza il messaggio nella coda di archiviazione per verificare che l'associazione di output generi un nuovo messaggio nella coda.
Pulire le risorse
In Azure, risorse si riferiscono ad app per le funzioni, funzioni, account di archiviazione e così via. Le risorse sono raggruppate in gruppi di risorse, ed è possibile eliminare tutti gli elementi in un gruppo eliminando il gruppo.
Per completare queste guide di avvio rapido sono state create risorse. È possibile che vengano fatturate queste risorse, a seconda dello stato dell'account account e della tariffazione del servizio servizi. Se le risorse non sono più necessarie, ecco come eliminarle:
In codice Visual Studio premere F1 per aprire il riquadro comandi. Nel riquadro comandi cercare e selezionare
Azure: Open in portal.Scegliere l'app per le funzioni e premere INVIO. La pagina dell'app per le funzioni viene aperta nel Azure portal.
Nella scheda Panoramica selezionare il collegamento accanto a Gruppo di risorse.
Nella pagina Gruppo di risorse esaminare l'elenco delle risorse incluse e verificare che siano quelle da eliminare.
Selezionare Elimina gruppo di risorse e seguire le istruzioni.
L'eliminazione potrebbe richiedere alcuni minuti. Al termine, viene visualizzata una notifica per pochi secondi. È anche possibile selezionare l'icona a forma di campana nella parte superiore della pagina per visualizzare la notifica.
Passaggi successivi
Hai aggiornato la tua funzione attivata da HTTP per scrivere dati in una coda di archiviazione Storage. Ora puoi approfondire lo sviluppo di funzioni usando Visual Studio Code:
Informazioni di riferimento per sviluppatori Azure Functions C#