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


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

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

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

  • Create управляемого удостоверения с разрешениями на управление доступом на основе ролей
  • Развертывание Azure SQL с помощью примера набора данных AdventureWorksLT
  • Размещение образа контейнера в Реестр контейнеров Azure
  • Развертывание контейнерного приложения Azure с помощью образа контейнера конструктора 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).

приложение-контейнер Create

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

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

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

    LOCATION="<azure-region>"
    

    Примечание

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

    LOCATION="westus"
    

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

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

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

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

    RESOURCE_GROUP_NAME="msdocs-dab$SUFFIX"    
    
  4. Create новую группу ресурсов с помощью az group create.

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

    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. Create новое приложение-контейнер с помощью 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. Кроме того, назначьте удостоверениям разрешения на запись в Реестр контейнеров Azure.

  1. Create переменную с именем 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.

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

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

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

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

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

    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 для создания базы данных на сервере Azure SQL с именем adventureworks. Настройте базу данных для использования примеров AdventureWorksLT данных.

    az sql db create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server $SQL_SERVER_NAME \
      --name "adventureworks" \
      --sample-name "AdventureWorksLT"
    
  5. Create переменную с именем SQL_CONNECTION_STRING с строка подключения для adventureworks базы данных в экземпляре сервера Azure SQL. Создайте строка подключения с полным доменным именем сервера с помощью 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. Create переменную с уникальным CONTAINER_REGISTRY_NAME именем для экземпляра Реестр контейнеров Azure. Эта переменная будет использоваться далее в этом разделе.

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

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

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

    • Установите ИНТЕРФЕЙС КОМАНДНОй строки DAB.

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

    • Create сущность с именем Product , сопоставленная с таблицейSalesLT.Product.

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

    FROM mcr.microsoft.com/dotnet/sdk:6.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
    
    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"
    

    Важно!

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

  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

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