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


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

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

При развертывании кода вашей функции в Функции Azure в контейнере требуется хостинг на плане Premium или выделенном плане (Служба приложений). Выполнение этой статьи приводит к затратам на несколько долларов США в вашей учетной записи Azure, которые можно свести к минимуму путем очистки ресурсов при завершении.

Совет

Если вам нужно запустить функции на основе событий в Azure в той же среде, что и другие микрослужбы, API, веб-сайты, рабочие процессы или любые размещенные в контейнере программы, рассмотрите возможность размещения контейнерных приложений-функций в приложениях контейнеров Azure. Функции обеспечивают интегрированную поддержку разработки, развертывания и управления контейнеризованными функциями-приложениями на платформах Container Apps. Дополнительные сведения см. в статье о размещении приложений контейнеров Azure для функций Azure.

Выберите язык разработки

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

Core Tools автоматически создает Dockerfile для вашего проекта, используя наиболее актуальную версию корректного базового образа для языка, используемого функциями. Следует регулярно обновлять контейнер из последнего базового образа и повторно развертывать его из обновленной версии контейнера. Дополнительные сведения см. в разделе "Создание контейнерных приложений-функций".

Предварительные требования

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

  • Установите Azure CLI версии 2.4 или более поздней.

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

Чтобы опубликовать образ приложения-функции, создаваемого в реестре контейнеров, вам потребуется идентификатор Docker и Docker Desktop , работающий на локальном компьютере. Если у вас нет идентификатора Docker, можно создать учетную запись Docker.

Кроме того, необходимо завершить раздел Создание реестра контейнеров в кратком руководстве по реестру контейнеров. Запишите полностью квалифицированное имя вашего сервера входа.

Создание и активация виртуальной среды

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

python -m venv .venv
source .venv/bin/activate

Если пакет venv не установлен Python для вашего дистрибутива Linux, выполните следующую команду:

sudo apt-get install python3-venv

Все последующие команды будут выполняться в этой активированной виртуальной среде.

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

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

func init --worker-runtime dotnet-isolated --docker
func init --worker-runtime node --language javascript --docker
func init --worker-runtime powershell --docker
func init --worker-runtime python --docker
func init --worker-runtime node --language typescript --docker

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

mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=8 -Ddocker

Параметр -DjavaVersion указывает среде выполнения функций, какую версию Java следует использовать. Используйте -DjavaVersion=11, чтобы функции выполнялись на Java 11. Если не указать параметр -DjavaVersion, Maven будет по умолчанию использовать Java 8. Дополнительные сведения см. в разделе Версии Java.

Внимание

Чтобы выполнить задания из этой статьи, переменной среды JAVA_HOME необходимо присвоить расположение установки правильной версии JDK.

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

Подсказка значение Описание
groupId com.fabrikam Это значение уникально идентифицирует проект среди всех остальных. Оно должно соответствовать правилам именования пакетов для Java.
artifactId fabrikam-functions Это значение содержит имя JAR-файла, без номера версии.
версия 1.0-SNAPSHOT Выберите значение по умолчанию.
пакета com.fabrikam.functions Это значение определяет пакет Java для сгенерированного кода функции. Используйте значение по умолчанию.

Введите Y или нажмите клавишу ВВОД для подтверждения.

Maven создаст файлы проекта в новой папке с именем artifactId, то есть fabrikam-functions в нашем примере.

Параметр --docker создает Dockerfile для проекта, который определяет подходящий контейнер для использования с Функцией Azure и с выбранной средой выполнения.

Перейдите в папку проекта:

cd fabrikam-functions

Добавьте функцию в проект с помощью следующей команды, где аргумент --name — это уникальное имя функции, а аргумент --template указывает триггер функции. func new создает файл кода C# в проекте.

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

Добавьте функцию в проект с помощью следующей команды, где аргумент --name — это уникальное имя функции, а аргумент --template указывает триггер функции. Командаfunc new создает вложенную папку с именем функции. Эта папка содержит файл конфигурации с именем function.json.

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

Чтобы протестировать функцию локально, запустите локальный узел среды выполнения Функций Azure в корневой папке проекта. Чтобы убедиться, что функция может вызываться позже при размещении в Docker, убедитесь, что уровень авторизации задан AuthorizationLevel.Anonymousили установлен, если он еще не настроен.

func start  
func start  
npm install
npm start
mvn clean package  
mvn azure-functions:run

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

После того как вы увидите конечную точку HttpExample, записанную в выходные данные, перейдите к http://localhost:7071/api/HttpExample?name=Functions. Браузер должен отобразить приветственное сообщение, которое вернет значение Functions, переданное в параметр запроса name.

Нажмите Ctrl+C (Command+C на macOS), чтобы остановить хост.

Создание образа контейнера и проверка локально

(Необязательно.) Изучите файл Dockerfile в корневой папке проекта. В Dockerfile описана среда, необходимая для запуска приложения-функции на платформе Linux. Полный список поддерживаемых базовых образов для Функций Azure можно найти на странице базового образа Функций Azure.

В корневой папке проекта выполните команду docker build, указав имя azurefunctionsimage и тег v1.0.0. Замените <DOCKER-ID> идентификатором вашей учетной записи Docker Hub. Эта команда отвечает за создание образа Docker для контейнера.

docker build --tag <DOCKER-ID>/azurefunctionsimage:v1.0.0 .

После выполнения команды можно запустить новый контейнер локально.

Чтобы проверить сборку, запустите образ в локальном контейнере с помощью команды запуска Docker, замените <DOCKER-ID> еще раз идентификатором учетной записи Docker Hub и добавьте аргумент портов следующим образом -p 8080:80:

docker run -p 8080:80 -it <DOCKER-ID>/azurefunctionsimage:v1.0.0

После того как образ будет запущен в локальном контейнере, перейдите по адресу http://localhost:8080/api/HttpExample, где должно появиться такое же приветственное сообщение, как описано выше. Так как созданная вами функция, активируемая HTTP, использует анонимную авторизацию, можно вызвать функцию, выполняемую в контейнере, без получения ключа доступа. Дополнительные сведения см. в разделе Ключи авторизации.

После того как образ будет запущен в локальном контейнере, перейдите по адресу http://localhost:8080/api/HttpExample?name=Functions, где должно появиться такое же приветственное сообщение, как описано выше. Так как созданная вами функция, активируемая HTTP, использует анонимную авторизацию, можно вызвать функцию, выполняемую в контейнере, без получения ключа доступа. Дополнительные сведения см. в разделе Ключи авторизации.

После проверки приложения-функции в контейнере нажмите клавиши CTRL+C (Command+ в macOS), чтобы остановить выполнение.

Публикация образа контейнера в реестре

Чтобы сделать образ контейнера доступным для развертывания в среде размещения, необходимо отправить его в реестр контейнеров. Как одну из лучших практик безопасности, рекомендуется использовать экземпляр реестра контейнеров Azure и обеспечивать подключения на основе управляемых удостоверений. Docker Hub требует аутентификации с использованием общих секретов, что делает ваши развертывания более уязвимыми.

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

  1. Используйте эту команду для входа в экземпляр реестра с помощью текущих учетных данных Azure. Замените <REGISTRY-NAME> именем экземпляра реестра контейнеров.

    az acr login --name <REGISTRY-NAME>
    
  2. Используйте эту команду, чтобы пометить образ с полным именем сервера входа в реестр. Замените <LOGIN-SERVER> на полное имя сервера входа в ваш реестр и <DOCKER-ID> на ваш идентификатор Docker.

    docker tag <DOCKER-ID>/azurefunctionsimage:v1.0.0 <LOGIN-SERVER>/azurefunctionsimage:v1.0.0 
    
  3. Используйте эту команду, чтобы отправить контейнер в экземпляр реестра:

    docker push <LOGIN-SERVER>/azurefunctionsimage:v1.0.0
    

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

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

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

Внимание

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

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

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

    az login
    

    Команда az login выполняет вход в вашу учетную запись Azure.

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

    az group create --name AzureFunctionsContainers-rg --location <REGION>
    

    Команда az group create создает группу ресурсов. В приведенной выше команде замените <REGION> на ближайший к вам регион. Укажите его код, полученный с помощью команды az account list-locations.

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

    az storage account create --name <STORAGE_NAME> --location <REGION> --resource-group AzureFunctionsContainers-rg --sku Standard_LRS
    

    Команда az storage account create создает учетную запись хранения.

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

  4. Используйте команду, чтобы создать план "Премиум" для Функций Azure с именем myPremiumPlan в уровне цен Эластичный Premium 1 (--sku EP1), в вашем <REGION> и в контейнере Linux (--is-linux).

    az functionapp plan create --resource-group AzureFunctionsContainers-rg --name myPremiumPlan --location <REGION> --number-of-workers 1 --sku EP1 --is-linux
    

    Здесь мы используем план ценовой категории "Премиум", который можно масштабировать по мере необходимости. Для получения дополнительной информации о размещении, см. раздел Сравнение планов размещения для Функций Azure. Для получения дополнительной информации о расчете затрат перейдите на страницу стоимости функций.

    Команда также создает связанный экземпляр Azure Application Insights в той же группе ресурсов, которая позволяет вам отслеживать функциональное приложение и просматривать журналы. Дополнительные сведения см. в разделе Мониторинг функций Azure. Этот экземпляр не создает затраты, пока вы не активируете его.

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

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

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

    az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --resource-group AzureFunctionsContainers-rg --plan myPremiumPlan --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --registry-username <USERNAME> --registry-password <SECURE_PASSWORD> 
    

    В следующем примере замените <STORAGE_NAME> именем, использованным в предыдущем разделе для учетной записи хранения. Кроме того, замените <APP_NAME> глобально уникальным именем, соответствующим вам, или <DOCKER_ID><LOGIN_SERVER> идентификатором учетной записи Docker Hub или сервером реестра контейнеров соответственно. При развертывании из пользовательского реестра контейнеров имя образа указывает URL-адрес реестра.

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

    Совет

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

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

    az storage account show-connection-string --resource-group AzureFunctionsContainers-rg --name <STORAGE_NAME> --query connectionString --output tsv
    

    С помощью команды az storage account show-connection-string возвращается строка подключения для учетной записи хранилища.

    Внимание

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

    Замените <STORAGE_NAME> именем учетной записи хранения, созданной ранее.

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

    az functionapp config appsettings set --name <APP_NAME> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage=<CONNECTION_STRING>
    

    Команда az functionapp config appsettings set создает параметр.

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

  4. Теперь функция может использовать эту строку подключения для доступа к учетной записи хранения.

Проверка функций в Azure

С помощью образа, развернутого в приложении-функции в Azure, теперь можно вызвать функцию через HTTP-запросы.

  1. Выполните следующую az functionapp function show команду, чтобы получить URL-адрес новой функции:

    az functionapp function show --resource-group AzureFunctionsContainers-rg --name <APP_NAME> --function-name HttpExample --query invokeUrlTemplate 
    

    Замените <APP_NAME> на имя приложения-функции.

  1. Используйте URL-адрес, который вы только что получили для вызова конечной HttpExample точки функции, добавив строку ?name=Functionsзапроса.
  1. Используйте URL-адрес, который вы только что получили для вызова конечной HttpExample точки функции.

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

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

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

Чтобы избежать текущих затрат, удалите группу ресурсов AzureFunctionsContainers-rg, чтобы очистить все ресурсы в этой группе:

az group delete --name AzureFunctionsContainers-rg

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