Połączenie usługi Azure Functions do usługi Azure SQL Database przy użyciu programu Visual Studio Code

Usługa Azure Functions umożliwia łączenie usług platformy Azure i innych zasobów z funkcjami bez konieczności pisania własnego kodu integracji. Te powiązania, które reprezentują zarówno dane wejściowe, jak i wyjściowe, są deklarowane w definicji funkcji. Dane z powiązań są podawane do funkcji jako parametry. Wyzwalacz to specjalny typ powiązania wejściowego. Chociaż funkcja ma tylko jeden wyzwalacz, może mieć wiele powiązań wejściowych i wyjściowych. Aby dowiedzieć się więcej, zobacz Pojęcia dotyczące wyzwalaczy i powiązań usługi Azure Functions.

W tym artykule pokazano, jak używać programu Visual Studio Code do łączenia usługi Azure SQL Database z funkcją utworzoną w poprzednim artykule Szybki start. Powiązanie wyjściowe dodawane do tej funkcji zapisuje dane z żądania HTTP do tabeli w usłudze Azure SQL Database.

Przed rozpoczęciem należy ukończyć przewodnik Szybki start: tworzenie funkcji języka C# na platformie Azure przy użyciu programu Visual Studio Code. Jeśli zasoby zostały już wyczyszczone na końcu tego artykułu, wykonaj kroki ponownie, aby ponownie utworzyć aplikację funkcji i powiązane zasoby na platformie Azure.

Przed rozpoczęciem należy ukończyć przewodnik Szybki start: tworzenie funkcji JavaScript na platformie Azure przy użyciu programu Visual Studio Code. Jeśli zasoby zostały już wyczyszczone na końcu tego artykułu, wykonaj kroki ponownie, aby ponownie utworzyć aplikację funkcji i powiązane zasoby na platformie Azure.

Przed rozpoczęciem należy ukończyć przewodnik Szybki start: tworzenie funkcji języka Python na platformie Azure przy użyciu programu Visual Studio Code. Jeśli zasoby zostały już wyczyszczone na końcu tego artykułu, wykonaj kroki ponownie, aby ponownie utworzyć aplikację funkcji i powiązane zasoby na platformie Azure.

Więcej informacji na temat ustawień powiązań i wyzwalacza usługi Azure SQL dla usługi Azure Functions można znaleźć w dokumentacji usługi Azure Functions.

Tworzenie usługi Azure SQL Database

  1. Postępuj zgodnie z przewodnikiem Szybki start tworzenia usługi Azure SQL Database, aby utworzyć bezserwerową bazę danych Azure SQL Database. Baza danych może być pusta lub utworzona na podstawie przykładowego zestawu danych AdventureWorksLT.

  2. Podaj następujące informacje po wyświetleniu monitów:

    Monit Wybór
    Grupa zasobów: Wybierz grupę zasobów, w której utworzono aplikację funkcji w poprzednim artykule.
    Nazwa bazy danych Wprowadź mySampleDatabase.
    Nazwa serwera Wprowadź unikatową nazwę serwera. Nie można podać dokładnej nazwy serwera do użycia, ponieważ nazwy serwerów muszą być globalnie unikatowe dla wszystkich serwerów na platformie Azure, a nie tylko w ramach subskrypcji.
    Metoda uwierzytelniania Wybierz pozycję Uwierzytelnianie programu SQL Server.
    Identyfikator logowania administratora serwera Wprowadź azureuser.
    Hasło Wprowadź hasło spełniające wymagania dotyczące złożoności.
    Zezwalaj usługom i zasobom platformy Azure na dostęp do tego serwera Wybierz opcję Tak.
  3. Po zakończeniu tworzenia przejdź do bloku bazy danych w witrynie Azure Portal, a następnie w obszarze Ustawienia wybierz pozycję ciągi Połączenie ion. Skopiuj ADO.NET parametry połączenia na potrzeby uwierzytelniania SQL. Wklej parametry połączenia do tymczasowego dokumentu do późniejszego użycia.

    Zrzut ekranu przedstawiający kopiowanie parametry połączenia usługi Azure SQL Database w witrynie Azure Portal.

  4. Utwórz tabelę do przechowywania danych z żądania HTTP. W witrynie Azure Portal przejdź do bloku bazy danych i wybierz pozycję Edytor zapytań. Wprowadź następujące zapytanie, aby utworzyć tabelę o nazwie dbo.ToDo:

    CREATE TABLE dbo.ToDo (
        [Id] UNIQUEIDENTIFIER PRIMARY KEY,
        [order] INT NULL,
        [title] NVARCHAR(200) NOT NULL,
        [url] NVARCHAR(200) NOT NULL,
        [completed] BIT NOT NULL
    );
    
  5. Sprawdź, czy funkcja platformy Azure będzie mogła uzyskać dostęp do usługi Azure SQL Database, sprawdzając ustawienia zapory serwera. Przejdź do bloku serwera w witrynie Azure Portal, a następnie w obszarze Zabezpieczenia wybierz pozycję Sieć. Należy sprawdzić wyjątek Zezwalaj usługom i zasobom platformy Azure na dostęp do tego serwera .

    Zrzut ekranu przedstawiający sprawdzanie ustawień zapory usługi Azure SQL Database w witrynie Azure Portal.

