Dela via


Ansluta Azure Functions till Azure Cosmos DB med Hjälp av Visual Studio Code

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

Den här artikeln visar hur du använder Visual Studio Code för att ansluta Azure Cosmos DB till den funktion 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 JSON-dokument som lagras i en Azure Cosmos DB-container.

Innan du börjar måste du slutföra snabbstarten : Skapa en C#-funktion i Azure med hjälp av Visual Studio Code. Om du redan har rensat resurser i slutet av den artikeln går du igenom stegen igen för att återskapa funktionsappen och relaterade resurser i Azure.

Innan du börjar måste du slutföra snabbstarten : Skapa en JavaScript-funktion i Azure med hjälp av Visual Studio Code. Om du redan har rensat resurser i slutet av den artikeln går du igenom stegen igen för att återskapa funktionsappen och relaterade resurser i Azure.

Kommentar

Den här artikeln stöder för närvarande endast Node.js v3 för Functions.

Innan du börjar måste du slutföra snabbstarten : Skapa en Python-funktion i Azure med hjälp av Visual Studio Code. Om du redan har rensat resurser i slutet av den artikeln går du igenom stegen igen för att återskapa funktionsappen och relaterade resurser i Azure.

Konfigurera din miljö

Innan du kommer igång måste du installera Azure Databases-tillägget för Visual Studio Code.

Skapa ditt Azure Cosmos DB-konto

Nu skapar du ett Azure Cosmos DB-konto som en serverlös kontotyp. Det här förbrukningsbaserade läget gör Azure Cosmos DB till ett starkt alternativ för serverlösa arbetsbelastningar.

  1. I Visual Studio Code väljer du Visa>kommandopalett... och sedan i kommandopaletten sök efter Azure Databases: Create Server...

  2. Ange följande information i meddelanderutorna:

    Prompt Urval
    Välj en Azure Database Server Välj Core (NoSQL) för att skapa en dokumentdatabas som du kan köra frågor mot med hjälp av en SQL-syntax eller en Query Copilot (förhandsversion) som konverterar frågor till naturligt språk. Läs mer om Azure Cosmos DB.
    Kontonamn Ange ett unikt namn som identifierar ditt Azure Cosmos DB-konto. Kontonamnet kan bara använda gemener, siffror och bindestreck (-) och måste vara mellan 3 och 31 tecken långt.
    Välj en kapacitetsmodell Välj Serverlös för att skapa ett konto i serverlöst läge.
    Välj en resursgrupp för nya resurser Välj den resursgrupp där du skapade funktionsappen i föregående artikel.
    Välj en plats för nya resurser Välj en geografisk plats som värd för ditt Azure Cosmos DB-konto. Använd den plats som är närmast dig eller dina användare för att få snabbast åtkomst till dina data.

    När ditt nya konto har etablerats visas ett meddelande i meddelandefältet.

Skapa en Azure Cosmos DB-databas och container

  1. Välj Azure-ikonen i aktivitetsfältet, expandera Resurser>Azure Cosmos DB, högerklicka (Ctrl+välj på macOS) ditt konto och välj Skapa databas....

  2. Ange följande information i meddelanderutorna:

    Prompt Urval
    Databasnamn Skriv my-database.
    Ange och ID för din samling Skriv my-container.
    Ange partitionsnyckeln för samlingen Skriv /id som partitionsnyckel.
  3. Välj OK för att skapa containern och databasen.

Uppdatera inställningarna för funktionsappen

