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)
- 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:
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.
Create uma variável universal
SUFFIX
a ser usada para vários nomes de recursos posteriormente neste tutorial.let SUFFIX=$RANDOM*$RANDOM
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.
Create uma variável chamada
RESOURCE_GROUP_NAME
com o nome do grupo de recursos. Para este tutorial, recomendamosmsdocs-dab-*
. Você usa esse valor várias vezes neste tutorial.RESOURCE_GROUP_NAME="msdocs-dab$SUFFIX"
Create um novo grupo de recursos usando
az group create
.az group create \ --name $RESOURCE_GROUP_NAME \ --location $LOCATION \ --tag "source=msdocs-dab-tutorial"
Create variáveis nomeadas
API_CONTAINER_NAME
eCONTAINER_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"
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
Create um novo aplicativo de contêiner usando o
mcr.microsoft.com/azure-databases/data-api-builder
Imagem de contêiner do DAB e oaz 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
Obtenha o identificador principal da identidade gerenciada usando
az identity show
e armazene o valor em uma variável chamadaMANAGED_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.
Create uma variável chamada
RESOURCE_GROUP_ID
para armazenar o identificador do grupo de recursos. Obtenha o identificador usandoaz 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
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
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 .
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"
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
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"
Use
az sql db create
para criar um banco de dados no servidor SQL do Azure chamadoadventureworks
. Configure o banco de dados para usar osAdventureWorksLT
dados de exemplo.az sql db create \ --resource-group $RESOURCE_GROUP_NAME \ --server $SQL_SERVER_NAME \ --name "adventureworks" \ --sample-name "AdventureWorksLT"
Create uma variável chamada
SQL_CONNECTION_STRING
com o cadeia de conexão para oadventureworks
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 usandoaz 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.
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"
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
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 buildInstale a CLI do DAB.
Create um arquivo de configuração para uma conexão de banco de dados SQL (
mssql
) usando aDATABASE_CONNECTION_STRING
variável de ambiente como cadeia de conexão.Create uma entidade chamada
Product
mapeada para aSalesLT.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
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 \ .
Use
az acr show
para obter o ponto de extremidade do registro de contêiner e armazená-lo em uma variável chamadaCONTAINER_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.
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"
Use
az containerapp secret set
para criar um segredo chamadoconn-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.
Atualize o aplicativo de contêiner com sua nova imagem de contêiner personalizada usando
az containerapp update
. Defina aDATABASE_CONNECTION_STRING
variável de ambiente para ler do segredo criadoconn-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
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 chamadaAPPLICATION_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
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