Aktualizowanie ustawień aplikacji funkcji

W poprzednim artykule Szybki start utworzono aplikację funkcji na platformie Azure. W tym artykule zaktualizujesz aplikację, aby zapisywała dane w właśnie utworzonej usłudze Azure SQL Database. Aby nawiązać połączenie z usługą Azure SQL Database, musisz dodać jej parametry połączenia do ustawień aplikacji. Następnie pobierz nowe ustawienie do pliku local.settings.json, aby można było nawiązać połączenie z usługą Azure SQL Database podczas uruchamiania lokalnego.

  1. Edytuj parametry połączenia w utworzonym wcześniej dokumencie tymczasowym. Zastąp wartość Password hasłem użytym podczas tworzenia usługi Azure SQL Database. Skopiuj zaktualizowany parametry połączenia.

  2. Naciśnij klawisze Ctrl/Cmd+shift+P , aby otworzyć paletę poleceń, a następnie wyszukaj i uruchom polecenie Azure Functions: Add New Setting....

  3. Wybierz aplikację funkcji utworzoną w poprzednim artykule. Podaj następujące informacje po wyświetleniu monitów:

    Monit Wybór
    Wprowadź nazwę nowego ustawienia aplikacji Wpisz SqlConnectionString.
    Wprowadź wartość "Sql Połączenie ionString" Wklej parametry połączenia skopiowanej bazy danych Azure SQL Database.

    Spowoduje to utworzenie ustawienia aplikacji o nazwie connection SqlConnectionString w aplikacji funkcji na platformie Azure. Teraz możesz pobrać to ustawienie do pliku local.settings.json.

  4. Naciśnij ponownie klawisze Ctrl/Cmd+shift+P , aby otworzyć paletę poleceń, a następnie wyszukaj i uruchom polecenie Azure Functions: Download Remote Settings....

  5. Wybierz aplikację funkcji utworzoną w poprzednim artykule. Wybierz pozycję Tak, aby zastąpić istniejące ustawienia lokalne.

Spowoduje to pobranie wszystkich ustawień z platformy Azure do projektu lokalnego, w tym nowego ustawienia parametry połączenia. Większość pobranych ustawień nie jest używana podczas uruchamiania lokalnego.

Rejestrowanie rozszerzeń do wiązania

Ponieważ używasz powiązania wyjściowego usługi Azure SQL, przed uruchomieniem projektu musisz mieć zainstalowane odpowiednie rozszerzenie powiązań.

Z wyjątkiem wyzwalaczy HTTP i czasomierza powiązania są implementowane jako pakiety rozszerzeń. Uruchom następujące polecenie dotnet add package w oknie terminalu, aby dodać pakiet rozszerzenia Azure SQL do projektu.

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

Projekt został skonfigurowany do używania pakietów rozszerzeń, które automatycznie instalują wstępnie zdefiniowany zestaw pakietów rozszerzeń.

