Ansluta Azure Functions till Azure Storage med Visual Studio Code

Med Azure Functions kan du ansluta Azure-tjänster och andra resurser till funktioner utan att behöva skriva din egen integrerings kod. Dessa bindningar, som representerar både indata och utdata, deklareras i funktions definitionen. Data från bindningar skickas som parametrar till funktionen. En utlösare är en särskild typ av ingående bindning. Även om en funktion bara har en utlösare, kan den ha flera indata och utdata-bindningar. Mer information finns i Azure Functions utlösare och bindningar begrepp.

Den här artikeln visar hur du använder Visual Studio Code för att Azure Storage till funktionen som du skapade i föregående snabbstartsartikel. Den utdatabindning som du lägger till i den här funktionen skriver data från HTTP-begäran till ett meddelande i en Azure Queue Storage-kö.

De flesta bindningar kräver en lagrad anslutningssträng som Functions använder för att få åtkomst till den bundna tjänsten. För att göra det enklare använder du lagringskontot som du skapade med funktionsappen. Anslutningen till det här kontot lagras redan i en appinställning med namnet AzureWebJobsStorage .

Konfigurera din lokala miljö

Innan du börjar den här artikeln måste du uppfylla följande krav:

Den här artikeln förutsätter att du redan är inloggad på din Azure-prenumeration från Visual Studio Code. Du kan logga in genom att köra Azure: Sign In från kommandopaletten.

Ladda ned funktionsappens inställningar

I den föregående snabbstartsartikelnskapade du en funktionsapp i Azure tillsammans med det lagringskonto som krävs. Anslutningssträngen för det här kontot lagras säkert i appinställningarna i Azure. I den här artikeln skriver du meddelanden till en Storage-kö i samma konto. Om du vill ansluta till ditt Lagringskonto när du kör funktionen lokalt måste du ladda ned appinställningarna till local.settings.jspå filen.

  1. Tryck på F1 för att öppna kommandopaletten och sök sedan efter och kör kommandot Azure Functions: Download Remote Settings.... .

  2. Välj den funktionsapp som du skapade i föregående artikel. Välj Ja om du vill skriva över de befintliga lokala inställningarna.

    Viktigt

    Eftersom den innehåller hemligheter publiceras local.settings.jspå filen aldrig och undantas från källkontrollen.

  3. Kopiera värdet AzureWebJobsStorage , som är nyckeln för värdet för anslutningssträngen för lagringskontot. Du använder den här anslutningen för att kontrollera att utdatabindningen fungerar som förväntat.

Registrera bindningstillägg

Eftersom du använder en Queue Storage-utdatabindning måste du ha tillägget Storage-bindningar installerat innan du kör projektet.

Projektet har konfigurerats för att använda tilläggspaketet, som automatiskt installerar en fördefinierad uppsättning tilläggspaket.

Användning av tilläggspaketet är aktiverat i host.jspå filen i projektets rot, vilket visas på följande sätt:

{
  "version": "2.0",
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[1.*, 2.0.0)"
  } 
}

Med undantag för HTTP- och timerutlösare implementeras bindningar som tilläggspaket. Kör följande dotnet add package-kommando i terminalfönstret för att lägga till Storage-tilläggspaketet i projektet.

dotnet add package Microsoft.Azure.WebJobs.Extensions.Storage

Nu kan du lägga till lagringsutdatabindningen i projektet.

Lägg till en utdatabindning

I Functions kräver varje typ av bindning en direction , och en unik för att type name definieras i function.jspå filen. Hur du definierar dessa attribut beror på funktionsappens språk.

Binding-attribut definieras direkt i function.jsi filen. Beroende på bindnings typen kan ytterligare egenskaper krävas. I kös Ekö konfigurationen beskrivs de fält som krävs för en Azure Storage Queue-bindning. Tillägget gör det enkelt att lägga till bindningar till function.jsi filen.

Om du vill skapa en bindning högerklickar du på (Ctrl + klicka på macOS) function.json filen i mappen HttpTrigger och väljer Lägg till bindning.... Följ anvisningarna för att definiera följande bindnings egenskaper för den nya bindningen:

