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


Быстрый старт: Создание функции в Azure с помощью командной строки

В этой статье вы используете локальные средства командной строки для создания функции, которая отвечает на HTTP-запросы. После того как вы проверите код локально, вы развернете его в Azure Functions на бессерверном плане размещения Flex Consumption.

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

Выберите предпочитаемый язык разработки в верхней части статьи.

Prerequisites

  • Пакет разработчиков Java 17
    • Если вы используете другую поддерживаемую версию Java, необходимо обновить файл pom.xml проекта.
    • Переменная JAVA_HOME среды должна быть задана в расположении установки правильной версии пакета средств разработки Java (JDK).
  • Apache Maven 3.8.x
  • Go, рекомендуется использовать последнюю версию. Используйте команду go version, чтобы проверить установленную версию.

Установка основных инструментов Функций Azure

Рекомендуемый способ установки основных средств зависит от операционной системы локального компьютера разработки.

Следующая процедура устанавливает Core Tools версии v4.x с помощью установщика Windows (MSI). Дополнительные сведения о других установщиках на основе пакетов, см. в файле readme для Core Tools.

Скачайте и запустите установщик Core Tools для используемой версии Windows:

Если вы ранее использовали установщик 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. В этом разделе вы создадите проект кода, содержащий одну функцию.

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

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

    func init --worker-runtime node --language javascript 
    
  1. В терминале или командной строке выполните следующую func init команду, чтобы создать проект приложения-функции в текущей папке:

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

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

    func init --worker-runtime node --language typescript 
    
  1. В терминале или командной строке выполните следующую func init команду, чтобы создать проект приложения-функции в текущей папке:

    func init --worker-runtime custom 
    
  1. В пустой папке выполните следующую mvn команду, чтобы создать проект кода из архетипа Функций Azure Maven:

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

    Important

    • Используйте -DjavaVersion=11, чтобы функции выполнялись на Java 11. Дополнительные сведения см. в версиях Java.
    • JAVA_HOME Задайте для переменной среды расположение установки правильной версии JDK, чтобы завершить эту статью.
  2. Maven запрашивает значения, которые позволят завершить создание проекта развертывания.
    При появлении запроса укажите следующие значения:

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

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

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

    cd fabrikam-functions
    

    Вы можете просмотреть созданный шаблоном код для новой функции триггера HTTP в Function.java в каталоге проекта \src\main\java\com\fabrikam .

  1. Используйте эту 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. Чтобы реализовать эту функцию, вам нужно добавить к ней обработчик и скомпилировать исполняемый файл.

  1. Нажмите клавиши CTRL+N (или CMD+N в macOS), чтобы создать новый файл. Сохраните его с именем handler.go в корневой папке приложения-функции (где расположен файл host.json).

  2. Добавьте в файл 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))
    }
    
  3. Нажмите клавиши CTRL+SHIFT+' или выберите команду New Terminal (Создать терминал) в меню Terminal (Терминал), чтобы открыть новый встроенный терминал VS Code.

  4. Скомпилируйте этот пользовательский обработчик с помощью следующей команды. Исполняемый файл с именем handler (handler.exe в Windows) выводится в корневую папку приложения-функции.

    go build handler.go
    

Настройка приложения-функции

Узел функции должен быть настроен так, чтобы при запуске выполнять двоичный файл пользовательского обработчика.

  1. Откройте файл host.json.

  2. В разделе customHandler.description задайте значение defaultExecutablePath для параметра handler (или handler.exe в среде Windows).

  3. В разделе customHandler добавьте свойство с именем enableForwardingHttpRequest и задайте для него значение true. Для функций, которые содержат только триггер HTTP, этот параметр упрощает программирование. Он позволяет работать с обычным HTTP-запросом вместо полезных данных пользовательского обработчика запросов.

  4. Убедитесь, что раздел customHandler похож на представленный здесь пример. Сохраните файл.

    "customHandler": {
      "description": {
        "defaultExecutablePath": "handler",
        "workingDirectory": "",
        "arguments": []
      },
      "enableForwardingHttpRequest": true
    }
    

Теперь приложение-функция будет запускать исполняемый файл пользовательского обработчика.

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

Проверьте новую функцию, запустив проект локально и вызвав конечную точку функции.

  1. Используйте эту команду, чтобы запустить локальный узел среды выполнения Функций Azure в корневой папке проекта:

    func start  
    
    npm install
    npm start
    
    mvn 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
     ...
    
     
  2. Скопируйте URL-адрес вашей функции из этих данных HttpExample, вставьте в браузер и перейдите по URL-адресу функции. Вы должны получить успешный ответ с сообщением «hello world».

    Note

    Так как авторизация ключа доступа не применяется при локальном запуске, url-адрес функции, возвращенный не включает значение ключа доступа, и вам не нужно вызывать функцию.

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

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

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

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

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

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

    az login
    

    Команда az login входит в вашу учетную запись Azure. Пропустите этот шаг при запуске в Azure Cloud Shell.

  2. Если вы еще этого не сделали, используйте эту az extension add команду для установки расширения Application Insights:

    az extension add --name application-insights
    
  3. Используйте команду az group create , чтобы создать группу ресурсов с именем AzureFunctionsQuickstart-rg в выбранном регионе:

    az group create --name "AzureFunctionsQuickstart-rg" --location "<REGION>"
    

    В этом примере замените <REGION> на регион рядом с вами, который поддерживает план потребления Flex. Используйте команду az functionapp list-flexconsumption-locations , чтобы просмотреть список поддерживаемых в настоящее время регионов.

  4. Используйте команду 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, которым предоставлены разрешения для определенных ресурсов.

  5. Используйте этот скрипт для создания управляемого удостоверения, назначаемого пользователем, анализа возвращаемых свойств 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 используется для получения идентификатора учетной записи хранения.

  6. Используйте следующую команду 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. Этот экземпляр не создает затраты, пока вы не активируете его.

  7. Используйте этот скрипт, чтобы добавить ваше пользовательское управляемое удостоверение в роль издателя метрик мониторинга в экземпляре 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 с назначенным пользователем управляемым удостоверением.

  1. Используйте этот скрипт, чтобы получить 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> на название вашей учетной записи хранения соответственно.

  2. Выполните команду 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 команды.

  1. В корневой папке проекта выполните следующую 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
     
  2. В локальном терминале или командной строке выполните следующую команду, чтобы получить значение конечной точки URL-адреса, включая ключ доступа:

    func azure functionapp list-functions <APP_NAME> --show-keys
    

    В этом примере снова замените <APP_NAME> на имя вашего приложения.

  3. Скопируйте возвращаемый URL-адрес конечной точки и ключ, который используется для вызова конечной точки функции.

Обновление файла pom.xml

После успешного создания приложения-функции в Azure обновите файл pom.xml, чтобы Maven смог развернуть ваше новое приложение. В противном случае Maven создает новый набор ресурсов Azure во время развертывания.

  1. В 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> на имя вашего приложения-функции.

  2. В корневом каталоге проекта откройте файл pom.xml в текстовом редакторе, найдите properties элемент и обновите следующие значения свойств:

    Название свойства Value
    java.version Используйте ту же поддерживаемую версию стека языков , проверенную локально, например 17.
    azure.functions.maven.plugin.version 1.37.1
    azure.functions.java.library.version 3.1.0
    functionAppName Имя приложения-функции в Azure.
  3. 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>
    
  4. В новом элементе configuration выполните следующие точные замены значений, представленных многоточиями (...):

    Configuration Value
    region Код региона существующего приложения-функции, например eastus.
    deploymentStorageAccount Имя учетной записи хранения.
    deploymentStorageContainer Имя общей папки развертывания, которое следует после \ в значении containerUrl, которое вы получили.
    userAssignedIdentityResourceId Полный идентификатор ресурса управляемого удостоверения, полученного вами.
  5. Сохраните изменения в файле pom.xml .

Теперь вы можете использовать Maven для развертывания проекта кода в существующем приложении.

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

  1. В командной строке выполните следующую команду:

    mvn clean package azure-functions:deploy
    
  2. После успешного развертывания выполните следующую команду Core Tools, чтобы получить значение конечной точки URL-адреса, включая ключ доступа:

    func azure functionapp list-functions <APP_NAME> --show-keys
    

    В этом примере снова замените <APP_NAME> на имя вашего приложения.

  3. Скопируйте возвращаемый 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

Дальнейшие шаги