Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
В этой статье вы используете локальные средства командной строки для создания функции, которая отвечает на HTTP-запросы. После того как вы проверите код локально, вы развернете его в Azure Functions на бессерверном плане размещения Flex Consumption.
Завершение этого быстрого старта влечет за собой небольшие расходы в несколько центов США или меньше в вашей учетной записи Azure.
Выберите предпочитаемый язык разработки в верхней части статьи.
Prerequisites
- Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
-
Пакет разработчиков Java 17
- Если вы используете другую поддерживаемую версию Java, необходимо обновить файл pom.xml проекта.
- Переменная
JAVA_HOMEсреды должна быть задана в расположении установки правильной версии пакета средств разработки Java (JDK).
- Apache Maven 3.8.x
Обработчик JSON командной
jqстроки, используемый для анализа выходных данных JSON, а также доступен в Azure Cloud Shell.
Установка основных инструментов Функций Azure
Рекомендуемый способ установки основных средств зависит от операционной системы локального компьютера разработки.
Следующая процедура устанавливает Core Tools версии v4.x с помощью установщика Windows (MSI). Дополнительные сведения о других установщиках на основе пакетов, см. в файле readme для Core Tools.
Скачайте и запустите установщик Core Tools для используемой версии Windows:
- v4.x — Windows 64-разрядная версия (рекомендуется для отладки Visual Studio Code требуется 64-разрядная версия.)
- v4.x — Windows 32-разрядная версия
Если вы ранее использовали установщик Windows (MSI) для установки основных инструментов в Windows, перед установкой последней версии удалите старую версию из команды "Добавить программы".
Создание и активация виртуальной среды
В подходящей папке выполните следующие команды, чтобы создать и активировать виртуальную среду с именем .venv. Обязательно используйте одну из версий Python, поддерживаемых функциями Azure.
python -m venv .venv
source .venv/bin/activate
Если пакет venv не установлен Python для вашего дистрибутива Linux, выполните следующую команду:
sudo apt-get install python3-venv
Все последующие команды будут выполняться в этой активированной виртуальной среде.
Создание локального проекта кода и функции
В Функциях Azure проект кода — это приложение, содержащее одну или несколько отдельных функций, которые отвечают каждому триггеру. Все функции в проекте используют одинаковые конфигурации и развертываются как единица в Azure. В этом разделе вы создадите проект кода, содержащий одну функцию.
В терминале или командной строке выполните следующую
func initкоманду, чтобы создать проект приложения-функции в текущей папке:func init --worker-runtime dotnet-isolated
В терминале или командной строке выполните следующую
func initкоманду, чтобы создать проект приложения-функции в текущей папке:func init --worker-runtime node --language javascript
В терминале или командной строке выполните следующую
func initкоманду, чтобы создать проект приложения-функции в текущей папке:func init --worker-runtime powershell
В терминале или командной строке выполните следующую
func initкоманду, чтобы создать проект приложения-функции в текущей папке:func init --worker-runtime python
В терминале или командной строке выполните следующую
func initкоманду, чтобы создать проект приложения-функции в текущей папке:func init --worker-runtime node --language typescript
В терминале или командной строке выполните следующую
func initкоманду, чтобы создать проект приложения-функции в текущей папке:func init --worker-runtime custom
В пустой папке выполните следующую
mvnкоманду, чтобы создать проект кода из архетипа Функций Azure Maven:mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=17Important
- Используйте
-DjavaVersion=11, чтобы функции выполнялись на Java 11. Дополнительные сведения см. в версиях Java. -
JAVA_HOMEЗадайте для переменной среды расположение установки правильной версии JDK, чтобы завершить эту статью.
- Используйте
Maven запрашивает значения, которые позволят завершить создание проекта развертывания.
При появлении запроса укажите следующие значения:Prompt Value Description groupId com.fabrikamЭто значение уникально идентифицирует проект среди всех остальных. Оно должно соответствовать правилам именования пакетов для Java. artifactId fabrikam-functionsЭто значение содержит имя JAR-файла, без номера версии. version 1.0-SNAPSHOTВыберите значение по умолчанию. package com.fabrikamЭто значение определяет пакет Java для создаваемого кода функции. Используйте значения по умолчанию. Введите
Yили нажмите клавишу ВВОД для подтверждения.Maven создает файлы проекта в новой папке с именем artifactId, который в этом примере является
fabrikam-functions.Перейдите в папку проекта:
cd fabrikam-functionsВы можете просмотреть созданный шаблоном код для новой функции триггера HTTP в Function.java в каталоге проекта \src\main\java\com\fabrikam .
Используйте эту
func newкоманду, чтобы добавить функцию в проект:func new --name HttpExample --template "HTTP trigger" --authlevel "function"Новый файл кода добавляется в проект. В этом случае
--nameаргумент — это уникальное имя функции (HttpExample), а--templateаргумент указывает триггер HTTP.
Корневая папка проекта содержит различные файлы для проекта, включая файлы конфигураций с именем local.settings.json и host.json. Файл local.settings.json может содержать секреты, скачанные из Azure, поэтому файл по умолчанию исключен из системы управления версиями в GITIGNORE-файле.
Создание и сборка функции
Файл function.json в папке HttpExample объявляет функцию для триггера HTTP. Чтобы реализовать эту функцию, вам нужно добавить к ней обработчик и скомпилировать исполняемый файл.
Нажмите клавиши CTRL+N (или CMD+N в macOS), чтобы создать новый файл. Сохраните его с именем handler.go в корневой папке приложения-функции (где расположен файл host.json).
Добавьте в файл handler.go следующий код и сохраните его. Это и есть ваш пользовательский обработчик Go.
package main import ( "fmt" "log" "net/http" "os" ) func helloHandler(w http.ResponseWriter, r *http.Request) { message := "This HTTP triggered function executed successfully. Pass a name in the query string for a personalized response.\n" name := r.URL.Query().Get("name") if name != "" { message = fmt.Sprintf("Hello, %s. This HTTP triggered function executed successfully.\n", name) } fmt.Fprint(w, message) } func main() { listenAddr := ":8080" if val, ok := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT"); ok { listenAddr = ":" + val } http.HandleFunc("/api/HttpExample", helloHandler) log.Printf("About to listen on %s. Go to https://127.0.0.1%s/", listenAddr, listenAddr) log.Fatal(http.ListenAndServe(listenAddr, nil)) }Нажмите клавиши CTRL+SHIFT+' или выберите команду New Terminal (Создать терминал) в меню Terminal (Терминал), чтобы открыть новый встроенный терминал VS Code.
Скомпилируйте этот пользовательский обработчик с помощью следующей команды. Исполняемый файл с именем
handler(handler.exeв Windows) выводится в корневую папку приложения-функции.go build handler.go
Настройка приложения-функции
Узел функции должен быть настроен так, чтобы при запуске выполнять двоичный файл пользовательского обработчика.
Откройте файл host.json.
В разделе
customHandler.descriptionзадайте значениеdefaultExecutablePathдля параметраhandler(илиhandler.exeв среде Windows).В разделе
customHandlerдобавьте свойство с именемenableForwardingHttpRequestи задайте для него значениеtrue. Для функций, которые содержат только триггер HTTP, этот параметр упрощает программирование. Он позволяет работать с обычным HTTP-запросом вместо полезных данных пользовательского обработчика запросов.Убедитесь, что раздел
customHandlerпохож на представленный здесь пример. Сохраните файл."customHandler": { "description": { "defaultExecutablePath": "handler", "workingDirectory": "", "arguments": [] }, "enableForwardingHttpRequest": true }
Теперь приложение-функция будет запускать исполняемый файл пользовательского обработчика.
Локальное выполнение функции
Проверьте новую функцию, запустив проект локально и вызвав конечную точку функции.
Используйте эту команду, чтобы запустить локальный узел среды выполнения Функций Azure в корневой папке проекта:
func startnpm install npm startmvn clean package mvn azure-functions:runВ конце выходных данных отображаются следующие строки:
... 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 ...Скопируйте URL-адрес вашей функции из этих данных
HttpExample, вставьте в браузер и перейдите по URL-адресу функции. Вы должны получить успешный ответ с сообщением «hello world».Note
Так как авторизация ключа доступа не применяется при локальном запуске, url-адрес функции, возвращенный не включает значение ключа доступа, и вам не нужно вызывать функцию.
Когда закончите, нажмите клавиши Ctrl+C и выберите
y, чтобы остановить хост функций.
Создание вспомогательных ресурсов Azure для функции
Прежде чем развернуть код функции в Azure, необходимо создать следующие ресурсы:
- группу ресурсов — логический контейнер связанных ресурсов;
- Учетная запись хранения по умолчанию, которая используется узлом функций для поддержания состояния и других сведений о функциях.
- Управляемое удостоверение, назначенное пользователем, которое хост функций использует для подключения к учетной записи хранения по умолчанию.
- Приложение-функция, которое предоставляет окружение для выполнения кода вашей функции. Приложение функций соответствует вашему локальному проекту функций и позволяет группировать функции в логические единицы для более простого управления, развертывания и совместного использования ресурсов.
Используйте команды Azure CLI, описанные в этих шагах, чтобы создать необходимые ресурсы.
Войдите в Azure, если вы еще этого не сделали:
az loginКоманда
az loginвходит в вашу учетную запись Azure. Пропустите этот шаг при запуске в Azure Cloud Shell.Если вы еще этого не сделали, используйте эту
az extension addкоманду для установки расширения Application Insights:az extension add --name application-insightsИспользуйте команду az group create , чтобы создать группу ресурсов с именем
AzureFunctionsQuickstart-rgв выбранном регионе:az group create --name "AzureFunctionsQuickstart-rg" --location "<REGION>"В этом примере замените
<REGION>на регион рядом с вами, который поддерживает план потребления Flex. Используйте команду az functionapp list-flexconsumption-locations , чтобы просмотреть список поддерживаемых в настоящее время регионов.Используйте команду az storage account create, чтобы создать учетную запись хранения общего назначения в группе ресурсов и регионе:
az storage account create --name <STORAGE_NAME> --location "<REGION>" --resource-group "AzureFunctionsQuickstart-rg" \ --sku "Standard_LRS" --allow-blob-public-access false --allow-shared-key-access falseВ этом примере замените
<STORAGE_NAME>на имя, подходящее вам и уникальное в хранилище Azure. Имена должны содержать от трех до 24 символов и содержать только цифры и строчные буквы.Standard_LRSуказывает учетную запись общего назначения, которая поддерживается Функциями. Доступ к этой новой учетной записи можно получить только с помощью удостоверений, прошедших проверку подлинности Microsoft Entra, которым предоставлены разрешения для определенных ресурсов.Используйте этот скрипт для создания управляемого удостоверения, назначаемого пользователем, анализа возвращаемых свойств JSON объекта с помощью
jqи предоставленияStorage Blob Data Ownerразрешений в учетной записи хранения по умолчанию:output=$(az identity create --name "func-host-storage-user" --resource-group "AzureFunctionsQuickstart-rg" --location <REGION> \ --query "{userId:id, principalId: principalId, clientId: clientId}" -o json) userId=$(echo $output | jq -r '.userId') principalId=$(echo $output | jq -r '.principalId') clientId=$(echo $output | jq -r '.clientId') storageId=$(az storage account show --resource-group "AzureFunctionsQuickstart-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Если у вас нет служебной
jqпрограммы в локальной оболочке Bash, она доступна в Azure Cloud Shell. В этом примере замените<STORAGE_NAME>на имя вашей учетной записи хранения по умолчанию и<REGION>на регион соответственно.Команда az identity create создает удостоверение с именем
func-host-storage-user. ВозвращенныйprincipalIdиспользуется для назначения разрешений этому новому удостоверению в учетной записи хранения по умолчанию с помощью командыaz role assignment create. Командаaz storage account showиспользуется для получения идентификатора учетной записи хранения.Используйте следующую команду az functionapp create для создания приложения-функции в Azure:
az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \ --runtime dotnet-isolated --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \ --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \ --runtime java --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \ --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \ --runtime node --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \ --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \ --runtime python --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \ --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \ --runtime python --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \ --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \ --runtime other --storage-account <STORAGE_NAME> \ --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"В этом примере замените эти заполнители соответствующими значениями:
-
<APP_NAME>: глобально уникальное имя, соответствующее вам.<APP_NAME>также является доменом DNS по умолчанию для приложения-функции. -
<STORAGE_NAME>: имя учетной записи, используемой на предыдущем шаге. -
<REGION>: текущий регион. -
<LANGUAGE_VERSION>: используйте ту же поддерживаемую версию стека языков , проверенную локально, если применимо.
Эта команда создает функциональное приложение, работающее в указанной языковой среде выполнения на Linux в плане потребления Flex, который является бесплатным для объема использования, который вы создаете здесь. Эта команда также создает связанный экземпляр Azure Application Insights в той же группе ресурсов, с помощью которой можно отслеживать выполнение приложения-функции и просматривать журналы. Дополнительные сведения см. в разделе Мониторинг функций Azure. Этот экземпляр не создает затраты, пока вы не активируете его.
-
Используйте этот скрипт, чтобы добавить ваше пользовательское управляемое удостоверение в роль издателя метрик мониторинга в экземпляре Application Insights.
appInsights=$(az monitor app-insights component show --resource-group "AzureFunctionsQuickstart-rg" \ --app <APP_NAME> --query "id" --output tsv) principalId=$(az identity show --name "func-host-storage-user" --resource-group "AzureFunctionsQuickstart-rg" \ --query principalId -o tsv) az role assignment create --role "Monitoring Metrics Publisher" --assignee $principalId --scope $appInsightsВ нашем примере замените
<APP_NAME>именем реального приложения-функции. Команда az role assignment create добавляет пользователя в роль. Идентификатор ресурса вашего экземпляра Application Insights и основной идентификатор пользователя получаются с помощью команд az monitor app-insights component show иaz identity show, соответственно.
Обновление параметров приложения
Чтобы включить подключение узла Функций к учетной записи хранения по умолчанию с помощью общих секретов, замените параметр строки подключения AzureWebJobsStorage несколькими параметрами, которые имеют префикс AzureWebJobsStorage__. Эти параметры определяют сложный набор настроек, который ваше приложение использует для подключения к хранилищу и Application Insights с назначенным пользователем управляемым удостоверением.
Используйте этот скрипт, чтобы получить ID клиента для управляемого удостоверения, назначенного пользователем, и используйте его для определения подключений управляемого удостоверения к хранилищу и Application Insights.
clientId=$(az identity show --name func-host-storage-user \ --resource-group AzureFunctionsQuickstart-rg --query 'clientId' -o tsv) az functionapp config appsettings set --name <APP_NAME> --resource-group "AzureFunctionsQuickstart-rg" \ --settings AzureWebJobsStorage__accountName=<STORAGE_NAME> \ AzureWebJobsStorage__credential=managedidentity AzureWebJobsStorage__clientId=$clientId \ APPLICATIONINSIGHTS_AUTHENTICATION_STRING="ClientId=$clientId;Authorization=AAD"В этом скрипте замените
<APP_NAME>на название вашего приложения-функции, а<STORAGE_NAME>на название вашей учетной записи хранения соответственно.Выполните команду az functionapp config appsettings delete , чтобы удалить существующий
AzureWebJobsStorageпараметр строки подключения, содержащий общий секретный ключ:az functionapp config appsettings delete --name <APP_NAME> --resource-group "AzureFunctionsQuickstart-rg" --setting-names AzureWebJobsStorageВ этом примере замените
<APP_NAME>на имя вашего приложения-функции.
На этом этапе хост функций может безопасно подключиться к учетной записи хранилища с помощью управляемых удостоверений вместо общих секретов. Теперь вы можете развернуть код проекта в ресурсах Azure.
Развертывание проекта функций в Azure
После успешного создания приложения-функции в Azure теперь можно развернуть проект локальных функций с помощью func azure functionapp publish команды.
В корневой папке проекта выполните следующую
func azure functionapp publishкоманду:func azure functionapp publish <APP_NAME>В этом примере следует заменить
<APP_NAME>именем приложения. Успешное развертывание показывает результаты, аналогичные следующим выходным данным (усеченным для простоты):... 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В локальном терминале или командной строке выполните следующую команду, чтобы получить значение конечной точки URL-адреса, включая ключ доступа:
func azure functionapp list-functions <APP_NAME> --show-keysВ этом примере снова замените
<APP_NAME>на имя вашего приложения.Скопируйте возвращаемый URL-адрес конечной точки и ключ, который используется для вызова конечной точки функции.
Обновление файла pom.xml
После успешного создания приложения-функции в Azure обновите файл pom.xml, чтобы Maven смог развернуть ваше новое приложение. В противном случае Maven создает новый набор ресурсов Azure во время развертывания.
В Azure Cloud Shell используйте эту
az functionapp showкоманду, чтобы получить URL-адрес контейнера развертывания и идентификатор нового управляемого удостоверения, назначаемого пользователем:az functionapp show --name <APP_NAME> --resource-group AzureFunctionsQuickstart-rg \ --query "{userAssignedIdentityResourceId: properties.functionAppConfig.deployment.storage.authentication.userAssignedIdentityResourceId, \ containerUrl: properties.functionAppConfig.deployment.storage.value}"В этом примере замените
<APP_NAME>на имя вашего приложения-функции.В корневом каталоге проекта откройте файл pom.xml в текстовом редакторе, найдите
propertiesэлемент и обновите следующие значения свойств:Название свойства Value java.versionИспользуйте ту же поддерживаемую версию стека языков , проверенную локально, например 17.azure.functions.maven.plugin.version1.37.1azure.functions.java.library.version3.1.0functionAppNameИмя приложения-функции в Azure. configurationНайдите разделazure-functions-maven-pluginи замените его этим фрагментом XML:<configuration> <appName>${functionAppName}</appName> <resourceGroup>AzureFunctionsQuickstart-rg</resourceGroup> <pricingTier>Flex Consumption</pricingTier> <region>....</region> <runtime> <os>linux</os> <javaVersion>${java.version}</javaVersion> </runtime> <deploymentStorageAccount>...</deploymentStorageAccount> <deploymentStorageResourceGroup>AzureFunctionsQuickstart-rg</deploymentStorageResourceGroup> <deploymentStorageContainer>...</deploymentStorageContainer> <storageAuthenticationMethod>UserAssignedIdentity</storageAuthenticationMethod> <userAssignedIdentityResourceId>...</userAssignedIdentityResourceId> <appSettings> <property> <name>FUNCTIONS_EXTENSION_VERSION</name> <value>~4</value> </property> </appSettings> </configuration>В новом элементе
configurationвыполните следующие точные замены значений, представленных многоточиями (...):Configuration Value regionКод региона существующего приложения-функции, например eastus.deploymentStorageAccountИмя учетной записи хранения. deploymentStorageContainerИмя общей папки развертывания, которое следует после \в значенииcontainerUrl, которое вы получили.userAssignedIdentityResourceIdПолный идентификатор ресурса управляемого удостоверения, полученного вами. Сохраните изменения в файле pom.xml .
Теперь вы можете использовать Maven для развертывания проекта кода в существующем приложении.
Развертывание проекта функций в Azure
В командной строке выполните следующую команду:
mvn clean package azure-functions:deployПосле успешного развертывания выполните следующую команду Core Tools, чтобы получить значение конечной точки URL-адреса, включая ключ доступа:
func azure functionapp list-functions <APP_NAME> --show-keysВ этом примере снова замените
<APP_NAME>на имя вашего приложения.Скопируйте возвращаемый URL-адрес конечной точки и ключ, который используется для вызова конечной точки функции.
Вызов функции в Azure
Так как функция использует триггер HTTP и поддерживает запросы GET, вы вызываете его, выполняя HTTP-запрос к URL-адресу с помощью ключа доступа на уровне функции. Проще всего выполнить запрос GET в браузере.
Вставьте URL-адрес и ключ доступа, скопированный в адресную строку браузера.
URL-адрес конечной точки должен выглядеть примерно так:
https://contoso-app.azurewebsites.net/api/httpexample?code=aabbccdd...
В этом случае необходимо также указать ключ доступа в строке запроса при выполнении запроса GET к URL-адресу конечной точки. Рекомендуется использовать ключ доступа, чтобы ограничить доступ для случайных клиентов. При выполнении запроса POST с помощью HTTP-клиента вместо этого следует указать ключ доступа в заголовке x-functions-key .
При переходе к этому URL-адресу в браузере должны отображаться выходные данные, аналогичные данным при локальном запуске функции.
Очистите ресурсы
Если вы намерены перейти к следующему шагу и добавить выходную привязку очереди службы хранилища Azure, сохраните все ваши ресурсы в неизменном виде, так как вам предстоит работать с уже выполненными действиями.
В противном случае используйте следующую команду, чтобы удалить группу ресурсов и все содержащиеся в ней ресурсы и избежать дополнительных расходов.
az group delete --name AzureFunctionsQuickstart-rg