Prompt Värde Beskrivning
Välj bindnings riktning out Bindningen är en utgående bindning.
Välj bindning med riktning... Azure Queue Storage Bindningen är en Azure Storage Queue-bindning.
Namnet som används för att identifiera den här bindningen i din kod msg Namn som identifierar den bindnings parameter som refereras till i din kod.
Kön som meddelandet ska skickas till outqueue Namnet på kön som bindningen skriver till. När queueName inte finns skapar bindningen den när den används första gången.
Välj inställning från "local.setting.jspå" AzureWebJobsStorage Namnet på en program inställning som innehåller anslutnings strängen för lagrings kontot. AzureWebJobsStorageInställningen innehåller anslutnings strängen för det lagrings konto som du skapade med Function-appen.

En bindning läggs till bindings i matrisen i function.jspå, vilket bör se ut så här:

{
  "type": "queue",
  "direction": "out",
  "name": "msg",
  "queueName": "outqueue",
  "connection": "AzureWebJobsStorage"
}

I ett C#-projekt definieras bindningarna som bindningsattribut för funktionsmetoden. Specifika definitioner beror på om din app körs i processen (C#-klassbiblioteket) eller i en isolerad process.

Öppna projektfilen HttpExample.cs och lägg till följande parameter i Run metoddefinitionen:

[Queue("outqueue"),StorageAccount("AzureWebJobsStorage")] ICollector<string> msg,

Parametern msg är en typ som representerar en samling meddelanden som skrivs till en ICollector<T> utdatabindning när funktionen har slutförts. I det här fallet är utdata en lagringskö med namnet outqueue . Anslutningssträngen för Storage-kontot anges av StorageAccountAttribute . Det här attributet anger inställningen som innehåller Storage-kontoanslutningssträngen och kan tillämpas på klass-, metod- eller parameternivå. I det här fallet kan du utelämna eftersom StorageAccountAttribute du redan använder standardlagringskontot.

Definitionen av run-metoden bör nu se ut så här:

[FunctionName("HttpExample")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, 
    [Queue("outqueue"),StorageAccount("AzureWebJobsStorage")] ICollector<string> msg, 
    ILogger log)

I ett Java-projekt definieras bindningarna som bindnings anteckningar i funktions metoden. function.js filen skapas sedan automatiskt baserat på dessa anteckningar.

Bläddra till platsen för funktions koden under src/main/Java, öppna filen Function. java -projekt och Lägg till följande parameter i run metod definitionen:

@QueueOutput(name = "msg", queueName = "outqueue", 
connection = "AzureWebJobsStorage") OutputBinding<String> msg,

msgParametern är en OutputBinding<T> typ som representerar en samling strängar som skrivs som meddelanden till en utgående bindning när funktionen slutförs. I det här fallet är utdata en lagrings kö med namnet outqueue . Anslutnings strängen för lagrings kontot anges av- connection metoden. I stället för själva anslutnings strängen skickar du den program inställning som innehåller anslutnings strängen för lagrings kontot.

runMetod definitionen bör nu se ut som i följande exempel:

@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) {

Lägg till kod som använder utdatabindning

När bindningen har definierats kan du använda för name bindningen för att komma åt den som ett attribut i funktionssignaturen. Genom att använda en utdatabindning behöver du inte använda SDK Azure Storage koden för autentisering, hämta en köreferens eller skriva data. Functions-körnings- och köutdatabindningen utför dessa uppgifter åt dig.

Lägg till kod som använder msg objektet utgående bindning på context.bindings för att skapa ett köat meddelande. Lägg till den här koden före context.res instruktionen.

// Add a message to the Storage queue,
// which is the name passed to the function.
context.bindings.msg = (req.query.name || req.body.name);

I det här läget bör din funktion se ut så här:

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    if (req.query.name || (req.body && req.body.name)) {
        // Add a message to the Storage queue,
        // which is the name passed to the function.
        context.bindings.msg = (req.query.name || req.body.name);
        context.res = {
            // status: 200, /* Defaults to 200 */
            body: "Hello " + (req.query.name || req.body.name)
        };
    }
    else {
        context.res = {
            status: 400,
            body: "Please pass a name on the query string or in the request body"
        };
    }
};

