Поделиться через


Подключение Azure Functions к Azure Cosmos DB с помощью кода Visual Studio

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

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

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

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

Примечание.

Эта статья поддерживает Node.js версии 4 для функций.

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

Настройка вашей среды

Прежде чем начнете работу, установите расширение Azure Databases для Visual Studio Code.

Создание учетной записи Azure Cosmos DB

Теперь вы создадите учетную запись Azure Cosmos DB в качестве безсерверного типа учетной записи. Этот режим на основе потребления делает Azure Cosmos DB надежным вариантом для бессерверных рабочих нагрузок.

  1. В Visual Studio Code выберите View>Command Palette... затем в палитре команд выполните поиск Azure Databases: Create Server...

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

    Подсказка Выбор
    Select an Azure Database Server Выберите Core (NoSQL) для создания базы данных документов, которую можно запрашивать с помощью SQL-синтаксиса или использовать Query Copilot (Preview) для преобразования запросов на естественном языке в запросы. Узнайте больше о Azure Cosmos DB.
    Имя учетной записи Введите уникальное имя для идентификации учетной записи Azure Cosmos DB. Имя может содержать только строчные буквы, цифры и дефисы. Его длина должна быть от 3 до 31 знаков.
    Выбор модели производительности Выберите Serverless, чтобы создать учетную запись в режиме serverless.
    Выбор группы ресурсов для новых ресурсов Выберите группу ресурсов, в которой вы создали приложение-функцию, как описано в предыдущей статье.
    Выбор расположения для новых ресурсов Выберите географическое расположение для размещения учетной записи Azure Cosmos DB. Используйте местоположение, ближайшее к вам или вашим пользователям, чтобы получить более быстрый доступ к данным.

    После подготовки новой учетной записи в области уведомлений отобразится сообщение.

Создание базы данных и контейнера Azure Cosmos DB

  1. Щелкните значок Azure в строке действий, разверните узел Resources>Azure Cosmos DB, щелкните правой кнопкой мыши (Ctrl+select на macOS) по вашему аккаунту и выберите Создать базу данных....

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

    Подсказка Выбор
    Имя базы данных Введите my-database.
    Введите идентификатор коллекции Введите my-container.
    Введите ключ секции для коллекции Введите в качестве ключа раздела .
  3. Щелкните ОК, чтобы создать контейнер и базу данных.

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

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

  1. В Visual Studio Code, щелкните правой кнопкой мыши (нажмите Ctrl и выберите на macOS) по новой учетной записи Azure Cosmos DB и выберите Copy Connection String.

    Копирование строки подключения к Azure Cosmos DB

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

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

    Подсказка Выбор
    Введите имя нового параметра приложения Введите CosmosDbConnectionString.
    Введите значение "CosmosDbConnectionString" Вставьте строку подключения вашей скопированной учетной записи Azure Cosmos DB. Вы также можете настроить идентификацию Microsoft Entra в качестве альтернативы.

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

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

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

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

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

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

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

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

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

Использование пакетов расширений включено в файле 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
  },
  "extensions": {
    "cosmosDB": {
      "connectionMode": "Gateway"
    }
  }
}

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

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

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

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

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

В проекте библиотеки классов C# привязки определяются как атрибуты привязки в методе.

Откройте файл HttpExample.cs project и добавьте следующие классы:

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

Класс MyDocument определяет объект, который записывается в базу данных. Строка подключения для учетной записи хранилища задается свойством Connection. В этом случае можно опустить Connection, так как вы уже используете учетную запись storage по умолчанию.

Класс MultiResponse позволяет записывать данные в указанную коллекцию в Azure Cosmos DB и возвращать сообщение об успешном выполнении HTTP. Так как вам нужно вернуть объект MultiResponse, необходимо также обновить сигнатуру метода.

Конкретные атрибуты указывают имена контейнера и его родительской базы данных. Строка подключения для вашей учетной записи Azure Cosmos DB устанавливается с помощью CosmosDbConnectionString.

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

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

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

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

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

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

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

В этом коде arg_name определяет параметр привязки, на который ссылается код, database_name и container_name — это имена базы данных и коллекции, в которые записывается привязка, и connection — это имя параметра приложения, содержащего connection string для учетной записи Azure Cosmos DB, которая находится в параметре CosmosDbConnectionString в файле local.settings.json.

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

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

[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 Azure Cosmos DB output binding.
    return new MultiResponse()
    {
        Document = new MyDocument
        {
            id = System.Guid.NewGuid().ToString(),
            message = message
        },
        HttpResponse = new OkObjectResult(message)
    };
}

Добавьте код, использующий объект extraInputs привязки context выхода для отправки документа JSON в именованную функцию привязки sendToCosmosDb выхода. Добавьте этот код перед инструкцией return.

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

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

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

Теперь этот код возвращает объект MultiResponse, который содержит документ и ответ HTTP.

Обновите function_app.py , чтобы соответствовать следующему коду. Добавьте параметр outputDocument в определение функции и outputDocument.set() под оператором 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.FUNCTION)
@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="CosmosDbConnectionString")
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
                )

Документ {"id": "name"} создается в коллекции баз данных, указанной в привязке.

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

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

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

    Скриншот вывода функции Local в Visual Studio Code.

    Если у вас еще не установлены Core Tools, выберите Install, чтобы установить Core Tools, когда будет предложено.
    Если у вас проблемы с запуском Windows, убедитесь, что терминал по умолчанию для Visual Studio Code не установлен на WSL Bash.

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

    Скриншот функции выполнения кода в среде Visual Studio Code.

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

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

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

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

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

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

    Выполните функцию сейчас из Visual Studio Code

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

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

Проверка успешного создания документа JSON

  1. На портале Azure вернитесь к вашей учетной записи Azure Cosmos DB и выберите Data Explorer.

  2. Разверните базу данных, затем контейнер, и выберите Элементы, чтобы увидеть список документов, созданных в этом контейнере.

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

    Проверка, что в контейнере Azure Cosmos DB создан новый документ

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

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

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

  3. После завершения развертывания можно снова использовать функцию Execute Now... функция для активации функции в Azure. Эта команда автоматически извлекает ключ доступа функции и использует его при вызове конечной точки триггера HTTP.

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

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

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

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

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

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

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

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

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

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

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

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

Вы обновили HTTP-триггерную функцию для записи документов JSON в контейнер Azure Cosmos DB. Теперь вы можете узнать больше о разработке функций с помощью кода Visual Studio: