Руководство по развертыванию построителя API данных в приложениях контейнеров Azure с помощью Azure CLI

Конструктор API данных можно быстро развернуть в службах Azure, таких как Azure Container Apps, в составе вашего стека приложений. В этом руководстве вы используете Azure CLI для автоматизации распространенных задач при развертывании построителя API данных в Azure. Сначала вы создадите образ контейнера с помощью построителя API данных и сохраните его в реестре контейнеров Azure. Затем вы развернете образ контейнера в приложениях контейнеров Azure с резервной базой данных SQL Azure. Весь учебник использует аутентификацию в каждом компоненте с помощью управляемых удостоверений.

Изучив это руководство, вы:

  • Создание управляемого удостоверения с разрешениями управления доступом на основе ролей
  • Развертывание SQL Azure с помощью примера набора данных AdventureWorksLT
  • Подготовка образа контейнера в реестре контейнеров Azure
  • Развертывание Azure Container App с образом контейнера для создания API данных

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

Предпосылки

  • Подписка Azure
  • Azure Cloud Shell
    • Azure Cloud Shell — это интерактивная среда оболочки, которую можно использовать в браузере. Используйте эту оболочку и предустановленные команды для запуска кода в этой статье, не устанавливая ничего в локальной среде. Чтобы запустить Azure Cloud Shell, выполните приведенные действия.
      • Выберите "Попробовать" в коде или блоке команд в этой статье. При нажатии кнопки "Попробовать" код или команда не копируется в Cloud Shell.
      • Перейдите в https://shell.azure.comраздел или нажмите кнопку "Запустить Cloud Shell".
      • Выберите Cloud Shell в строке меню портала Azure (https://portal.azure.com)

Создание приложения-контейнера

Сначала создайте экземпляр контейнерных приложений Azure с системно назначенным управляемым удостоверением. Это удостоверение в конечном итоге предоставляет разрешения на управление доступом на основе ролей для доступа к Azure SQL и Реестру контейнеров Azure.

  1. Создайте универсальную переменную SUFFIX , используемую для нескольких имен ресурсов далее в этом руководстве.

    let SUFFIX=$RANDOM*$RANDOM
    
  2. Создайте переменную с выбранным регионом LOCATION Azure, который будет использоваться в этом руководстве.

    LOCATION="<azure-region>"
    

    Замечание

    Например, если вы хотите развернуть в регионе "Запад США", используйте этот скрипт.

    LOCATION="westus"
    

    Чтобы получить список поддерживаемых регионов для текущей подписки, используйте az account list-locations

    az account list-locations --query "[].{Name:displayName,Slug:name}" --output table
    

    Дополнительные сведения см. в регионах Azure.

  3. Создайте переменную RESOURCE_GROUP_NAME с именем группы ресурсов. В этом руководстве рекомендуется msdocs-dab-*. Это значение используется несколько раз в этом руководстве.

    RESOURCE_GROUP_NAME="msdocs-dab$SUFFIX"    
    
  4. Создайте новую группу ресурсов с помощью az group create.

    az group create \
      --name $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --tag "source=msdocs-dab-tutorial"
    
  5. Создайте переменные с уникальными именами API_CONTAINER_NAME и CONTAINER_ENV_NAME для вашего экземпляра Azure Container Apps. Вы используете эти переменные во всем руководстве.

    API_CONTAINER_NAME="api$SUFFIX"
    CONTAINER_ENV_NAME="env$SUFFIX"
    
  6. Используйте az containerapp env create, чтобы создать новую среду для приложений контейнеров Azure.

    az containerapp env create \ 
      --resource-group $RESOURCE_GROUP_NAME \
      --name $CONTAINER_ENV_NAME \
      --logs-destination none \
      --location $LOCATION
    
  7. Создайте приложение-контейнер с помощью mcr.microsoft.com/azure-databases/data-api-builder образа контейнера DAB и az containerapp create команды. Это приложение контейнера успешно работает, но не подключено к какой-либо базе данных.

    az containerapp create \ 
      --resource-group $RESOURCE_GROUP_NAME \
      --environment $CONTAINER_ENV_NAME \
      --name $API_CONTAINER_NAME \
      --image "mcr.microsoft.com/azure-databases/data-api-builder" \
      --ingress "external" \
      --target-port "5000" \
      --system-assigned
    
  8. Получите основной идентификатор управляемого удостоверения с помощью az identity show и запишите его в переменную с именем MANAGED_IDENTITY_PRINCIPAL_ID.

    MANAGED_IDENTITY_PRINCIPAL_ID=$( \
      az containerapp show \ 
        --resource-group $RESOURCE_GROUP_NAME \
        --name $API_CONTAINER_NAME \
        --query "identity.principalId" \
        --output "tsv" \
    )
    

    Подсказка

    Вы всегда можете проверить выходные данные этой команды.

    echo $MANAGED_IDENTITY_PRINCIPAL_ID
    

Назначьте разрешения

Теперь назначьте разрешения системного управляемого удостоверения для чтения данных из Azure SQL и Azure Container Registry. Кроме того, назначьте ваши права доступа для записи в Реестр контейнеров Azure.

  1. Создайте переменную с именем RESOURCE_GROUP_ID для хранения идентификатора группы ресурсов. Получите идентификатор с помощью az group show. Эта переменная используется несколько раз в этом руководстве.

    RESOURCE_GROUP_ID=$( \
      az group show \
        --name $RESOURCE_GROUP_NAME \
        --query "id" \
        --output "tsv" \
    )
    

    Подсказка

    Вы всегда можете проверить выходные данные этой команды.

    echo $RESOURCE_GROUP_ID
    
  2. Используйте az role assignment create, чтобы назначить вашей учетной записи роль AcrPush, чтобы вы могли отправлять контейнеры в реестр контейнеров Azure.

    CURRENT_USER_PRINCIPAL_ID=$( \
      az ad signed-in-user show \
        --query "id" \
        --output "tsv" \
    )
    
    # AcrPush
    az role assignment create \
      --assignee $CURRENT_USER_PRINCIPAL_ID \
      --role "8311e382-0749-4cb8-b61a-304f252e45ec" \
      --scope $RESOURCE_GROUP_ID
    
  3. Назначьте управляемому удостоверению роль AcrPull, используя az role assignment create снова. Это назначение позволяет управляемой идентичности загружать образы контейнеров из репозитория контейнеров Azure. Управляемое удостоверение в итоге назначается экземпляру Azure Container Apps.

    # AcrPull    
    az role assignment create \
      --assignee $MANAGED_IDENTITY_PRINCIPAL_ID \
      --role "7f951dda-4ed3-4680-a7ca-43fe172d538d" \
      --scope $RESOURCE_GROUP_ID
    

Развертывание базы данных

Затем разверните новый сервер и базу данных в службе SQL Azure. В базе данных используется пример набора данных AdventureWorksLT .

  1. Создайте переменную SQL_SERVER_NAME с уникальным именем для экземпляра SQL Server Azure. Эта переменная используется далее в этом разделе.

    SQL_SERVER_NAME="srvr$SUFFIX"
    
  2. Создайте новый ресурс SQL Server Azure с помощью az sql server create. Настройте "managed identity" в качестве администратора этого сервера.

    az sql server create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $SQL_SERVER_NAME \
      --location $LOCATION \
      --enable-ad-only-auth \
      --external-admin-principal-type "User" \
      --external-admin-name $API_CONTAINER_NAME \
      --external-admin-sid $MANAGED_IDENTITY_PRINCIPAL_ID
    
  3. Используйте az sql server firewall-rule create для создания правила брандмауэра, чтобы разрешить доступ из служб Azure.

    az sql server firewall-rule create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server $SQL_SERVER_NAME \
      --name "AllowAzure" \
      --start-ip-address "0.0.0.0" \
      --end-ip-address "0.0.0.0"
    
  4. Используется az sql db create для создания базы данных в именованном сервере adventureworksSQL Azure. Настройте базу данных для использования примера данных AdventureWorksLT.

    az sql db create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server $SQL_SERVER_NAME \
      --name "adventureworks" \
      --sample-name "AdventureWorksLT"
    
  5. Создайте переменную с именем SQL_CONNECTION_STRING, содержащую строку подключения для базы данных adventureworks в вашем экземпляре Azure SQL Server. Создайте строку подключения с полным доменным именем сервера, используя az sql server show. Эта переменная используется далее в этом руководстве.

    SQL_SERVER_ENDPOINT=$( \
      az sql server show \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $SQL_SERVER_NAME \
        --query "fullyQualifiedDomainName" \
        --output "tsv" \
    )
    
    SQL_CONNECTION_STRING="Server=$SQL_SERVER_ENDPOINT;Database=adventureworks;Encrypt=true;Authentication=Active Directory Default;"
    

    Подсказка

    Вы всегда можете проверить выходные данные этой команды.

    echo $SQL_CONNECTION_STRING
    

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

Затем создайте образ контейнера с помощью Dockerfile. Затем разверните этот образ контейнера в только что созданном экземпляре реестра контейнеров Azure.

  1. Создайте переменную CONTAINER_REGISTRY_NAME с уникальным именем для экземпляра реестра контейнеров Azure. Эта переменная используется далее в этом разделе.

    CONTAINER_REGISTRY_NAME="reg$SUFFIX"
    
  2. Создайте новый экземпляр реестра контейнеров Azure с помощью az acr create.

    az acr create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $CONTAINER_REGISTRY_NAME \
      --sku "Standard" \
      --location $LOCATION \
      --admin-enabled false
    
  3. Создание многоэтапного файла Dockerfile с именем Dockerfile. В файле выполните эти действия.

    • mcr.microsoft.com/dotnet/sdk Использование образа контейнера в качестве основы этапа сборки

    • Установите интерфейс командной строки DAB.

    • Создайте файл конфигурации для подключения к базе данных SQL (mssql) с помощью DATABASE_CONNECTION_STRING переменной среды в качестве строки подключения.

    • Создайте сущность с именем Product , сопоставленную с таблицей SalesLT.Product .

    • Скопируйте файл конфигурации в окончательный mcr.microsoft.com/azure-databases/data-api-builder образ контейнера.

    FROM mcr.microsoft.com/dotnet/sdk:8.0-cbl-mariner2.0 AS build
    
    WORKDIR /config
    
    RUN dotnet new tool-manifest
    
    RUN dotnet tool install Microsoft.DataApiBuilder
    
    RUN dotnet tool run dab -- init --database-type "mssql" --connection-string "@env('DATABASE_CONNECTION_STRING')"
    
    RUN dotnet tool run dab -- add Product --source "SalesLT.Product" --permissions "anonymous:read"
    
    FROM mcr.microsoft.com/azure-databases/data-api-builder:latest
    
    COPY --from=build /config /App
    
  4. Создайте Dockerfile в качестве задачи реестра контейнеров Azure с помощью az acr build.

    az acr build \
      --registry $CONTAINER_REGISTRY_NAME \
      --image adventureworkslt-dab:latest \
      --image adventureworkslt-dab:{{.Run.ID}} \
      --file Dockerfile \
      .
    
  5. Используется az acr show для получения конечной точки для реестра контейнеров и хранения ее в переменной с именем CONTAINER_REGISTRY_LOGIN_SERVER.

    CONTAINER_REGISTRY_LOGIN_SERVER=$( \
      az acr show \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $CONTAINER_REGISTRY_NAME \
        --query "loginServer" \
        --output "tsv" \
    )
    

    Подсказка

    Вы всегда можете проверить выходные данные этой команды.

    echo $CONTAINER_REGISTRY_LOGIN_SERVER
    

Развертывание образа контейнера

Наконец, обновите приложение контейнера Azure с помощью нового пользовательского образа контейнера и учетных данных. Проверьте работающее приложение, чтобы проверить его подключение к базе данных.

  1. Настройте приложение-контейнер для использования реестра контейнеров с помощью az containerapp registry set.

    az containerapp registry set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $API_CONTAINER_NAME \
      --server $CONTAINER_REGISTRY_LOGIN_SERVER \
      --identity "system"
    
  2. Используйте az containerapp secret set для создания секрета conn-string с помощью строки подключения к Azure SQL.

    az containerapp secret set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $API_CONTAINER_NAME \
      --secrets conn-string="$SQL_CONNECTION_STRING"
    

    Это важно

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

  3. Обновите контейнерное приложение с помощью az containerapp update нового пользовательского контейнерного образа. DATABASE_CONNECTION_STRING Задайте переменную среды для чтения из ранее созданного секрета conn-string.

    az containerapp update \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $API_CONTAINER_NAME \
      --image "$CONTAINER_REGISTRY_LOGIN_SERVER/adventureworkslt-dab:latest" \
      --set-env-vars DATABASE_CONNECTION_STRING=secretref:conn-string
    
  4. Получите полное доменное имя последней ревизии в запущенном контейнерном приложении с помощью az containerapp show. Сохраните это значение в переменной с именем APPLICATION_URL.

    APPLICATION_URL=$( \
      az containerapp show \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $API_CONTAINER_NAME \
        --query "properties.latestRevisionFqdn" \
        --output "tsv" \
    )
    

    Подсказка

    Вы всегда можете проверить выходные данные этой команды.

    echo $APPLICATION_URL
    
  5. Перейдите по URL-адресу и проверьте Product REST API.

    echo "https://$APPLICATION_URL/api/Product"
    

    Предупреждение

    Развертывание может занять до минуты. Если вы не видите успешный ответ, подождите и обновите браузер.

Очистите ресурсы

Когда вы больше не нуждаетесь в демонстрационном приложении или ресурсах, удалите соответствующее развертывание и все ресурсы.

az group delete \
  --name $RESOURCE_GROUP_NAME

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