Размещение приложения Устойчивые функции с серверной частью MSSQL в Контейнеры приложений Azure (изолированный .NET)

Контейнеры приложений Azure является единственным вариантом размещения, поддерживающим автомасштабирование на основе событий (масштабирование до нуля) для Устойчивые функции при использовании поставщика хранилища Microsoft SQL (MSSQL. Если вы используете другую серверную часть хранилища, необходимо задать минимальное число реплик больше нуля.

Tip

Для новых проектов рекомендуется использовать планировщик задач Durable Task Scheduler, который является рекомендуемым серверным сервером, управляемым Azure для устойчивых рабочих процессов. В этом руководстве описывается серверная часть MSSQL.

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

В этой статье вы узнаете, как:

  • Создайте образ Docker из локального проекта устойчивых функций.
  • Создайте приложение контейнера Azure и связанные ресурсы.
  • Разверните образ в приложении контейнера Azure и настройте проверку подлинности.

Необходимые условия

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

В этом руководстве предполагается, что у вас есть рабочий .NET изолированный проект Устойчивые функции, настроенный с помощью серверной части MSSQL. Если у вас еще нет одного, следуйте краткому руководству ПО MSSQL , чтобы создать и проверить его локально, а затем вернитесь сюда.

Прежде чем продолжить, убедитесь, что:

  • Проект предназначен для .NET 8.0 с изолированной рабочей моделью
  • Поставщик хранилища MSSQL настроен в host.json
  • Приложение успешно работает с func start

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

  1. В корневом каталоге проекта создайте файл с именем Dockerfile.

  2. Скопируйте и вставьте следующее содержимое в Dockerfile.

    FROM mcr.microsoft.com/dotnet/sdk:8.0 AS installer-env
    
    COPY . /src/dotnet-function-app
    RUN cd /src/dotnet-function-app && \
    mkdir -p /home/site/wwwroot && \
    dotnet publish *.csproj --output /home/site/wwwroot
    
    # To enable ssh & remote debugging on app service change the base image to the one below
    # FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0-appservice
    FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0
    ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
        AzureFunctionsJobHost__Logging__Console__IsEnabled=true
    
    COPY --from=installer-env ["/home/site/wwwroot", "/home/site/wwwroot"]
    
  3. Сохраните файл.

  4. Добавьте dockerignore-файл со следующим содержимым:

    local.settings.json
    
  5. Сохраните файл dockerignore .

Создание образа контейнера

Выполните сборку образа Docker. Полный список поддерживаемых базовых образов функций Azure в базе функций Azure от Майкрософт | Центр Docker

  1. Запустите демон Docker.

  2. Войдите в Docker с помощью docker login команды.

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

  4. Перейдите в корневой каталог проекта.

  5. Выполните следующую команду, чтобы создать образ, заменив <DOCKER_ID> на ваш идентификатор учетной записи Docker Hub.

    dockerId=<DOCKER_ID>
    imageName=<IMAGE_NAME>
    imageVersion=v1.0.0
    
    docker build --tag $dockerId/$imageName:$imageVersion .
    

    Note

    Если вы работаете на компьютере Mac серии M, используйте --platform linux/amd64 вместо этого.

  6. Отправьте образ в Docker:

    docker push $dockerId/$imageName:$imageVersion
    

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

Создание ресурсов Azure для Устойчивые функции в приложениях контейнеров

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

  • Группа ресурсов Azure: Группа ресурсов, содержащая все созданные ресурсы.
  • Среда приложения контейнера Azure: Среда, в которой размещено приложение контейнера.
  • Azure Container App: Образ, содержащий приложение на основе Устойчивые функции, развертывается на этом приложении.
  • Учетная запись хранения Azure: Требуется приложению-функции для хранения данных, связанных с приложениями, таких как код приложения.

Начальная настройка

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

    az login  
    
    az account set -s <subscription_name>
    
  2. Выполните необходимые команды, чтобы настроить расширение ИНТЕРФЕЙСА командной строки для приложений контейнеров Azure:

    az upgrade
    
    az extension add --name containerapp --upgrade
    
    az provider register --namespace Microsoft.App
    
    az provider register --namespace Microsoft.OperationalInsights
    

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

  1. Задайте переменные среды.

    location=<REGION>
    resourceGroup=<RESOURCE_GROUP_NAME>
    storage=<STORAGE_NAME>
    containerAppEnv=<CONTAINER_APP_ENVIRONMNET_NAME>
    functionApp=<APP_NAME>
    vnet=<VNET_NAME>
    
  2. Создайте группу ресурсов.

    az group create --name $resourceGroup --location $location
    
  3. Создайте среду приложения контейнера.

    az containerapp env create \
      --enable-workload-profiles \
      --resource-group $resourceGroup \
      --name $containerAppEnv \
      --location $location \
    
  4. Создайте приложение-контейнер на основе образа устойчивых функций.

    az containerapp create --resource-group $resourceGroup \
    --name $functionApp \
    --environment $containerAppEnv \
    --image $dockerId/$imageName:$imageVersion \
    --ingress external \
    --kind functionapp \
    --query properties.outputs.fqdn
    
  5. Запишите URL-адрес приложения, который должен выглядеть примерно так https://<APP_NAME>.<ENVIRONMENT_IDENTIFIER>.<REGION>.azurecontainerapps.io.

Создание баз данных

  1. Создайте учетную запись хранения Azure, необходимую приложением-функцией.

    az storage account create --name $storage --location $location --resource-group $resourceGroup --sku Standard_LRS
    
  2. На портале Azure создайте базу данных SQL Azure для сохранения сведений о состоянии. Во время создания:

Настройка проверки подлинности на основе удостоверений

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

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

  1. Задайте переменные среды.

    subscription=<SUBSCRIPTION_ID>
    identity=<IDENTITY_NAME>
    
  2. Создать ресурс управляемой идентичности.

    echo "Creating $identity"
    az identity create -g $resourceGroup -n $identity --location "$location"
    
  3. Назначьте идентификатор пользователя приложению-контейнеру.

    echo "Assigning $identity to app"
    az containerapp identity assign --resource-group $resourceGroup --name $functionApp --user-assigned $identity
    
  4. Задайте область разрешений управления доступом на основе ролей (RBAC).

    scope="/subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Storage/storageAccounts/$storage"
    
  5. Получите удостоверение clientIdпользователя.

    # Get the identity's ClientId 
    clientId=$(az identity show --name $identity --resource-group $resourceGroup --query 'clientId' --output tsv)
    
  6. Назначьте роль владельца данных BLOB-объектов хранилища для доступа к учетной записи хранения.

    echo "Assign Storage Blob Data Owner role to identity"
    az role assignment create --assignee "$clientId" --role "Storage Blob Data Owner" --scope "$scope"
    

Настройка параметров приложения

Note

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

  1. В ресурсе базы данных SQL на портале Azure перейдите кстрокам подключения>, чтобы найти строку подключения.

    Снимок экрана строки подключения к базе данных Azure SQL в портале Azure.

    Строка подключения должна иметь формат, аналогичный следующему:

    dbserver=<SQL_SERVER_NAME>
    sqlDB=<SQL_DB_NAME>
    username=<DB_USER_LOGIN>
    password=<DB_USER_PASSWORD>
    
    connStr="Server=tcp:$dbserver.database.windows.net,1433;Initial Catalog=$sqlDB;Persist Security Info=False;User ID=$username;Password=$password;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
    

    Если вы забыли пароль на предыдущем этапе создания базы данных, его можно сбросить на ресурсе SQL Server.

    Скриншот кнопки сброса пароля на странице ресурса сервера Azure SQL.

  2. Сохраните строку подключения базы данных SQL в виде секрета , называемого sqldbconnection в приложении-контейнере.

    az containerapp secret set \
    --resource-group $resourceGroup \
    --name $functionApp \
    --secrets sqldbconnection=$connStr
    
  3. Добавьте в приложение следующие параметры:

    az containerapp update \
    -n $functionApp \
    -g $resourceGroup \
    --set-env-vars SQLDB_Connection=secretref:sqldbconnection \
    AzureWebJobsStorage__accountName=$storage \
    AzureWebJobsStorage__clientId=$clientId \
    AzureWebJobsStorage__credential=managedidentity \
    FUNCTIONS_WORKER_RUNTIME=dotnet-isolated
    

Тестирование развернутого приложения Устойчивые функции

  1. Используйте средство тестирования HTTP для отправки POST запроса в конечную точку триггера HTTP, которая должна быть похожа на:

    https://<APP NAME>.<ENVIRONMENT_IDENTIFIER>.<REGION>.azurecontainerapps.io/api/DurableFunctionsOrchestrationCSharp1_HttpStart
    

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

  2. Скопируйте или вставьте значение statusQueryGetUri URL-адреса в адресную строку браузера и выполните его. Кроме того, можно продолжать использовать средство тестирования HTTP для выдачи GET запроса.

    Запрос к экземпляру оркестрации для проверки статуса. Вы должны увидеть, что экземпляр завершился и увидеть выходные данные или результаты приложения Устойчивые функции.

    {
        "name":"HelloCities",
        "instanceId":"7f99f9474a6641438e5c7169b7ecb3f2",
        "runtimeStatus":"Completed",
        "input":null,
        "customStatus":null,
        "output":"Hello, Tokyo! Hello, London! Hello, Seattle!",
        "createdTime":"2023-01-31T18:48:49Z",
        "lastUpdatedTime":"2023-01-31T18:48:56Z"
    }
    

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