Compartilhar via


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

O construtor de API de Dados pode ser implantado rapidamente nos serviços do Azure, como os Aplicativos de Contêiner do Azure, como parte da pilha de aplicativos. Neste tutorial, você usa 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 em Registro de Contêiner do Azure. Em seguida, você implanta a imagem de contêiner nos Aplicativos de Contêiner do Azure com um banco de dados SQL do Azure de suporte. Todo o tutorial é autenticado em cada componente usando identidades gerenciadas.

Neste tutorial, você:

  • Create uma identidade gerenciada com permissões de controle de acesso baseadas em função
  • Implantar SQL do Azure com o conjunto de dados AdventureWorksLT de exemplo
  • Preparar a imagem de contêiner no Registro de Contêiner do Azure
  • Implantar o Aplicativo de Contêiner do Azure com a imagem de contêiner do Construtor de API de Dados

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 Cloud Shell do Azure é 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 Cloud Shell.
      • Vá para https://shell.azure.comou selecione Iniciar Cloud Shell.
      • Selecione Cloud Shell na barra de menus do portal do Azure (https://portal.azure.com)

Create aplicativo de contêiner

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

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

    let SUFFIX=$RANDOM*$RANDOM
    
  2. Create 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. Create uma variável chamada 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. Create um novo grupo de recursos usando az group create.

    az group create \
      --name $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --tag "source=msdocs-dab-tutorial"
    
  5. Create 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. Create um novo aplicativo de contêiner usando o mcr.microsoft.com/azure-databases/data-api-builder Imagem de contêiner do 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 marcar a saída desse comando.

    echo $MANAGED_IDENTITY_PRINCIPAL_ID
    

Atribuir permissões

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

  1. Create uma variável chamada RESOURCE_GROUP_ID para armazenar o identificador do grupo de recursos. Obtenha 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 marcar a saída desse 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 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 efetue pull de imagens de contêiner de Registro de Contêiner do Azure. 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. Create uma variável chamada SQL_SERVER_NAME com um nome gerado exclusivamente para a instância do servidor SQL do Azure. Você usará essa variável mais adiante nesta seção.

    SQL_SERVER_NAME="srvr$SUFFIX"
    
  2. Create um novo recurso de servidor SQL 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 servidor SQL do Azure chamado adventureworks. Configure o banco de dados para usar os AdventureWorksLT dados de exemplo.

    az sql db create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server $SQL_SERVER_NAME \
      --name "adventureworks" \
      --sample-name "AdventureWorksLT"
    
  5. Create uma variável chamada SQL_CONNECTION_STRING com o cadeia de conexão para o adventureworks banco de dados na instância do servidor SQL do Azure. Construa o 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 marcar a saída desse 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 de Registro de Contêiner do Azure recém-criada.

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

    CONTAINER_REGISTRY_NAME="reg$SUFFIX"
    
  2. Create uma nova instância de 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. Create um Dockerfile de vários estágios chamado Dockerfile. No arquivo, implemente essas etapas.

    • Usar a imagem de mcr.microsoft.com/dotnet/sdk contêiner como a base do estágio de build

    • Instale a CLI do DAB.

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

    • Create 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: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. Crie o Dockerfile como uma tarefa 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 marcar a saída desse 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 chamado conn-string com o SQL do Azure cadeia de conexão.

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

    Importante

    Esse cadeia de conexão não inclui nenhum nome de usuário ou senha. O cadeia de conexão usa a identidade gerenciada para acessar o banco de dados SQL do Azure. Isso torna seguro usar o 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 DATABASE_CONNECTION_STRING variável de ambiente para ler do segredo criado conn-string anteriormente.

    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 revisão mais recente 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 marcar a saída desse 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 ou dos recursos de exemplo, remova a implantação correspondente e todos os recursos.

az group delete \
  --name $RESOURCE_GROUP_NAME

Próxima etapa