Compartilhar via


Tutorial: Implantar o construtor de API de Dados nos Aplicativos de Contêiner do Azure com a CLI do Azure

O criador de API de dados pode ser implantado rapidamente em serviços do Azure, como o Azure Container Apps, sendo parte da sua pilha de aplicativos. Neste tutorial, você usará a CLI do Azure para automatizar tarefas comuns ao implantar o construtor de API de Dados no Azure. Primeiro, você cria uma imagem de contêiner com o construtor de API de Dados e a armazena no Registro de Contêiner do Azure. Em seguida, você implanta a imagem de contêiner no Azure Container Apps com um banco de dados SQL do Azure de apoio. Todo o processo de autenticação do tutorial ocorre para cada componente usando identidades gerenciadas.

Neste tutorial, você:

  • Criar uma identidade gerenciada com permissões de controle de acesso baseadas em função
  • Implantar o SQL do Azure com o conjunto de dados AdventureWorksLT de exemplo
  • Armazenar a imagem de contêiner no Registro de Contêiner do Azure
  • Implantar o Azure Container App com a imagem de contêiner do Data API Builder

Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.

Pré-requisitos

  • Assinatura do Azure
  • Azure Cloud Shell
    • O Azure Cloud Shell é um ambiente de shell interativo que você pode usar por meio do navegador. Use esse shell e seus comandos pré-instalados para executar o código neste artigo, sem precisar instalar nada em seu ambiente local. Para iniciar o Azure Cloud Shell:
      • Selecione Experimentar em um código ou bloco de comandos neste artigo. Selecionar Experimentar não copia automaticamente o código ou o comando para o Cloud Shell.
      • https://shell.azure.comAcesse ou selecione Iniciar o Cloud Shell.
      • Selecione o Cloud Shell na barra de menus do portal do Azure (https://portal.azure.com)

Criar aplicativo de contêiner

Primeiro, crie uma instância de Aplicativos de Contêiner do Azure com uma identidade gerenciada atribuída pelo sistema. Essa identidade eventualmente recebe permissões de controle de acesso baseado em função para acessar o Azure SQL e o Registro de Contêiner do Azure.

  1. Crie uma variável universal SUFFIX a ser usada para vários nomes de recursos posteriormente neste tutorial.

    let SUFFIX=$RANDOM*$RANDOM
    
  2. Crie uma LOCATION variável com uma região do Azure que você selecionou para usar neste tutorial.

    LOCATION="<azure-region>"
    

    Observação

    Por exemplo, se você quiser implantar na região Oeste dos EUA , use esse script.

    LOCATION="westus"
    

    Para obter uma lista de regiões com suporte para a assinatura atual, use az account list-locations

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

    Para obter mais informações, consulte Regiões do Azure.

  3. Crie uma variável nomeada RESOURCE_GROUP_NAME com o nome do grupo de recursos. Para este tutorial, recomendamos msdocs-dab-*. Você usa esse valor várias vezes neste tutorial.

    RESOURCE_GROUP_NAME="msdocs-dab$SUFFIX"    
    
  4. Criar um novo grupo de recursos usando az group create.

    az group create \
      --name $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --tag "source=msdocs-dab-tutorial"
    
  5. Crie variáveis nomeadas API_CONTAINER_NAME e CONTAINER_ENV_NAME com nomes gerados exclusivamente para sua instância dos Aplicativos de Contêiner do Azure. Você usa essas variáveis ao longo do tutorial.

    API_CONTAINER_NAME="api$SUFFIX"
    CONTAINER_ENV_NAME="env$SUFFIX"
    
  6. Use az containerapp env create para criar um novo ambiente de Aplicativos de Contêiner do Azure.

    az containerapp env create \ 
      --resource-group $RESOURCE_GROUP_NAME \
      --name $CONTAINER_ENV_NAME \
      --logs-destination none \
      --location $LOCATION
    
  7. Crie um novo aplicativo de contêiner usando a mcr.microsoft.com/azure-databases/data-api-builder imagem de contêiner da DAB e o az containerapp create comando. Esse aplicativo de contêiner é executado com êxito, mas não está conectado a nenhum banco de dados.

    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. Obtenha o identificador principal da identidade gerenciada usando az identity show e armazene o valor em uma variável chamada 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" \
    )
    

    Dica

    Você sempre pode verificar a saída deste comando.

    echo $MANAGED_IDENTITY_PRINCIPAL_ID
    

Atribuir permissões

Agora, atribua as permissões de identidade gerenciada atribuídas pelo sistema para ler dados do SQL do Azure e do Registro de Contêiner do Azure. Além disso, atribua suas permissões de identidade para gravar no Registro de Contêiner do Azure.

  1. Crie uma variável nomeada RESOURCE_GROUP_ID para armazenar o identificador do grupo de recursos. Obter o identificador usando az group show. Você usa essa variável várias vezes neste tutorial.

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

    Dica

    Você sempre pode verificar a saída deste comando.

    echo $RESOURCE_GROUP_ID
    
  2. Use az role assignment create para atribuir a função AcrPush à sua conta para que você possa enviar contêineres por push para o Registro de Contêiner do 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. Atribua a função AcrPull à sua identidade gerenciada usando az role assignment create novamente. Essa atribuição permite que a identidade gerenciada baixe imagens de contêiner do Azure Container Registry. A identidade gerenciada eventualmente é atribuída a uma instância dos Aplicativos de Contêiner do Azure.

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

Implantar banco de dados

Em seguida, implante um novo servidor e um banco de dados no serviço SQL do Azure. O banco de dados usa o conjunto de dados de exemplo AdventureWorksLT .

  1. Crie uma variável nomeada SQL_SERVER_NAME com um nome gerado exclusivamente para sua instância do SQL Server do Azure. Você usará essa variável mais adiante nesta seção.

    SQL_SERVER_NAME="srvr$SUFFIX"
    
  2. Criar um novo recurso do SQL Server do Azure usando az sql server create. Configure a identidade gerenciada como o administrador deste servidor.

    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. Use az sql server firewall-rule create para criar uma regra de firewall para permitir o acesso dos serviços do 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. Use az sql db create para criar um banco de dados no SQL Server do Azure chamado adventureworks. Configure o banco de dados para usar os dados de exemplo AdventureWorksLT.

    az sql db create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server $SQL_SERVER_NAME \
      --name "adventureworks" \
      --sample-name "AdventureWorksLT"
    
  5. Crie uma variável nomeada SQL_CONNECTION_STRING com a string de conexão para o banco de dados adventureworks na instância do Azure SQL Server. Construa a cadeia de conexão com o nome de domínio totalmente qualificado do servidor usando az sql server show. Você usará essa variável mais adiante neste tutorial.

    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;"
    

    Dica

    Você sempre pode verificar a saída deste comando.

    echo $SQL_CONNECTION_STRING
    

Criar imagem de contêiner

Em seguida, crie uma imagem de contêiner usando um Dockerfile. Em seguida, implante essa imagem de contêiner em uma instância recém-criada do Registro de Contêiner do Azure.

  1. Crie uma variável nomeada CONTAINER_REGISTRY_NAME com um nome gerado exclusivamente para sua instância do Registro de Contêiner do Azure. Você usará essa variável mais adiante nesta seção.

    CONTAINER_REGISTRY_NAME="reg$SUFFIX"
    
  2. Criar uma nova instância do Registro de Contêiner do Azure usando az acr create.

    az acr create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $CONTAINER_REGISTRY_NAME \
      --sku "Standard" \
      --location $LOCATION \
      --admin-enabled false
    
  3. Crie um Dockerfile de vários estágios chamado Dockerfile. No arquivo, implemente estas etapas.

    • Usar a imagem do contêiner mcr.microsoft.com/dotnet/sdk como base para a fase de construção

    • Instale a CLI do DAB.

    • Crie um arquivo de configuração para uma conexão de banco de dados SQL (mssql) usando a variável de DATABASE_CONNECTION_STRING ambiente como a cadeia de conexão.

    • Crie uma entidade chamada Product mapeada para a SalesLT.Product tabela.

    • Copie o arquivo de configuração para a imagem final mcr.microsoft.com/azure-databases/data-api-builder do contêiner.

    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. Crie o Dockerfile como uma tarefa do Registro de Contêiner do Azure usando az acr build.

    az acr build \
      --registry $CONTAINER_REGISTRY_NAME \
      --image adventureworkslt-dab:latest \
      --image adventureworkslt-dab:{{.Run.ID}} \
      --file Dockerfile \
      .
    
  5. Use az acr show para obter o ponto de extremidade do registro de contêiner e armazená-lo em uma variável chamada CONTAINER_REGISTRY_LOGIN_SERVER.

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

    Dica

    Você sempre pode verificar a saída deste comando.

    echo $CONTAINER_REGISTRY_LOGIN_SERVER
    

Implantar imagem de contêiner

Por fim, atualize o Aplicativo de Contêiner do Azure com a nova imagem e credenciais de contêiner personalizadas. Teste o aplicativo em execução para validar sua conectividade com o banco de dados.

  1. Configure o aplicativo de contêiner para usar o registro de contêiner usando 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. Use az containerapp secret set para criar um segredo nomeado conn-string com a cadeia de conexão SQL do Azure.

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

    Importante

    Essa cadeia de conexão não inclui nenhum nome de usuário ou senha. A cadeia de conexão usa a identidade gerenciada para acessar o banco de dados SQL do Azure. Isso torna seguro usar a cadeia de conexão como um segredo no host.

  3. Atualize o aplicativo de contêiner com sua nova imagem de contêiner personalizada usando az containerapp update. Defina a variável de ambiente DATABASE_CONNECTION_STRING para ler do conn-string segredo previamente criado.

    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. Recupere o nome de domínio totalmente qualificado da última revisão no aplicativo de contêiner em execução usando az containerapp show. Armazene esse valor em uma variável chamada APPLICATION_URL.

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

    Dica

    Você sempre pode verificar a saída deste comando.

    echo $APPLICATION_URL
    
  5. Navegue até a URL e teste a Product API REST.

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

    Aviso

    A implantação pode levar até um minuto. Se você não estiver vendo uma resposta bem-sucedida, aguarde e atualize seu navegador.

Limpar os recursos

Quando você não precisar mais do aplicativo de exemplo ou dos recursos, remova a implantação correspondente e todos os recursos.

az group delete \
  --name $RESOURCE_GROUP_NAME

Próxima etapa