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


Учебное пособие: Используйте функцию Azure с HTTP-триггером для создания группы контейнеров

Функции Azure — это бессерверная служба вычислений, которая может выполнять скрипты или код в ответ на различные события, такие как HTTP-запрос, таймер или сообщение в очереди службы хранилища Azure.

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

Вы узнаете, как:

  • Используйте Visual Studio Code с расширением Azure Functions, чтобы создать базовую функцию PowerShell с HTTP-триггером.
  • Включите идентификационную учетную запись в функциональном приложении и предоставьте ей разрешения на создание ресурсов Azure.
  • Измените и повторно опубликуйте функцию PowerShell, чтобы автоматизировать развертывание группы контейнеров с одним контейнером.
  • Проверьте развертывание контейнера с триггером HTTP.

Предпосылки

См Создание первой функции в Azure с помощью Visual Studio Code для получения информации о предварительных условиях установки и использования Visual Studio Code с расширением "Функции Azure" в вашей операционной системе.

Дополнительные действия, описанные в этой статье, используют Azure PowerShell. Если вам нужно установить или обновить, см. статью "Установка Azure PowerShell и вход в Azure".

Создание базовой функции PowerShell

Выполните действия, описанные в статье "Создание первой функции PowerShell в Azure", чтобы создать функцию PowerShell с помощью шаблона триггера HTTP. Используйте имя функции Azure по умолчанию HttpTrigger. Как показано в кратком руководстве, протестируйте функцию локально и опубликуйте проект в приложении-функции в Azure. В этом примере показана базовая HTTP-триггерная функция, которая возвращает текстовую строку. В последующих шагах этой статьи вы измените функцию для создания группы контейнеров.

В этой статье предполагается, что проект публикуется с помощью имени myfunctionapp, в группе ресурсов Azure автоматически именуется в соответствии с именем приложения-функции (также myfunctionapp). Замените уникальное имя приложения-функции и имя группы ресурсов на последующих шагах.

Включить управляемое удостоверение Azure в функциональном приложении

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

Добавьте удостоверение в функциональное приложение.

Update-AzFunctionApp -Name myfunctionapp `
    -ResourceGroupName myfunctionapp `
    -IdentityType SystemAssigned

Назначьте удостоверение роли участника, заданной группе ресурсов:

$SP=(Get-AzADServicePrincipal -DisplayName myfunctionapp).Id
$RG=(Get-AzResourceGroup -Name myfunctionapp).ResourceId
New-AzRoleAssignment -ObjectId $SP -RoleDefinitionName "Contributor" -Scope $RG

Изменение функции HttpTrigger

Измените код PowerShell для функции HttpTrigger , чтобы создать группу контейнеров. В файле run.ps1 функции найдите следующий блок кода. Этот код отображает значение имени, если он передается в качестве строки запроса в URL-адресе функции:

[...]
if ($name) {
    $body = "Hello, $name. This HTTP triggered function executed successfully."
}
[...]

Замените этот код на следующий пример блока. Здесь, если значение имени передается в строке запроса, оно используется для имени и создания группы контейнеров с помощью командлета New-AzContainerGroup . Обязательно замените имя группы ресурсов myfunctionapp именем группы ресурсов для приложения-функции:

[...]
if ($name) {
    New-AzContainerGroup -ResourceGroupName myfunctionapp -Name $name `
        -Image alpine -OsType Linux `
        -Command "echo 'Hello from an Azure container instance triggered by an Azure function'" `
        -RestartPolicy Never
    if ($?) {
        $body = "This HTTP triggered function executed successfully. Started container group $name"
    }
    else  {
        $body = "There was a problem starting the container group."
    }
[...]

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

Локально тестируйте функциональное приложение

Убедитесь, что функция выполняется локально перед повторной публикацией проекта приложения-функции в Azure. При локальном запуске функция не создает ресурсы Azure. Однако можно протестировать поток функции с помощью и без передачи значения имени в строке запроса. См. статью "Отладка функций Azure PowerShell локально" для отладки функции.

Повторно опубликовать приложение-функцию Azure

После локального запуска функции повторно опубликуйте проект в существующее приложение-функцию в Azure.

  1. В Visual Studio Code откройте палитру команд. Найдите и выберите элемент Azure Functions: Deploy to Function App....
  2. Выберите текущую рабочую папку для архивирования и развертывания.
  3. Выберите подписку, а затем имя существующего приложения-функции (myfunctionapp). Подтвердите, что вы хотите перезаписать предыдущее развертывание.

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

Запуск функции в Azure

После успешного завершения развертывания получите URL-адрес функции. Например, используйте область "Функции" в Visual Studio Code, чтобы скопировать URL-адрес функции HttpTrigger или получить URL-адрес функции на портале Azure.

URL-адрес функции имеет форму:

https://myfunctionapp.azurewebsites.net/api/HttpTrigger

Выполнение функции без передачи имени

В качестве первого теста выполните curl команду и передайте URL-адрес функции без добавления name строки запроса.

curl --verbose "https://myfunctionapp.azurewebsites.net/api/HttpTrigger"

Функция возвращает код состояния 200 и текст This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response:

[...]
> GET /api/HttpTrigger? HTTP/1.1
> Host: myfunctionapp.azurewebsites.net
> User-Agent: curl/7.64.1
> Accept: */*
>
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/1.1 200 OK
< Content-Length: 135
< Content-Type: text/plain; charset=utf-8
< Request-Context: appId=cid-v1:00001111-aaaa-2222-bbbb-3333cccc4444
< Date: Wed, 10 Jun 2020 17:50:27 GMT
<
* Connection #0 to host myfunctionapp.azurewebsites.net left intact
This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.* Closing connection 0

Запустите функцию и передайте имя группы контейнеров

Теперь выполните curl команду и добавьте имя группы контейнеров (mycontainergroup) в качестве строки ?name=mycontainergroupзапроса:

curl --verbose "https://myfunctionapp.azurewebsites.net/api/HttpTrigger?name=mycontainergroup"

Функция возвращает код состояния 200 и запускает создание группы контейнеров:

[...]
> GET /api/HttpTrigger1?name=mycontainergroup HTTP/1.1
> Host: myfunctionapp.azurewebsites.net
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Length: 92
< Content-Type: text/plain; charset=utf-8
< Request-Context: appId=cid-v1:00001111-aaaa-2222-bbbb-3333cccc4444
< Date: Wed, 10 Jun 2020 17:54:31 GMT
<
* Connection #0 to host myfunctionapp.azurewebsites.net left intact
This HTTP triggered function executed successfully. Started container group mycontainergroup* Closing connection 0

Убедитесь, что контейнер запущен с помощью команды Get-AzContainerInstanceLog :

Get-AzContainerInstanceLog -ResourceGroupName myfunctionapp `
  -ContainerGroupName mycontainergroup

Образец вывода:

Hello from an Azure container instance triggered by an Azure function

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

Если вам больше не нужен какой-либо из ресурсов, созданных в этом руководстве, можно выполнить команду [az group delete][az-group-delete], чтобы удалить группу ресурсов и все содержащиеся в ней ресурсы. Эта команда удаляет созданное приложение-функцию, запущенный контейнер и все связанные ресурсы.

az group delete --name myfunctionapp

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

В этом руководстве вы создали функцию Azure, которая принимает HTTP-запрос и активирует развертывание группы контейнеров. Вы узнали, как:

  • Используйте Visual Studio Code с расширением "Функции Azure", чтобы создать базовую функцию PowerShell с активацией HTTP.
  • Включите удостоверение в функциональном приложении и предоставьте ему разрешения на создание ресурсов Azure.
  • Измените код функции PowerShell, чтобы автоматизировать развертывание группы контейнеров с одним контейнером.
  • Проверьте развертывание контейнера с триггером HTTP.

Подробный пример запуска и мониторинга контейнерного задания см. в записи блога Event-Driven бессерверных контейнеров с помощью Функций Azure PowerShell и экземпляров контейнеров Azure и сопроводительных примеров кода.

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