I föregående snabbstartsartikel skapade du en funktionsapp i Azure. I den här artikeln uppdaterar du appen så att den skriver JSON-dokument till den Azure Cosmos DB-container som du har skapat. Om du vill ansluta till ditt Azure Cosmos DB-konto måste du lägga till dess anslutningssträng i appinställningarna. Sedan laddar du ned den nya inställningen till din local.settings.json-fil så att du kan ansluta till ditt Azure Cosmos DB-konto när du kör lokalt.

  1. I Visual Studio Code högerklickar du (Ctrl+välj på macOS) på ditt nya Azure Cosmos DB-konto och väljer Kopiera anslutningssträng.

    Kopiera Azure Cosmos DB-anslutningssträng

  2. Tryck på F1 för att öppna kommandopaletten och sök sedan efter och kör kommandot Azure Functions: Add New Setting....

  3. Välj den funktionsapp som du skapade i föregående artikel. Ange följande information i meddelanderutorna:

    Prompt Urval
    Ange nytt appinställningsnamn Skriv CosmosDbConnectionSetting.
    Ange värdet för "CosmosDbConnectionSetting" Klistra in anslutningssträng för ditt Azure Cosmos DB-konto som du kopierade. Du kan också konfigurera Microsoft Entra-identitet som ett alternativ.

    Då skapas en programinställning med namnet connection CosmosDbConnectionSetting i funktionsappen i Azure. Nu kan du ladda ned den här inställningen till din local.settings.json-fil.

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

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

Detta laddar ned alla inställningar från Azure till ditt lokala projekt, inklusive den nya inställningen anslutningssträng. De flesta av de nedladdade inställningarna används inte när de körs lokalt.

Registrera bindningstillägg

Eftersom du använder en Azure Cosmos DB-utdatabindning måste du ha motsvarande bindningstillägg installerat innan du kör projektet.

Förutom 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 Azure Cosmos DB-tilläggspaketet i projektet.

dotnet add package Microsoft.Azure.Functions.Worker.Extensions.CosmosDB

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

Användning av tilläggspaket aktiveras i host.json-filen i projektets rot, vilket visas på följande sätt:

{
  "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request"
      }
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 5.0.0)"
  },
  "concurrency": {
    "dynamicConcurrencyEnabled": true,
    "snapshotPersistenceEnabled": true
  },
  "extensions": {
    "cosmosDB": {
      "connectionMode": "Gateway"
    }
  }
}

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

Användning av tilläggspaket aktiveras i host.json-filen i projektets rot, vilket visas på följande sätt:

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

Nu kan du lägga till Azure Cosmos DB-utdatabindningen i projektet.

Lägg till en utdatabindning

I ett C#-klassbiblioteksprojekt definieras bindningarna som bindningsattribut för funktionsmetoden.

Öppna HttpExample.cs projektfilen och lägg till följande klasser:

public class MultiResponse
{
    [CosmosDBOutput("my-database", "my-container",
        Connection = "CosmosDbConnectionSetting", CreateIfNotExists = true)]
    public MyDocument Document { get; set; }
    public HttpResponseData HttpResponse { get; set; }
}
public class MyDocument {
    public string id { get; set; }
    public string message { get; set; }
}

Klassen MyDocument definierar ett objekt som skrivs till databasen. Anslutningssträng för lagringskontot anges av egenskapen Connection . I det här fallet kan du utelämna Connection eftersom du redan använder standardlagringskontot.

Med MultiResponse klassen kan du både skriva till den angivna samlingen i Azure Cosmos DB och returnera ett HTTP-meddelande. Eftersom du måste returnera ett MultiResponse objekt måste du även uppdatera metodsignaturen.

Specifika attribut anger namnet på containern och namnet på den överordnade databasen. Anslutningssträng för ditt Azure Cosmos DB-konto anges av CosmosDbConnectionSetting.

Bindningsattribut definieras direkt i funktionskoden. Azure Cosmos DB-utdatakonfigurationen beskriver de fält som krävs för en Azure Cosmos DB-utdatabindning.

I det här MultiResponse scenariot måste du lägga till en extraOutputs utdatabindning till funktionen.

