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


Подключение Функций Azure к службе хранилища Azure с помощью Visual Studio Code

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

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

Большинство привязок требуют сохраненную строку подключения, которая будет использоваться Функциями Azure для доступа к привязанным службам. Чтобы упростить процесс, вам следует использовать учетную запись хранения, созданную в приложении-функции. Подключение к этой учетной записи уже хранится в параметрах приложения под названием AzureWebJobsStorage.

Примечание.

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

Настройка локальной среды

Перед началом работы с этой статьей необходимо выполнить следующие требования:

В этой статье предполагается, что вы уже выполнили вход в подписку Azure из Visual Studio Code. Вы можете войти в систему, выполнив команду Azure: Sign In в палитре команд.

Загрузка параметров приложения-функции

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

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

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

    Внимание

    Из-за того, что файла local.settings.json содержит секреты, этот файл никогда не будет опубликован — он будет исключен из системы управления версиями.

  3. Скопируйте значение AzureWebJobsStorage, которое является ключом для значения строки подключения к учетной записи хранения. Это подключение используется для проверки работы привязки для вывода.

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

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

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

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

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

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

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

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

{
  "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request"
      }
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 5.0.0)"
  }
}

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

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

dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues --prerelease

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

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

Запись в очередь служба хранилища Azure:

  • extraOutputs Добавление свойства в конфигурацию привязки

    {
        methods: ['GET', 'POST'],
        extraOutputs: [sendToQueue], // add output binding to HTTP trigger
        authLevel: 'anonymous',
        handler: () => {}
    }
    
  • Добавление функции над вызовом output.storageQueue app.http

    const sendToQueue = output.storageQueue({
      queueName: 'outqueue',
      connection: 'AzureWebJobsStorage',
    });
    

Запись в очередь служба хранилища Azure:

  • extraOutputs Добавление свойства в конфигурацию привязки

    {
        methods: ['GET', 'POST'],
        extraOutputs: [sendToQueue], // add output binding to HTTP trigger
        authLevel: 'anonymous',
        handler: () => {}
    }
    
  • Добавление функции над вызовом output.storageQueue app.http

    const sendToQueue: StorageQueueOutput = output.storageQueue({
      queueName: 'outqueue',
      connection: 'AzureWebJobsStorage',
    });
    

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

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

Чтобы создать привязку, щелкните правой кнопкой мыши (CTRL+щелкните macOS) function.json файл в папке HttpTrigger и нажмите кнопку "Добавить привязку...". Следуйте инструкциям, чтобы определить следующие свойства привязки для новой привязки:

Prompt значение Описание
Select binding direction (Выберите направление привязки) out Привязка является выходной привязкой.
Select binding with direction... (Выберите привязку с направлением...) Azure Queue Storage Привязка является привязкой очереди службы хранилища Azure.
The name used to identify this binding in your code (Имя, используемое для идентификации этой привязки в коде) msg Имя, которое используется для идентификации параметров привязки, указанных в коде.
The queue to which the message will be sent (Очередь, в которую будет отправляться сообщение) outqueue Имя очереди, в которой записывается привязка. Если queueName не существует, то при первом использовании этот параметр будет создан привязкой.
Select setting from "local.setting.json" (Выберите параметр из файла local.setting.json) AzureWebJobsStorage Имя параметра приложения, который содержит строку подключения к учетной записи хранения. Параметр AzureWebJobsStorage содержит строку подключения учетной записи хранения, созданной в приложении-функции.

Привязка добавляется в bindings массив в function.json, который должен выглядеть следующим образом:

      "name": "msg",
      "queueName": "outqueue",
      "connection": "AzureWebJobsStorage"
    }
  ]
}

Атрибуты привязки определяются путем декорирования определенного кода функции в файле function_app.py . Вы используете queue_output декоратор для добавления выходной привязки хранилища очередей Azure.

С помощью декоратора направление привязки неявно queue_output "out" и тип служба хранилища Azure очереди. Добавьте следующий декоратор в код функции в HttpExample\function_app.py:

@app.queue_output(arg_name="msg", queue_name="outqueue", connection="AzureWebJobsStorage")

В этом коде arg_name определяет параметр привязки, на который ссылается код, является именем очереди, queue_name в которую записывается привязка, и connection является именем параметра приложения, содержащего строка подключения для учетной записи хранения. В кратком руководстве используется та же учетная запись хранения, что и приложение-функция, которое находится в параметре AzureWebJobsStorage . Если queue_name не существует, то при первом использовании привязка создаст этот параметр.

В проекте C# привязки определяются как атрибуты привязки в методе функции. Конкретные определения зависят от того, выполняется ли приложение в процессе (библиотека классов C#) или в изолированном рабочем процессе.

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

public class MultiResponse
{
    [QueueOutput("outqueue",Connection = "AzureWebJobsStorage")]
    public string[] Messages { get; set; }
    public HttpResponseData HttpResponse { get; set; }
}

Класс MultiResponse позволяет выполнять запись в очередь хранилища с именем outqueue и в сообщение об успешном выполнении HTTP. Так как атрибут QueueOutput применяется к массиву строк, в очередь можно отправить несколько сообщений.

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

В проекте Java привязки определяются как заметки привязки для метода функции. Затем на основе этих заметок автоматически создается файл function.json.

Найдите расположение вашего кода функции в src/main/java, откройте файл проекта Function.java и добавьте следующий параметр в run определение метода:

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

Параметр msg имеет тип OutputBinding<T>, представляющий собой набор строк, записываемых в виде сообщений в выходную привязку после завершения выполнения функции. В этом случае выходные данные представляют собой очередь хранилища с именем outqueue. Строка подключения для учетной записи хранения задается методом connection. Вместо самой строки подключения передается параметр приложения, содержащий строку подключения к учетной записи хранилища.

Определение метода run теперь должно выглядеть следующим образом:

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

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

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

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

context.extraOutputs.set(sendToQueue, [msg]);

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

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

const sendToQueue = output.storageQueue({
  queueName: 'outqueue',
  connection: 'AzureWebJobsStorage',
});

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

      const name = request.query.get('name') || (await request.text());
      context.log(`Name: ${name}`);

      if (name) {
        const msg = `Name passed to the function ${name}`;
        context.extraOutputs.set(sendToQueue, [msg]);
        return { body: msg };
      } else {
        context.log('Missing required data');
        return { status: 404, body: 'Missing required data' };
      }
    } catch (error) {
      context.log(`Error: ${error}`);
      return { status: 500, body: 'Internal Server Error' };
    }
  },
});

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

context.extraOutputs.set(sendToQueue, [msg]);

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

import {
  app,
  output,
  HttpRequest,
  HttpResponseInit,
  InvocationContext,
  StorageQueueOutput,
} from '@azure/functions';

const sendToQueue: StorageQueueOutput = output.storageQueue({
  queueName: 'outqueue',
  connection: 'AzureWebJobsStorage',
});

export async function HttpExample(
  request: HttpRequest,
  context: InvocationContext,
): Promise<HttpResponseInit> {
  try {
    context.log(`Http function processed request for url "${request.url}"`);

    const name = request.query.get('name') || (await request.text());
    context.log(`Name: ${name}`);

    if (name) {
      const msg = `Name passed to the function ${name}`;
      context.extraOutputs.set(sendToQueue, [msg]);
      return { body: msg };
    } else {
      context.log('Missing required data');
      return { status: 404, body: 'Missing required data' };
    }
  } catch (error) {
    context.log(`Error: ${error}`);
    return { status: 500, body: 'Internal Server Error' };
  }
}

app.http('HttpExample', {
  methods: ['GET', 'POST'],
  authLevel: 'anonymous',
  handler: HttpExample,
});

Добавьте код, использующий командлет Push-OutputBinding для записи текста в очередь с помощью привязки выходных данныхmsg. Добавьте этот код перед установкой состояния "ОК" в операторе if.

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

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

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

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

import azure.functions as func
import logging

app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)

@app.route(route="HttpExample")
@app.queue_output(arg_name="msg", queue_name="outqueue", connection="AzureWebJobsStorage")
def HttpExample(req: func.HttpRequest, msg: func.Out [func.QueueMessage]) -> 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:
        msg.set(name)
        return func.HttpResponse(f"Hello, {name}. This HTTP triggered function executed successfully.")
    else:
        return func.HttpResponse(
             "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.",
             status_code=200
        )

Параметр msg — это экземпляр azure.functions.Out class. Метод set записывает строковое сообщение в очередь. В этом случае он name передается в функцию в строке запроса URL-адреса.

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

    [Function("HttpExample")]
    public static MultiResponse Run([HttpTrigger(AuthorizationLevel.Function, "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 storage output binding.
        return new MultiResponse()
        {
            // Write a single message.
            Messages = new string[] { message },
            HttpResponse = response
        };
    }
}

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

msg.setValue(name);

После использования выходной привязки вам для проверки подлинности, получения ссылки на очередь или записи данных больше не потребуется код пакета SDK службы хранилища Azure. Вместо вас эти задачи будут выполнены выходной привязкой очереди и средой выполнения функции.

Теперь метод run должен выглядеть следующим образом:

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

Обновление тестов

Поскольку архетип также создает набор тестов, необходимо обновить эти тесты для обработки нового параметра msg в сигнатуре метода run.

Найдите местоположение тестового кода в src/test/java, откройте файл проекта Function.java и замените строку кода в //Invoke следующим кодом.

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

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

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 и выберите Выполнить функцию....

    Снимок экрана: выполнение функции из Visual Studio Code.

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

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

Так как вы используете строку подключения к хранилищу, функция подключается к учетной записи хранения Azure при локальном запуске. Новая очередь с именем outqueue создается в вашей учетной записи хранения средой выполнения Функций при первом использовании выходной привязки. Чтобы убедиться, что очередь и сообщение в ней были созданы, вам нужно будет использовать Обозреватель службы хранилища.

Подключение Обозревателя службы хранилища к учетной записи

Пропустите этот раздел, если вы уже установили служба хранилища Azure Explorer и подключили его к учетной записи Azure.

  1. Запустите Обозреватель службы хранилища Azure, щелкните значок подключения слева и выберите Добавить учетную запись.

    Снимок экрана: добавление учетной записи Azure в служба хранилища Microsoft Azure Explorer.

  2. В диалоговом окне Подключение щелкните Добавить учетную запись Azure, выберите свою среду Azure, а затем выберите Войти....

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

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

Проверка выходной очереди

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

  2. Разверните узел Очереди, а затем выберите очередь с именем outqueue.

    В ней содержится сообщение о том, что выходная привязка очереди создана при запуске функции, активируемой HTTP. Если вы вызывали функцию со значением по умолчанию nameAzure, в сообщении очереди будет указано Имя переданной функции: Azure.

    Снимок экрана: сообщение очереди, показанное в обозревателе служба хранилища Azure.

  3. Запустите функцию еще раз, отправьте другой запрос, и в очереди появится новое сообщение.

Теперь пора выполнить повторную публикацию обновленного приложения-функции в Azure.

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

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

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

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

  4. Еще раз просмотрите сообщение в очереди хранилища, чтобы убедиться, что выходная привязка создает новое сообщение в очереди.

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

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

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

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

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

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

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

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

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

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

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

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