Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье вы создадите приложение Функций Azure, работающее в контейнере Linux, и развернете его в среде приложений контейнеров Azure из реестра контейнеров. Развернув приложения контейнеров, вы можете интегрировать функциональные приложения в облачные микросервисы. Дополнительные сведения см. в статье Размещение Функций Azure в приложениях контейнеров Azure.
Выполнение этого краткого руководства приводит к небольшой стоимости в учетной записи Azure, которую можно свести к минимуму, очищая ресурсы после завершения.
Выберите язык разработки
Сначала вы используете средства Функций Azure для создания кода проекта в качестве приложения-функции в контейнере Docker с помощью базового образа Linux для конкретного языка. Выберите язык в верхней части статьи.
Core Tools автоматически создает Файл Dockerfile для проекта, который использует самую актуальную версию правильного базового образа для языка функций. Следует регулярно обновлять контейнер из последнего базового образа и повторно развертывать его из обновленной версии контейнера. Дополнительные сведения см. в разделе "Создание контейнерных приложений-функций".
Предпосылки
Перед началом необходимо иметь следующие требования:
Установите SDK .NET.
Установите основные средства Функции Azure Core Tools версии 4.0.5198 или более поздней версии.
- Установите версию 4.x инструментов Функции Azure Core.
- Установите версию Node.js , поддерживаемую функциями Azure.
- Установите версию Python, поддерживаемую функциями Azure.
- Установите SDK .NET.
Установите версию пакета разработчиков Java , поддерживаемого функциями Azure.
Установите Apache Maven версии 3.0 или более поздней.
- Установите 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
В пустой папке выполните следующую команду, чтобы создать проект Functions из архетипа 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 запрашивает значения, необходимые для завершения создания проекта при развертывании. Следуйте инструкциям и укажите следующее:
| Подсказка | Ценность | Description |
|---|---|---|
| groupId | com.fabrikam |
Это значение уникально идентифицирует проект среди всех остальных. Оно должно соответствовать правилам именования пакетов для Java. |
| artifactId | fabrikam-functions |
Это значение содержит имя JAR-файла, без номера версии. |
| version | 1.0-SNAPSHOT |
Выберите значение по умолчанию. |
| пакета | com.fabrikam.functions |
Это значение указывает на Java-пакет для генерируемого кода функции. Используйте значения по умолчанию. |
Введите Y или нажмите Enter для подтверждения.
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+C в macOS), чтобы остановить выполнение.
Публикация образа контейнера в реестре
Чтобы сделать образ контейнера доступным для развертывания в среде размещения, необходимо отправить его в реестр контейнеров. Рекомендуется в целях безопасности использовать экземпляр Реестр контейнеров Azure и обеспечивать подключения на основе управляемых удостоверений. Docker Hub требует проверки подлинности с помощью общих секретов, что делает развертывания более уязвимыми.
Реестр контейнеров Azure — это частная служба реестра для создания, хранения и управления образами контейнеров и связанными артефактами. Для публикации контейнеров в службах Azure следует использовать службу частного реестра.
Используйте эту команду для входа в экземпляр реестра с помощью текущих учетных данных Azure. Замените
<REGISTRY-NAME>именем экземпляра реестра контейнеров.az acr login --name <REGISTRY-NAME>Используйте эту команду, чтобы пометить образ с полным именем сервера для входа в реестр. Замените
<LOGIN-SERVER>на полное квалифицированное имя вашего сервера логина реестра и<DOCKER-ID>на ваш идентификатор Docker.docker tag <DOCKER-ID>/azurefunctionsimage:v1.0.0 <LOGIN-SERVER>/azurefunctionsimage:v1.0.0Используйте эту команду, чтобы отправить контейнер в экземпляр реестра:
docker push <LOGIN-SERVER>/azurefunctionsimage:v1.0.0
Создание вспомогательных ресурсов Azure для функции
Прежде чем развернуть контейнер в Azure, необходимо создать три ресурса:
группу ресурсов — логический контейнер связанных ресурсов;
Учетная запись хранения Azure, которая используется для сохранения состояния и другой информации о функциях.
Среда для приложений контейнеров Azure с рабочей областью Log Analytics.
Управляемое удостоверение, назначаемое пользователем, которое позволяет приложению-функции безопасно подключаться к ресурсам Azure без использования общих секретов. Подключения к учетной записи хранения Azure и к экземпляру реестра контейнеров Azure вместо этого осуществляются с использованием аутентификации Microsoft Entra с идентификацией, что рекомендовано в данном сценарии.
Замечание
Docker Hub не поддерживает управляемые удостоверения.
Используйте следующие команды для создания необходимых ресурсов Azure:
При необходимости войдите в Azure:
Команда
az loginвходит в вашу учетную запись Azure. Используетсяaz account setпри наличии нескольких подписок, связанных с вашей учетной записью.Выполните следующую команду, чтобы обновить Azure CLI до последней версии:
az upgradeЕсли ваша версия Azure CLI не является последней версией, начинается установка. Способ обновления зависит от операционной системы. После завершения обновления можно продолжить.
Выполните следующие команды, которые обновляют расширение "Приложения контейнеров Azure" и регистрируют пространства имен, необходимые для приложений контейнеров:
az extension add --name containerapp --upgrade -y az provider register --namespace Microsoft.Web az provider register --namespace Microsoft.App az provider register --namespace Microsoft.OperationalInsightsСоздайте группу ресурсов с именем
AzureFunctionsContainers-rg.az group create --name AzureFunctionsContainers-rg --location eastusЭта
az group createкоманда создает группу ресурсов в регионе "Восток США". Если вы вместо этого хотите использовать регион рядом с вами, нужно воспользоваться доступным кодом региона, возвращенным командойaz account list-locations. Для использования настраиваемого региона вместоeastusнеобходимо изменить последующие команды.Создайте среду приложений контейнеров Azure.
az containerapp env create --name MyContainerappEnvironment --resource-group AzureFunctionsContainers-rg --location eastusВыполнение команды может занять несколько минут.
Создайте учетную запись хранения общего назначения в группе ресурсов и регионе без доступа к общему ключу. В команде замените
<STORAGE-NAME>на имя, подходящее вам и уникальное в служба хранилища Azure. Имена хранилищ должны содержать от 3 до 24 символов и состоять только из цифр и строчных букв.az storage account create --name <STORAGE-NAME> --location eastus --resource-group AzureFunctionsContainers-rg --sku Standard_LRS --allow-blob-public-access false --allow-shared-key-access falseКоманда
az storage account createсоздает учетную запись хранения, доступную только для удостоверений, аутентифицированных с помощью Microsoft Entra, которым предоставлены разрешения на доступ к конкретным ресурсам.Standard_LRSуказывает учетную запись общего назначения, которая поддерживается Функциями.Создайте управляемое удостоверение и используйте возвращенное
principalIdдля предоставления ему доступа к вашей учетной записи хранения и доступа на извлечение в вашем экземпляре реестра. Замените<REGISTRY-NAME>,<USER-IDENTITY-NAME>и<STORAGE-NAME>на имя вашего существующего реестра контейнеров, имя для управляемого удостоверения и имя учетной записи хранения соответственно.principalId=$(az identity create --name <USER-IDENTITY-NAME> --resource-group AzureFunctionsContainers-rg --location eastus --query principalId -o tsv) acrId=$(az acr show --name <REGISTRY-NAME> --query id --output tsv) az role assignment create --assignee-object-id $principalId --assignee-principal-type ServicePrincipal --role acrpull --scope $acrId storageId=$(az storage account show --resource-group AzureFunctionsContainers-rg --name <STORAGE-NAME> --query 'id' -o tsv) az role assignment create --assignee-object-id $principalId --assignee-principal-type ServicePrincipal --role "Storage Blob Data Owner" --scope $storageIdКоманда
az identity createсоздает пользовательское управляемое удостоверение, а командаaz role assignment createдобавляет удостоверение в необходимые роли.Управляемое удостоверение теперь доступно приложению для доступа к учетной записи хранения и Реестру контейнеров Azure без использования общих секретов.
Создание и настройка приложения-функции в Azure с помощью образа
Приложение-функция в Azure управляет выполнением функций в среде azure Container Apps. В этом разделе вы используете ресурсы Azure из предыдущего раздела, чтобы создать функциональное приложение из образа в реестре контейнеров в среде для контейнерных приложений. Вы также настраиваете новую среду с помощью строки подключения к необходимой учетной записи службы хранилища Azure.
az containerapp create --kind=functionapp Используйте команду для создания приложения-функции в новой управляемой среде, поддерживаемой приложениями контейнеров Azure. В az containerapp create --kind-functionapp параметре --environment указывается среда для контейнерных приложений.
Подсказка
Чтобы убедиться, что ваше приложение-функция использует управляемое подключение на основе удостоверений к экземпляру --image реестра, не устанавливайте параметр в az containerapp create --kind=functionapp. При установке --image полного имени образа в репозитории общие секретные учетные данные получаются из реестра и хранятся в параметрах приложения.
Сначала необходимо получить полностью квалифицированное значение идентификатора управляемого удостоверения, назначенного пользователем, с правами доступа на чтение к реестру, а затем использовать команду az containerapp create --kind=functionapp для создания приложения-функции с использованием образа по умолчанию и с назначением этому удостоверению.
UAMI_RESOURCE_ID=$(az identity show --name $uami_name --resource-group $group --query id -o tsv)
az containerapp create --name <APP-NAME> --storage-account <STORAGE-NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --assign-identity $UAMI_RESOURCE_ID
В az containerapp create --kind=functionapp, --assign-identity назначает управляемое удостоверение новому приложению. Поскольку вы не задали параметр --image, приложение az functionapp create создается с использованием образа-заполнителя.
В этом примере замените <APP-NAME> и <STORAGE-NAME> на имя для вашего нового приложения-функции, а также на название вашей учетной записи хранения.
Наконец, вам нужно обновить linuxFxVersion настройку сайта на полное имя вашего образа в репозитории. Необходимо также обновить acrUseManagedIdentityCreds параметры сайта, acrUserManagedIdentityIDчтобы управляемые удостоверения использовались при получении образа из реестра.
UAMI_RESOURCE_ID=$(az identity show --name <USER-IDENTITY-NAME> --resource-group AzureFunctionsContainers-rg --query id -o tsv)
az resource patch --resource-group AzureFunctionsContainers-rg --name <APP-NAME> --resource-type "Microsoft.Web/sites" --properties "{ \"siteConfig\": { \"linuxFxVersion\": \"DOCKER|<REGISTRY-NAME>.azurecr.io/azurefunctionsimage:v1.0.0\", \"acrUseManagedIdentityCreds\": true, \"acrUserManagedIdentityID\":\"$UAMI_RESOURCE_ID\", \"appSettings\": [{\"name\": \"DOCKER_REGISTRY_SERVER_URL\", \"value\": \"<REGISTRY-NAME>.azurecr.io\"}]}}"
Помимо требуемых az resource patch параметров сайта, команда также обновляет DOCKER_REGISTRY_SERVER_URL параметр приложения на URL-адрес сервера реестра.
В этом примере замените <APP-NAME>, <REGISTRY-NAME>а также <USER-IDENTITY-NAME> именами приложения-функции, реестра контейнеров и удостоверений соответственно.
Указав --workload-profile-name "Consumption", вы создаёте своё приложение в среде с профилем рабочей нагрузки по умолчанию Consumption, стоимость которого аналогична плану потребления контейнерных приложений. При первом создании приложения-функции он извлекает исходный образ из реестра.
Обновление параметров приложения
Чтобы хост функций мог подключаться к учетной записи хранения по умолчанию с помощью общих секретов, необходимо заменить параметр строки подключения эквивалентным параметром, в котором используется назначаемое пользователем управляемое удостоверение для подключения к учетной записи хранения.
Удалите существующий
AzureWebJobsStorageпараметр строка подключения:az containerapp config appsettings delete --name <APP-NAME> --resource-group AzureFunctionsContainers-rg --setting-names AzureWebJobsStorageКоманда
az containerapp config appsettings deleteудаляет этот параметр из приложения. Замените<APP-NAME>на имя приложения-функции.Добавьте эквивалентные параметры с
AzureWebJobsStorage__префиксом, который определяет подключение управляемого удостоверения, назначаемое пользователем, к учетной записи хранения по умолчанию:clientId=$(az identity show --name <USER-IDENTITY-NAME> --resource-group AzureFunctionsContainers-rg --query 'clientId' -o tsv) az containerapp config appsettings set --name <APP-NAME> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage__accountName=<STORAGE-NAME> AzureWebJobsStorage__credential=managedidentity AzureWebJobsStorage__clientId=$clientIdВ этом примере замените
<APP-NAME>,<USER-IDENTITY-NAME>,<STORAGE-NAME>на имя вашего приложения-функции, имя вашего удостоверения и имя вашей учетной записи хранения соответственно.
На этом этапе функции выполняются в среде "Приложения контейнеров", при этом уже добавлены необходимые параметры приложения. При необходимости вы можете добавить другие параметры в приложение функций стандартным способом для функций. Дополнительные сведения см. в разделе Работа с параметрами приложения.
Подсказка
При внесении последующих изменений в код функции необходимо перестроить контейнер, повторно опубликовать образ в реестре и обновить приложение-функцию с новой версией образа.
Проверка функций в Azure
С помощью образа, развернутого в приложении-функции в Azure, теперь можно вызвать функцию через HTTP-запросы. Получите подробные сведения о конкретной функции:
az containerapp function show \
--resource-group AzureFunctionsContainers-rg \
--name <APP-NAME> \
--function-name HttpExample
Замените <APP-NAME> на имя приложения-функции. Используйте URL-адрес, который вы только что получили для вызова конечной HttpExample точки функции, добавив строку ?name=Functionsзапроса.
URL-адрес запроса должен выглядеть примерно так:
https://myacafunctionapp.kindtree-796af82b.eastus.azurecontainerapps.io/api/httpexample?name=functions
https://myacafunctionapp.kindtree-796af82b.eastus.azurecontainerapps.io/api/httpexample
В настоящее время Go не поддерживается для этой функции.
Очистите ресурсы
Если вы хотите продолжить работу с функцией Azure с помощью ресурсов, созданных в этой статье, можно оставить все эти ресурсы.
После завершения работы с развертыванием приложения-функции удалите AzureFunctionsContainers-rg группу ресурсов, чтобы очистить все ресурсы в этой группе:
az group delete --name AzureFunctionsContainers-rg