app.http('HttpExample', {
  methods: ['GET', 'POST'],
  extraOutputs: [sendToCosmosDb],
  handler: async (request, context) => {

Lägg till följande egenskaper i bindningskonfigurationen:

const sendToCosmosDb = output.cosmosDB({
  databaseName: 'my-database',
  containerName: 'my-container',
  createIfNotExists: false,
  connection: 'CosmosDBConnectionString',
});

Bindningsattribut definieras direkt i function_app.py-filen. Du använder dekoratören cosmos_db_output för att lägga till en Azure Cosmos DB-utdatabindning:

@app.cosmos_db_output(arg_name="outputDocument", database_name="my-database", 
    container_name="my-container", connection="CosmosDbConnectionSetting")

I den här koden arg_name identifierar du bindningsparametern som refereras till i koden och database_name container_name är de databas- och samlingsnamn som bindningen skriver till, och connection är namnet på en programinställning som innehåller anslutningssträng för Azure Cosmos DB-kontot, som finns i CosmosDbConnectionSetting inställningen i local.settings.json-filen.

Lägg till kod som använder utdatabindning

Ersätt den befintliga Kör-metoden med följande kod:

[Function("HttpExample")]
public static MultiResponse Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req,
    FunctionContext executionContext)
{
    var logger = executionContext.GetLogger("HttpExample");
    logger.LogInformation("C# HTTP trigger function processed a request.");

    var message = "Welcome to Azure Functions!";

    var response = req.CreateResponse(HttpStatusCode.OK);
    response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
    response.WriteString(message);

    // Return a response to both HTTP trigger and Azure Cosmos DB output binding.
    return new MultiResponse()
    {
         Document = new MyDocument
        {
            id = System.Guid.NewGuid().ToString(),
            message = message
        },
        HttpResponse = response
    };
}

Lägg till kod som använder utdatabindningsobjektet extraInputscontext för att skicka ett JSON-dokument till den namngivna utdatabindningsfunktionen. sendToCosmosDb Lägg till den här koden före -instruktionen return .

context.extraOutputs.set(sendToCosmosDb, {
  // create a random ID
  id:
    new Date().toISOString() + Math.random().toString().substring(2, 10),
  name: name,
});

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

const { app, output } = require('@azure/functions');

const sendToCosmosDb = output.cosmosDB({
  databaseName: 'my-database',
  containerName: 'my-container',
  createIfNotExists: false,
  connection: 'CosmosDBConnectionString',
});

app.http('HttpExampleToCosmosDB', {
  methods: ['GET', 'POST'],
  extraOutputs: [sendToCosmosDb],
  handler: async (request, context) => {
    try {
      context.log(`Http function processed request for url "${request.url}"`);

      const name = request.query.get('name') || (await request.text());

      if (!name) {
        return { status: 404, body: 'Missing required data' };
      }

      // Output to Database
      context.extraOutputs.set(sendToCosmosDb, {
        // create a random ID
        id:
          new Date().toISOString() + Math.random().toString().substring(2, 10),
        name: name,
      });

      const responseMessage = name
        ? 'Hello, ' +
          name +
          '. This HTTP triggered function executed successfully.'
        : 'This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.';

      // Return to HTTP client
      return { body: responseMessage };
    } catch (error) {
      context.log(`Error: ${error}`);
      return { status: 500, body: 'Internal Server Error' };
    }
  },
});

Den här koden returnerar nu ett MultiResponse objekt som innehåller både ett dokument och ett HTTP-svar.

Uppdatera HttpExample\function_app.py för att matcha följande kod. Lägg till parametern outputDocument i funktionsdefinitionen och outputDocument.set() under -instruktionen if name: :

import azure.functions as func
import logging

app = func.FunctionApp()

@app.function_name(name="HttpTrigger1")
@app.route(route="hello", auth_level=func.AuthLevel.ANONYMOUS)
@app.queue_output(arg_name="msg", queue_name="outqueue", connection="AzureWebJobsStorage")
@app.cosmos_db_output(arg_name="outputDocument", database_name="my-database", container_name="my-container", connection="CosmosDbConnectionSetting")
def test_function(req: func.HttpRequest, msg: func.Out[func.QueueMessage],
    outputDocument: func.Out[func.Document]) -> func.HttpResponse:
     logging.info('Python HTTP trigger function processed a request.')
     logging.info('Python Cosmos DB 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:
        outputDocument.set(func.Document.from_dict({"id": 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
                )

Dokumentet {"id": "name"} skapas i den databassamling som anges i bindningen.

Kör funktionen lokalt

Visual Studio Code integreras med Azure Functions Core-verktyg så att du kan köra det här projektet på din lokala utvecklingsdator innan du publicerar till Azure. Om du inte redan har Core Tools installerat lokalt uppmanas du att installera det första gången du kör projektet.

  1. Om du vill anropa funktionen trycker du på F5 för att starta funktionsappprojektet. Terminalpanelen visar utdata från Core Tools. Appen startar i terminalpanelen . Du kan se URL-slutpunkten för din HTTP-utlösta funktion som körs lokalt.

    Skärmbild av Visual Studio Code-utdata för den lokala funktionen.

    Om du inte redan har Core Tools installerat väljer du Installera för att installera Core Tools när du uppmanas att göra det.
    Om du har problem med att köra windows kontrollerar du att standardterminalen för Visual Studio Code inte är inställd på WSL Bash.

  2. När Core Tools körs går du till området Azure: Functions . Under Funktioner expanderar du Lokala projektfunktioner>. Högerklicka (Windows) eller Ctrl – klicka (macOS) på HttpExample funktionen och välj Kör funktion nu....

    Skärmbild av körningsfunktionen nu från Visual Studio Code.

  3. I brödtexten Ange begäran trycker du på Retur för att skicka ett meddelande om begäran till din funktion.

  4. När funktionen körs lokalt och returnerar ett svar genereras ett meddelande i Visual Studio Code. Information om funktionskörningen visas i terminalpanelen .

  5. Tryck på Ctrl + C för att stoppa Core Tools och koppla från felsökningsprogrammet.

Kör funktionen lokalt

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

  2. När Core Tools körs går du till området Azure: Functions . Under Funktioner expanderar du Lokala projektfunktioner>. Högerklicka (Ctrl-klicka på Mac) HttpExample funktionen 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 på { "name": "Azure" }. Tryck på Retur för att skicka det här begärandemeddelandet till din funktion.

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

Kontrollera att ett JSON-dokument har skapats

  1. På Azure Portal går du tillbaka till ditt Azure Cosmos DB-konto och väljer Datautforskaren.

  2. Expandera databasen och containern och välj Objekt för att visa de dokument som skapats i containern.

  3. Kontrollera att ett nytt JSON-dokument har skapats av utdatabindningen.

    Verifiera att ett nytt dokument har skapats i Azure Cosmos DB-containern

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 funktion nu... igen för att utlösa funktionen i Azure.

  4. Kontrollera igen dokumenten som skapats i Azure Cosmos DB-containern för att kontrollera att utdatabindningen genererar ett nytt JSON-dokument igen.

Rensa resurser

I Azure refererar resurser till funktionsappar, funktioner, lagringskonton och så vidare. De är grupperade 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. Du kan debiteras för dessa resurser, beroende på kontostatus och tjänstpriser. 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 kommandopaletten. I kommandopaletten söker du efter och väljer Azure: Open in portal.

  2. Välj din funktionsapp och tryck på Retur. Funktionsappsidan öppnas i Azure Portal.

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

    Skärmbild av välj den resursgrupp som ska tas bort från funktionsappsidan.

  4. På sidan Resursgrupp granskar du listan över inkluderade resurser och kontrollerar att det är de som du vill ta bort.

  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 högst upp på sidan för att se meddelandet.

Nästa steg

Du har uppdaterat din HTTP-utlösta funktion för att skriva JSON-dokument till en Azure Cosmos DB-container. Nu kan du lära dig mer om att utveckla Funktioner med Hjälp av Visual Studio Code: