Краткое руководство. Создание функции C# в Azure из командной строки

Из этой статьи вы узнаете, как создать функцию класса C# на основе библиотеки, которая отвечает на HTTP-запросы, используя инструменты командной строки. После тестирования кода в локальной среде его необходимо развернуть в бессерверной среде Функций Azure.

Выполнение этого краткого руководства предполагает небольшую дополнительную плату в несколько центов США в учетной записи Azure.

Существует также версия этой статьи для Visual Studio Code.

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

Перед началом работы убедитесь, что у вас есть такие компоненты.

Проверка предварительных условий

Убедитесь, что предварительные требования (зависят от того, используете ли вы Azure CLI или Azure PowerShell для создания ресурсов Azure) выполнены:

  • В окне терминала или командном окне запустите func --version, чтобы убедиться, что используется версия Azure Functions Core Tools 3.x.

  • Выполните команду az --version, чтобы убедиться, что используется версия Azure CLI 2.4 или более поздняя.

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

  • Выполните команду dotnet --list-sdks, чтобы проверить, установлен ли пакет SDK для .NET Core версии 3.1.x.

Создание локального проекта службы "Функции"

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

  1. Выполните команду func init, как показано ниже, чтобы создать проект функций в папке с именем LocalFunctionProj с указанной средой выполнения:

    func init LocalFunctionProj --dotnet
    
  2. Перейдите в папку проекта:

    cd LocalFunctionProj
    

    Эта папка содержит различные файлы проекта, в том числе файлы конфигурации local.settings.json и host.json. Файл local.settings.json может содержать секреты, скачанные из Azure, поэтому файл по умолчанию исключен из системы управления версиями в GITIGNORE-файле.

  3. Добавьте функцию в проект с помощью приведенной ниже команды, где аргумент --name — уникальное имя функции (HttpExample), а аргумент --template позволяет указать триггер функции (HTTP).

    func new --name HttpExample --template "HTTP trigger" --authlevel "anonymous"
    

    Команда func new создает файл кода HttpExample.cs.

Проверка содержимого файла (дополнительно)

При необходимости можно сразу перейти к локальному запуску функции и просмотреть содержимое файла позже.

HttpExample.cs

Файл HttpExample.cs содержит метод Run, получающий данные запроса в переменной req — это запрос HttpRequest, дополненный атрибутом HttpTriggerAttribute, который определяет поведение триггера.

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

namespace LocalFunctionProj
{
    public static class HttpExample
    {
        [FunctionName("HttpExample")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            string name = req.Query["name"];

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            dynamic data = JsonConvert.DeserializeObject(requestBody);
            name = name ?? data?.name;

            return name != null
                ? (ActionResult)new OkObjectResult($"Hello, {name}")
                : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
        }
    }
}

Возвращаемый объект — это ActionResult, который возвращает ответное сообщение в виде OkObjectResult (200) или BadRequestObjectResult (400). Дополнительные сведения см. в статье Триггеры и привязки HTTP в службе "Функции Azure".

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

  1. Выполните функцию, запустив локальное хост-приложение среды выполнения Функций Azure из папки LocalFunctionProj:

    func start
    

    Ближе к концу выходных данных появятся следующие строки:

     ...
    
     Now listening on: http://0.0.0.0:7071
     Application started. Press Ctrl+C to shut down.
    
     Http Functions:
    
             HttpExample: [GET,POST] http://localhost:7071/api/HttpExample
     ...
    
     

    Примечание

    Если результат HttpExample не похож на пример выше, скорее всего, вы запустили основное приложение из папки, отличной от корневой папки проекта. В этом случае остановите хост-приложение клавишами CTRL+C, перейдите в корневую папку проекта и снова выполните указанную выше команду.

  2. Скопируйте URL-адрес функции HttpExample из этих выходных данных в браузер и добавьте строку запроса ?name=<YOUR_NAME>, сформировав полный URL-адрес, например http://localhost:7071/api/HttpExample?name=Functions. Браузер отобразит ответное сообщение, содержащее значение строки запроса. Терминал, в котором вы запустили проект, также выводит данные журнала при выполнении запросов.

  3. Когда все будет готово, нажмите клавиши CTRL+C и выберите y, чтобы отключить хост-приложение функции.

Создание вспомогательных ресурсов Azure для функции

Прежде чем развернуть код функции в Azure, необходимо создать три ресурса:

  • группу ресурсов — логический контейнер связанных ресурсов;
  • учетную запись хранения, которая используется для сохранения состояния и других сведений о функциях;
  • приложение-функцию — среду для выполнения кода функции. Оно сопоставляется с локальным проектом функций и позволяет группировать функции в логические единицы, чтобы упростить развертывание, масштабирование и совместное использование ресурсов, а также управление ими.

Чтобы создать эти элементы, выполните следующие команды: Поддерживается Azure CLI и PowerShell.

  1. Войдите в Azure, если вы еще этого не сделали:

    az login
    

    Чтобы войти в учетную запись Azure, выполните команду az login.

  2. Создайте группу ресурсов с именем AzureFunctionsQuickstart-rg в регионе westeurope:

    az group create --name AzureFunctionsQuickstart-rg --location westeurope
    

    Чтобы создать группу ресурсов, выполните команду az group create. Группу ресурсов и ресурсы целесообразно создавать в ближайшем к вам регионе. Для этого используйте команду az account list-locations.

  3. В группе ресурсов и регионе создайте учетную запись хранения общего назначения:

    az storage account create --name <STORAGE_NAME> --location westeurope --resource-group AzureFunctionsQuickstart-rg --sku Standard_LRS
    

    Создайте учетную запись хранения с помощью команды az storage account create.

    В предыдущем примере замените <STORAGE_NAME> соответствующим именем, которое является уникальным в службе хранилища Azure. Имена должны содержать от трех до 24 символов и только в нижнем регистре. Standard_LRS указывает учетную запись общего назначения, которая поддерживается Функциями.

  1. Создайте приложение-функцию в Azure:

    az functionapp create --resource-group AzureFunctionsQuickstart-rg --consumption-plan-location westeurope --runtime dotnet --functions-version 3 --name <APP_NAME> --storage-account <STORAGE_NAME>
    

    Чтобы создать приложение-функцию в Azure, выполните команду az functionapp create.

    В предыдущем примере замените <STORAGE_NAME> именем учетной записи, использованной на предыдущем шаге, и измените <APP_NAME> на глобально уникальное имя, подходящее вам. <APP_NAME> также является доменом DNS по умолчанию для приложения-функции.

    Эта команда создает приложение-функцию, работающее в указанной языковой среде выполнения в рамках плана использования Функций Azure, который не предусматривает плату за объем, используемый здесь. Эта команда также подготавливает связанный экземпляр Application Insights Azure в той же группе ресурсов. Его можно использовать для мониторинга приложения-функции и просмотра журналов. Дополнительные сведения см. в разделе Мониторинг функций Azure. Этот экземпляр не создает затраты, пока вы не активируете его.

Развертывание проекта функций в Azure

После того как вы успешно создадите приложение-функцию в Azure, вы сможете развернуть локальный проект функций с помощью команды func azure functionapp publish.

В следующем примере замените <APP_NAME> на имя своего приложения.

func azure functionapp publish <APP_NAME>

Команда publish показывает результаты, аналогичные приведенным ниже (усечены для простоты):

...

Getting site publishing info...
Creating archive for current directory...
Performing remote build for functions project.

...

Deployment successful.
Remote build succeeded!
Syncing triggers...
Functions in msdocs-azurefunctions-qs:
    HttpExample - [httpTrigger]
        Invoke url: https://msdocs-azurefunctions-qs.azurewebsites.net/api/httpexample

Вызов функции в Azure

Функция использует триггер HTTP, поэтому ее необходимо вызывать через HTTP-запрос по URL-адресу в браузере или с помощью такого средства, как cURL.

Скопируйте полный URL-адрес вызова Invoke URL, показанный в выходных данных команды publish, в адресную строку браузера, добавив параметр запроса &name=Functions. В браузере должны отображаться выходные данные, аналогичные данным при локальном запуске функции.

Выходные данные функции, выполняемой в Azure в браузере

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

func azure functionapp logstream <APP_NAME> 

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

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

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

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

az group delete --name AzureFunctionsQuickstart-rg

Дальнейшие действия