Użycie pakietów rozszerzeń jest włączone w pliku host.json w katalogu głównym projektu, który jest wyświetlany w następujący sposób:

{
  "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
  }
}

:::

Teraz możesz dodać powiązanie danych wyjściowych usługi Azure SQL do projektu.

Dodawanie powiązania danych wyjściowych

W usłudze Functions każdy typ powiązania wymaga elementu direction, typei unikatowego name do zdefiniowania w pliku function.json. Sposób definiowania tych atrybutów zależy od języka aplikacji funkcji.

Otwórz plik projektu HttpExample.cs i dodaj następującą ToDoItem klasę, która definiuje obiekt zapisany w bazie danych:

namespace AzureSQL.ToDo
{
    public class ToDoItem
    {
        public Guid Id { get; set; }
        public int? order { get; set; }
        public string title { get; set; }
        public string url { get; set; }
        public bool? completed { get; set; }
    }
}

W projekcie biblioteki klas języka C# powiązania są definiowane jako atrybuty powiązania w metodzie funkcji. Plik function.json wymagany przez funkcje jest generowany automatycznie na podstawie tych atrybutów.

Otwórz plik projektu HttpExample.cs i dodaj następującą klasę typów danych wyjściowych, która definiuje połączone obiekty, które będą danymi wyjściowymi naszej funkcji zarówno dla odpowiedzi HTTP, jak i danych wyjściowych SQL:

public static class OutputType
{
    [SqlOutput("dbo.ToDo", connectionStringSetting: "SqlConnectionString")]
    public ToDoItem ToDoItem { get; set; }
    public HttpResponseData HttpResponse { get; set; }
}

Dodaj instrukcję using do Microsoft.Azure.Functions.Worker.Extensions.Sql biblioteki na początku pliku:

using Microsoft.Azure.Functions.Worker.Extensions.Sql;

Atrybuty powiązania są definiowane bezpośrednio w kodzie. W konfiguracji danych wyjściowych usługi Azure SQL opisano pola wymagane dla powiązania wyjściowego usługi Azure SQL.

W tym MultiResponse scenariuszu należy dodać extraOutputs powiązanie wyjściowe do funkcji.

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

Dodaj następujące właściwości do konfiguracji powiązania:

const sendToSql = output.sql({
  commandText: 'dbo.ToDo',
  connectionStringSetting: 'SqlConnectionString',
});

Atrybuty powiązania są definiowane bezpośrednio w pliku function_app.py . Dekorator służy do dodawania generic_output_binding powiązania wyjściowego usługi Azure SQL:

@app.generic_output_binding(arg_name="toDoItems", type="sql", CommandText="dbo.ToDo", ConnectionStringSetting="SqlConnectionString"
    data_type=DataType.STRING)

W tym kodzie arg_name identyfikuje parametr powiązania, do którego odwołuje się kod, type oznacza, że powiązanie wyjściowe jest powiązaniem danych wyjściowych SQL, jest tabelą, CommandText do którego są zapisywane powiązania, i ConnectionStringSetting jest nazwą ustawienia aplikacji zawierającego parametry połączenia usługi Azure SQL. Parametry połączenia znajduje się w ustawieniu Sql Połączenie ionString w pliku local.settings.json.

Dodawanie kodu korzystającego z powiązania danych wyjściowych

Zastąp istniejącą metodę Run następującym kodem:

[Function("HttpExample")]
public static OutputType 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 SQL output binding.
    return new OutputType()
    {
         ToDoItem = new ToDoItem
        {
            id = System.Guid.NewGuid().ToString(),
            title = message,
            completed = false,
            url = ""
        },
        HttpResponse = response
    };
}

Dodaj kod, który używa obiektu powiązania wyjściowego extraInputs do context wysyłania dokumentu JSON do nazwanej funkcji powiązania danych wyjściowych. sendToSql Dodaj ten kod przed instrukcją return .

const data = JSON.stringify([
  {
    // create a random ID
    Id: crypto.randomUUID(),
    title: name,
    completed: false,
    url: '',
  },
]);

// Output to Database
context.extraOutputs.set(sendToSql, data);

Aby użyć modułu crypto , dodaj następujący wiersz na początku pliku:

const crypto = require("crypto");

W tym momencie funkcja powinna wyglądać następująco:

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

const sendToSql = output.sql({
  commandText: 'dbo.ToDo',
  connectionStringSetting: 'SqlConnectionString',
});

app.http('HttpExample', {
  methods: ['GET', 'POST'],
  extraOutputs: [sendToSql],
  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' };
      }

      // Stringified array of objects to be inserted into the database
      const data = JSON.stringify([
        {
          // create a random ID
          Id: crypto.randomUUID(),
          title: name,
          completed: false,
          url: '',
        },
      ]);

      // Output to Database
      context.extraOutputs.set(sendToSql, data);

      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' };
    }
  },
});

Zaktualizuj plik HttpExample\function_app.py , aby był zgodny z poniższym kodem. toDoItems Dodaj parametr do definicji funkcji i toDoItems.set() w instrukcji if name: :

import azure.functions as func
import logging
from azure.functions.decorators.core import DataType

app = func.FunctionApp()

@app.function_name(name="HttpTrigger1")
@app.route(route="hello", auth_level=func.AuthLevel.ANONYMOUS)
@app.generic_output_binding(arg_name="toDoItems", type="sql", CommandText="dbo.ToDo", ConnectionStringSetting="SqlConnectionString"
    data_type=DataType.STRING)
def test_function(req: func.HttpRequest, toDoItems: func.Out[func.SqlRow]) -> 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:
        toDoItems.set(func.SqlRow({"id": uuid.uuid4(), "title": name, "completed": false, url: ""}))
        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
                )

Lokalne uruchamianie funkcji

Program Visual Studio Code integruje się z narzędziami Azure Functions Core, aby umożliwić uruchamianie tego projektu na lokalnym komputerze deweloperów przed opublikowaniem na platformie Azure. Jeśli nie masz jeszcze zainstalowanych lokalnie narzędzi Core Tools, zostanie wyświetlony monit o zainstalowanie go po raz pierwszy podczas uruchamiania projektu.

  1. Aby wywołać funkcję, naciśnij klawisz F5 , aby uruchomić projekt aplikacji funkcji. Na panelu Terminal są wyświetlane dane wyjściowe z narzędzi Core Tools. Aplikacja zostanie uruchomiona na panelu Terminal . Punkt końcowy adresu URL funkcji wyzwalanej przez protokół HTTP jest widoczny lokalnie.

    Zrzut ekranu przedstawiający dane wyjściowe funkcji lokalnej programu Visual Studio Code.

    Jeśli nie masz jeszcze zainstalowanych narzędzi Core Tools, po wyświetleniu monitu wybierz pozycję Zainstaluj , aby zainstalować narzędzia Core Tools.
    Jeśli masz problemy z działaniem w systemie Windows, upewnij się, że domyślny terminal programu Visual Studio Code nie jest ustawiony na powłokę WSL Bash.

  2. Po uruchomieniu narzędzi Core Tools przejdź do obszaru Azure: Functions . W obszarze Funkcje rozwiń węzeł Funkcje lokalnego projektu>. Kliknij prawym przyciskiem myszy (Windows) lub Ctrl — kliknij funkcję (macOS), HttpExample a następnie wybierz polecenie Wykonaj funkcję teraz....

    Zrzut ekranu przedstawiający funkcję execute teraz z programu Visual Studio Code.

  3. W treści żądania Enter naciśnij klawisz Enter, aby wysłać komunikat żądania do funkcji.

  4. Gdy funkcja jest wykonywana lokalnie i zwraca odpowiedź, w programie Visual Studio Code jest zgłaszane powiadomienie. Informacje o wykonywaniu funkcji są wyświetlane na panelu Terminal .

  5. Naciśnij klawisze Ctrl + C , aby zatrzymać narzędzia Core Tools i odłączyć debuger.

Lokalne uruchamianie funkcji

  1. Podobnie jak w poprzednim artykule, naciśnij klawisz F5 , aby uruchomić projekt aplikacji funkcji i narzędzia Core Tools.

  2. Po uruchomieniu narzędzi Core Tools przejdź do obszaru Azure: Functions . W obszarze Funkcje rozwiń węzeł Funkcje lokalnego projektu>. Kliknij prawym przyciskiem myszy (kliknij na komputerze Mac) HttpExample funkcję, a następnie wybierz polecenie Wykonaj funkcję teraz....

    Zrzut ekranu przedstawiający element menu execute function now z programu Visual Studio Code.

  3. W polu Wprowadź treść żądania zostanie wyświetlona wartość treści komunikatu { "name": "Azure" }żądania . Naciśnij klawisz Enter, aby wysłać ten komunikat żądania do funkcji.

  4. Po powrocie odpowiedzi naciśnij klawisze Ctrl + C , aby zatrzymać narzędzia Core Tools.

Sprawdź, czy informacje zostały zapisane w bazie danych

  1. W witrynie Azure Portal wróć do usługi Azure SQL Database i wybierz pozycję Edytor zapytań.

    Zrzut ekranu przedstawiający logowanie do edytora zapytań w witrynie Azure Portal.

  2. Połączenie do bazy danych i rozwiń Węzeł Tabele w Eksploratorze obiektów po lewej stronie. Kliknij prawym przyciskiem myszy tabelę dbo.ToDo i wybierz pozycję Wybierz 1000 pierwszych wierszy.

  3. Sprawdź, czy nowe informacje zostały zapisane w bazie danych przez powiązanie wyjściowe.

Ponowne wdrażanie i weryfikowanie zaktualizowanej aplikacji

  1. W programie Visual Studio Code naciśnij klawisz F1, aby otworzyć paletę poleceń. W palecie poleceń wyszukaj i wybierz pozycję Azure Functions: Deploy to function app....

  2. Wybierz aplikację funkcji utworzoną w pierwszym artykule. Ponieważ ponownie wdrażasz projekt w tej samej aplikacji, wybierz pozycję Wdróż , aby odrzucić ostrzeżenie dotyczące zastępowania plików.

  3. Po zakończeniu wdrażania możesz ponownie użyć funkcji Execute Function Now... w celu wyzwolenia funkcji na platformie Azure.

  4. Ponownie sprawdź dane zapisane w usłudze Azure SQL Database , aby sprawdzić, czy powiązanie wyjściowe ponownie generuje nowy dokument JSON.

Czyszczenie zasobów

Na platformie Azure zasoby odnoszą się do aplikacji funkcji, funkcji, kont magazynu itd. Są one grupowane w grupy zasobów i można usunąć wszystkie elementy w grupie, usuwając grupę.

Aby ukończyć te przewodniki Szybki start, zostały utworzone zasoby. Za te zasoby może zostać naliczona opłata — zależy to od Twojego stanu konta i cennika usług. Jeśli nie potrzebujesz już tych zasobów, oto jak możesz je usunąć:

  1. W programie Visual Studio Code naciśnij klawisz F1 , aby otworzyć paletę poleceń. W palecie poleceń wyszukaj i wybierz pozycję Azure: Open in portal.

  2. Wybierz aplikację funkcji i naciśnij klawisz Enter. Strona aplikacji funkcji zostanie otwarta w witrynie Azure Portal.

  3. Na karcie Przegląd wybierz nazwany link obok pozycji Grupa zasobów.

    Zrzut ekranu przedstawiający wybieranie grupy zasobów do usunięcia ze strony aplikacji funkcji.

  4. Na stronie Grupa zasobów przejrzyj listę uwzględnionych zasobów i sprawdź, czy są to te, które chcesz usunąć.

  5. Wybierz pozycję Usuń grupę zasobów, a następnie postępuj zgodnie z instrukcjami.

    Usuwanie może potrwać kilka minut. Po jego zakończeniu przez kilka sekund będzie widoczne powiadomienie. Możesz również wybrać ikonę dzwonka w górnej części strony, aby wyświetlić powiadomienie.

Następne kroki

Zaktualizowano funkcję wyzwalaną przez protokół HTTP, aby zapisywać dane w usłudze Azure SQL Database. Teraz możesz dowiedzieć się więcej na temat tworzenia funkcji przy użyciu programu Visual Studio Code: