Подключение Функции Azure База данных SQL Azure с помощью Visual Studio Code

Функции Azure позволяют выполнять подключение служб Azure и других ресурсов к функциям без необходимости написания кода для интеграции. Эти привязки, которые представляют как входные, так и выходные данные, объявляются в определении функции. Данные привязок предоставляются функции в качестве параметров. Триггер является специальным типом входных привязок. Хотя функция обладает только одним триггером, она может состоять из нескольких входных и выходных привязок. Дополнительные сведения см. в статье Основные понятия триггеров и привязок в Функциях Azure.

В этой статье показано, как использовать Visual Studio Code для подключения База данных SQL Azure к функции, созданной в предыдущей краткой статье. Выходная привязка, добавляемая в эту функцию, записывает данные из HTTP-запроса в таблицу в База данных SQL Azure.

Перед началом работы необходимо выполнить действия, описанные в статье Краткое руководство. Создание функции C# в Azure с помощью Visual Studio Code. Если вы уже удалили ресурсы по окончании работы по этой статье, выполните шаги еще раз, чтобы повторно создать приложение-функцию и связанные ресурсы в Azure.

Перед началом работы необходимо выполнить действия, описанные в статье Краткое руководство. Создание функции JavaScript в Azure с помощью Visual Studio Code. Если вы уже удалили ресурсы по окончании работы по этой статье, выполните шаги еще раз, чтобы повторно создать приложение-функцию и связанные ресурсы в Azure.

Перед началом работы необходимо выполнить краткое руководство. Создание функции Python в Azure с помощью Visual Studio Code. Если вы уже удалили ресурсы по окончании работы по этой статье, выполните шаги еще раз, чтобы повторно создать приложение-функцию и связанные ресурсы в Azure.

Дополнительные сведения о параметрах привязки SQL Azure и триггерах для Функции Azure доступны в документации Функции Azure.

Создание Базы данных SQL Azure

  1. Выполните База данных SQL Azure краткое руководство по созданию бессерверных База данных SQL Azure. База данных может быть пуста или создана из примера набора данных AdventureWorksLT.

  2. Введите следующие сведения по соответствующим запросам:

    Prompt Выбор
    Группа ресурсов Выберите группу ресурсов, в которой вы создали приложение-функцию, как описано в предыдущей статье.
    Имя базы данных Введите mySampleDatabase.
    Имя сервера Укажите уникальное имя сервера. Мы не можем указать точное имя сервера, так как имена всех серверов в Azure должны быть глобально уникальными, а не только в рамках подписки.
    метод проверки подлинности Выберите Проверка подлинности SQL Server.
    Имя для входа администратора сервера Введите azureuser.
    Пароль Введите пароль, соответствующий требованиям сложности.
    Разрешить службам и ресурсам Azure доступ к этому серверу Выберите Да.
  3. После завершения создания перейдите в колонку базы данных в портал Azure и в разделе Параметры выберите строки Подключение ion. Скопируйте ADO.NET строка подключения для проверки подлинности SQL. Вставьте строка подключения во временный документ для последующего использования.

    Снимок экрана: копирование База данных SQL Azure строка подключения в портал Azure.

  4. Создайте таблицу для хранения данных из HTTP-запроса. В портал Azure перейдите в колонку базы данных и выберите редактор запросов. Введите следующий запрос, чтобы создать таблицу с именем 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. Убедитесь, что функция Azure сможет получить доступ к База данных SQL Azure, проверка параметры брандмауэра сервера. Перейдите к колонке сервера в портал Azure и в разделе "Безопасность" выберите "Сеть". Исключение для разрешения доступа к этому серверу служб и ресурсов Azure должно быть проверка.

    Снимок экрана: проверка настройки брандмауэра База данных SQL Azure в портал Azure.

Обновление параметров приложения-функции

В предыдущем кратком руководстве показано, как создать в Azure приложение-функцию. В этой статье вы обновите приложение для записи данных в только что созданный База данных SQL Azure. Чтобы подключиться к База данных SQL Azure, необходимо добавить его строка подключения в параметры приложения. Затем вы скачайте новый параметр в файл local.settings.json, чтобы подключиться к База данных SQL Azure при локальном запуске.

  1. Измените строка подключения во временном документе, созданном ранее. Замените значение пароля, используемого Password при создании База данных SQL Azure. Скопируйте обновленные строка подключения.

  2. Нажмите клавиши CTRL/CMD+SHIFT+P , чтобы открыть палитру команд, а затем выполните поиск и выполните команду Azure Functions: Add New Setting....

  3. Выберите созданное в рамках предыдущей статьи приложение-функцию. Введите следующие сведения по соответствующим запросам:

    Prompt Выбор
    Введите имя нового параметра приложения Введите SqlConnectionString.
    Введите значение "Sql Подключение ionString" Вставьте строка подключения только что скопированного База данных SQL Azure.

    При этом в приложении-функции в Azure создается параметр приложения с именем SqlConnectionString для подключения. Теперь этот параметр можно скачать в файл local.settings.json.

  4. Нажмите клавиши CTRL/CMD+SHIFT+P еще раз, чтобы открыть палитру команд, а затем выполните поиск и выполните команду Azure Functions: Download Remote Settings....

  5. Выберите созданное в рамках предыдущей статьи приложение-функцию. Выберите Да, для всех, чтобы перезаписать имеющиеся локальные параметры.

При этом скачиваются все параметры из Azure в ваш локальный проект, включая новый параметр строки подключения. Большинство скачанных параметров не используются при локальном запуске.

Регистрация расширений привязки

Так как вы используете выходную привязку SQL Azure, необходимо установить соответствующее расширение привязок перед запуском проекта.

За исключением триггеров HTTP и таймера, привязки реализованы в виде пакетов расширений. Выполните следующую команду dotnet add package в окне терминала, чтобы добавить пакет расширения SQL Azure в проект.

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

В проекте настроено использование пакетов расширений, которые автоматически устанавливают предопределенный набор пакетов расширений.

Возможность использования пакетов расширений включена в файле host.json в корне проекта, который выглядит следующим образом.

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

:::

Теперь в проект можно добавить выходную привязку SQL Azure.

Добавление выходной привязки

В службе "Функции" для каждого типа привязок требуется direction, type и уникальное name, которое определяется в файле function.json. Способ определения этих атрибутов зависит от языка приложения-функции.

Откройте файл проекта HttpExample.cs и добавьте следующий ToDoItem класс, который определяет объект, записанный в базу данных:

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

В проекте библиотеки классов C# привязки определяются как атрибуты привязки в методе функции. Затем на основе этих атрибутов автоматически создается файл function.json, обязательный для службы Функции Azure.

Откройте файл проекта HttpExample.cs и добавьте следующий класс типа выходных данных, который определяет объединенные объекты, которые будут выводиться из нашей функции для ответа HTTP и выходных данных SQL:

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

Добавьте инструкцию using в Microsoft.Azure.Functions.Worker.Extensions.Sql библиотеку в начало файла:

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

Атрибуты привязки определяются непосредственно в коде. В выходной конфигурации SQL Azure описываются поля, необходимые для выходной привязки SQL Azure.

Для этого MultiResponse сценария необходимо добавить выходную привязку extraOutputs в функцию.

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

Добавьте следующие свойства в конфигурацию привязки:

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

Атрибуты привязки определяются непосредственно в файле function_app.py . Вы используете generic_output_binding декоратор для добавления выходной привязки SQL Azure:

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

В этом коде arg_name определяет параметр привязки, на который ссылается код, указывает, что выходная привязка является выходной привязкой SQL, type CommandText является таблицей, в которую записывается привязка, и ConnectionStringSetting является именем параметра приложения, содержащего строка подключения SQL Azure. Строка подключения находится в параметре Sql Подключение ionString в файле local.settings.json.

Добавление кода, который использует выходную привязку

Замените существующий метод Run следующим кодом:

[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
    };
}

Добавьте код, использующий объект context выходной extraInputs привязки для отправки документа JSON в именованную функцию выходной привязки. sendToSql Добавьте этот код перед инструкцией 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);

Чтобы использовать crypto модуль, добавьте следующую строку в начало файла:

const crypto = require("crypto");

На этом этапе ваша функция должна выглядеть следующим образом:

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

Обновите HttpExample\function_app.py , чтобы соответствовать следующему коду. Добавьте параметр в toDoItems определение функции и toDoItems.set() под инструкцией if name: :

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

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.get_json().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": str(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
                )

Локальное выполнение функции

Visual Studio Code интегрируется с Azure Functions Core Tools, чтобы перед публикацией в Azure можно было запустить этот проект на локальном компьютере разработки. Если у вас еще нет основных средств, вам будет предложено установить его при первом запуске проекта.

  1. Чтобы вызвать функцию, нажмите клавишу F5, чтобы запустить проект приложения-функции. На панели Терминал отобразятся выходные данные из Core Tools. Ваше приложение запускается в панели Терминал. Отобразится URL-адрес конечной точки активируемой HTTP-запросом функции, которая выполняется локально.

    Снимок экрана: выходные данные Visual Studio Code локальной функции.

    Если у вас еще нет основных инструментов, выберите "Установить ", чтобы установить основные инструменты при появлении запроса на это.
    При возникновении проблем с запуском в Windows убедитесь, что в качестве терминала по умолчанию для Visual Studio Code не используется оболочка WSL.

  2. С запущенными Core Tools перейдите в область Azure: Функции. В разделе Функции разверните Локальный проект>Функции. Щелкните правой кнопкой мыши (в Windows) или используйте Ctrl-щелчок (в macOS) на функции HttpExample и выберите Выполнить функцию....

    Снимок экрана: пункт

  3. В поле Введите текст запроса нажмите клавишу ВВОД, чтобы отправить запрос в функцию.

  4. При выполнении функции локально и возврате ответа в Visual Studio Code отобразится уведомление. Сведения о выполнении функции отображаются на панели Терминал.

  5. Нажмите клавиши CTRL+C, чтобы остановить Core Tools и отключить отладчик.

Локальное выполнение функции

  1. Как и при работе с предыдущей статьей, нажмите клавишу F5, чтобы запустить проект приложения функции и Core Tools.

  2. С запущенными Core Tools перейдите в область "Azure: Функции". В разделе Функции разверните Локальный проект>Функции. Щелкните правой кнопкой мыши (Ctrl-щелчок на компьютерах Mac) функцию HttpExample и выберите Выполнить функцию....

    Снимок экрана: пункт меню

  3. В поле Введите текст запроса отображается текст сообщения запроса { "name": "Azure" }. Нажмите клавишу ВВОД, чтобы отправить это сообщение запроса в свою функцию.

  4. После возврата ответа нажмите клавиши CTRL+C, чтобы остановить работу Core Tools.

Убедитесь, что данные были записаны в базу данных

  1. В портал Azure вернитесь к База данных SQL Azure и выберите редактор запросов.

    Снимок экрана: вход в редактор запросов в портал Azure.

  2. Подключение в базу данных и разверните Узел таблиц в обозревателе объектов слева. Щелкните таблицу правой dbo.ToDo кнопкой мыши и выберите "Выбрать верхние 1000 строк".

  3. Убедитесь, что новая информация была записана в базу данных выходной привязкой.

Повторное развертывание и проверка обновленного приложения

  1. В Visual Studio Code нажмите клавишу F1, чтобы открыть палитру команд. В палитре команд найдите и щелкните Azure Functions: Deploy to function app....

  2. Выберите созданное в рамках первой статьи приложение-функцию. Так как вы повторно развертываете свой проект в том же приложении, щелкните Развернуть, чтобы закрыть предупреждение о перезаписи файлов.

  3. После завершения развертывания вы можете повторно использовать возможность Выполнить функцию..., чтобы запустить функцию в Azure.

  4. Снова проверка данные, записанные в База данных SQL Azure, чтобы убедиться, что выходная привязка снова создает новый документ JSON.

Очистка ресурсов

Ресурсы в Azure — это приложения-функции, функции, учетные записи хранения и т. д. Они объединяются в группы ресурсов, при удалении которых удаляются и все данные в них.

Вы создали ресурсы для завершения этих кратких руководств. Вам могут быть выставлены счета за эти ресурсы в зависимости от состояния учетной записи и цен на службы. Если вам больше не нужны ресурсы, их можно удалить следующим образом:

  1. В Visual Studio Code нажмите клавишу F1, чтобы открыть палитру команд. В палитре команд найдите и щелкните Azure: Open in portal.

  2. Выберите приложение-функцию и нажмите клавишу ВВОД. Страница приложения-функции откроется на портале Azure.

  3. На вкладке Обзор выберите именованную ссылку рядом с полем Группа ресурсов.

    Снимок экрана: выбор группы ресурсов, которую требуется удалить со страницы приложения-функции.

  4. На странице Группа ресурсов просмотрите список включенных ресурсов и убедитесь, что именно их нужно удалить.

  5. Выберите Удалить группу ресурсов и следуйте инструкциям.

    Удаление может занять несколько минут. После этого на несколько секунд появится уведомление. Кроме того, можно выбрать значок колокольчика в верхней части страницы, чтобы просмотреть уведомление.

Следующие шаги

Вы обновили функцию, активированную HTTP, чтобы записать данные в База данных SQL Azure. Теперь вы можете посмотреть дополнительные сведения о разработке Функций с помощью Visual Studio Code.