Lägg till kod som använder msg objektet utgående bindning på context.bindings för att skapa ett köat meddelande. Lägg till den här koden före context.res instruktionen.

context.bindings.msg = name;

I det här läget bör din funktion se ut så här:

import { AzureFunction, Context, HttpRequest } from "@azure/functions"

const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
    context.log('HTTP trigger function processed a request.');
    const name = (req.query.name || (req.body && req.body.name));

    if (name) {
        // Add a message to the storage queue, 
        // which is the name passed to the function.
        context.bindings.msg = name; 
        // Send a "hello" response.
        context.res = {
            // status: 200, /* Defaults to 200 */
            body: "Hello " + (req.query.name || req.body.name)
        };
    }
    else {
        context.res = {
            status: 400,
            body: "Please pass a name on the query string or in the request body"
        };
    }
};

export default httpTrigger;

Lägg till kod som använder Push-OutputBinding cmdleten för att skriva text till kön med hjälp av msg utgående bindning. Lägg till den här koden innan du anger statusen OK i if instruktionen.

$outputMsg = $name
Push-OutputBinding -name msg -Value $outputMsg

I det här läget bör din funktion se ut så här:

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
})

Uppdatera HttpExample \ _ _ init _ _ .py så att den matchar följande kod och lägg till msg parametern i funktionsdefinitionen msg.set(name) och under -instruktionen. if name:

import logging

import azure.functions as func


def main(req: func.HttpRequest, msg: func.Out[func.QueueMessage]) -> str:

    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}!")
    else:
        return func.HttpResponse(
            "Please pass a name on the query string or in the request body",
            status_code=400
        )

Parametern msg är en instans av azure.functions.Out class . Dess set -metod skriver ett strängmeddelande till kön, i det här fallet det namn som skickas till funktionen i URL-frågesträngen.

Lägg till kod som använder msg utdatabindningsobjektet för att skapa ett kömeddelande. Lägg till den här koden innan metoden returnerar.

if (!string.IsNullOrEmpty(name))
{
    // Add a message to the output collection.
    msg.Add(string.Format("Name passed to the function: {0}", name));
}

Nu bör funktionen se ut så här:

[FunctionName("HttpExample")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, 
    [Queue("outqueue"),StorageAccount("AzureWebJobsStorage")] ICollector<string> msg, 
    ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string name = req.Query["name"];

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic data = JsonConvert.DeserializeObject(requestBody);
    name = name ?? data?.name;

    if (!string.IsNullOrEmpty(name))
    {
        // Add a message to the output collection.
        msg.Add(string.Format("Name passed to the function: {0}", name));
    }
    return name != null
        ? (ActionResult)new OkObjectResult($"Hello, {name}")
        : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}

Nu kan du använda den nya msg parametern för att skriva till utgående bindning från din funktions kod. Lägg till följande kodrad innan du lyckas med att lägga till värdet för name i msg utmatnings bindningen.

msg.setValue(name);

När du använder en utgående bindning behöver du inte använda Azure Storage SDK-koden för autentisering, hämta en referens till kön eller skriva data. Bindningarna Functions Runtime och Queue output utför dessa uppgifter åt dig.

runMetoden bör nu se ut som i följande exempel:

@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();
    }
}

Uppdatera testerna

Eftersom archetype också skapar en uppsättning tester måste du uppdatera de här testerna för att hantera den nya msg parametern i run Metodsignaturen.

Bläddra till platsen för test koden under src/test/java, öppna filen Function. java -projekt och ersätt kodraden under //Invoke med följande kod.

@SuppressWarnings("unchecked")
final OutputBinding<String> msg = (OutputBinding<String>)mock(OutputBinding.class);
final HttpResponseMessage ret = new Function().run(req, msg, context);

Köra funktionen lokalt

  1. Precis som i föregående artikel trycker du på F5 för att starta funktionsappsprojektet och Core Tools.

  2. När Core Tools är igång går du till området Azure: Funktioner. Under Funktioner expanderar du Lokala > projektfunktioner. Högerklicka (Ctrl-klicka på Mac) på funktionen HttpExample och välj Kör funktion nu....

    Kör funktionen nu från Visual Studio Code

  3. I Ange begärandetext visas brödtextvärdet för begärandemeddelandet. { "name": "Azure" } Tryck på Retur för att skicka det här begärandemeddelandet till din funktion.

  4. När ett svar returneras trycker du på Ctrl + C för att stoppa Core Tools.

Eftersom du använder lagringsanslutningssträngen ansluter funktionen till Azure Storage-kontot när den körs lokalt. En ny kö med namnet outqueue skapas i ditt lagringskonto av Functions-körningen när utdatabindningen används för första gången. Du använder den Storage Explorer för att kontrollera att kön har skapats tillsammans med det nya meddelandet.

Anslut Storage Explorer till ditt konto

Hoppa över det här avsnittet om du redan har Azure Storage Explorer och anslutit den till ditt Azure-konto.

  1. Kör Azure Storage Explorer, välj anslutningsikonen till vänster och välj Lägg till ett konto.

    Lägga till ett Azure-konto i Microsoft Azure Storage Explorer

  2. I dialogrutan Anslut väljer du Lägg till ett Azure-konto, väljer din Azure-miljö och sedan Logga in....

    Logga in på ditt Azure-konto

När du har loggat in på ditt konto visas alla Azure-prenumerationer som är kopplade till ditt konto.

Granska utdatakö

  1. I Visual Studio Code trycker du på F1 för att öppna kommandopaletten. Sök sedan efter och kör kommandot och Azure Storage: Open in Storage Explorer välj namnet på ditt lagringskonto. Ditt lagringskonto öppnas i Azure Storage Explorer.

  2. Expandera noden Köer och välj sedan kön med namnet outqueue.

    Kön innehåller meddelandet som köutdatabindningen skapade när du körde den HTTP-utlösta funktionen. Om du startade en funktion med standardvärdet name för Azure så är kömeddelandet Name passed to the function: Azure (Namn som skickats till funktionen: Azure).

    Kömeddelande som visas i Azure Storage Explorer

  3. Kör funktionen igen, skicka en till begäran så visas ett nytt meddelande i kön.

Nu är det dags att publicera om den uppdaterade funktionsappen till Azure.

Distribuera om och verifiera den uppdaterade appen

  1. I Visual Studio Code trycker du på F1 för att öppna kommandopaletten. I kommandopaletten söker du efter och väljer Azure Functions: Deploy to function app... .

  2. Välj den funktionsapp som du skapade i den första artikeln. Eftersom du distribuerar om projektet till samma app väljer du Distribuera för att stänga varningen om att skriva över filer.

  3. När distributionen är klar kan du använda funktionen Kör nu... igen för att utlösa funktionen i Azure.

  4. Visa meddelandet i lagringskön igen för att verifiera att utdatabindningen genererar ett nytt meddelande i kön.

Rensa resurser

I Azure refererar resurser till funktionsappar, funktioner, lagringskonton och så vidare. De grupperas i resursgrupper och du kan ta bort allt i en grupp genom att ta bort gruppen.

Du skapade resurser för att slutföra de här snabbstarterna. Det är möjligt att du debiteras för de här resurserna beroende på din kontostatus och dina servicepriser. Om du inte behöver resurserna längre så visar vi hur du tar bort dem här:

  1. I Visual Studio Code, trycker du på F1 för att öppna kommando paletten. I paletten kommando söker du efter och väljer Azure Functions: Open in portal .

  2. Välj Function-appen och tryck på RETUR. Sidan Function-appen öppnas i Azure Portal.

  3. På fliken Översikt väljer du den namngivna länken bredvid resurs grupp.

    Välj den resursgrupp som du vill ta bort från sidan för funktionsappar.

  4. Granska listan över resurser som ingår och verifiera att det är dem som du vill ta bort på sidan Resursgrupp.

  5. Välj Ta bort resursgrupp och följ instruktionerna.

    Borttagningen kan ta några minuter. När du är färdig visas ett meddelande i några sekunder. Du kan även välja klockikonen längst upp på sidan för att se meddelandet.

Nästa steg

Du har uppdaterat din HTTP-utlösta funktion för att skriva data till en Storage-kö. Nu kan du lära dig mer om att utveckla Funktioner med Visual Studio Code: