Tutorial: Implementar o Construtor de API de Dados no Azure Container Apps com a CLI do Azure
O construtor de API de Dados pode ser rapidamente implementado em serviços do Azure, como o Azure Container Apps, como parte da pilha de aplicações. Neste tutorial, vai utilizar a CLI do Azure para automatizar tarefas comuns ao implementar o Construtor de API de Dados no Azure. Primeiro, vai criar uma imagem de contentor com o Construtor de API de Dados e armazená-la em Azure Container Registry. Em seguida, implemente a imagem de contentor no Azure Container Apps com uma base de dados de SQL do Azure de cópia de segurança. Todo o tutorial é autenticado em cada componente através de identidades geridas.
Neste tutorial:
- Create uma identidade gerida com permissões de controlo de acesso baseadas em funções
- Implementar SQL do Azure com o conjunto de dados AdventureWorksLT de exemplo
- Testar a imagem de contentor no Azure Container Registry
- Implementar a Aplicação de Contentor do Azure com a imagem de contentor do construtor de API de Dados
Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.
Pré-requisitos
- Subscrição do Azure
- Azure Cloud Shell
- O Azure Cloud Shell é um ambiente de shell interativo que pode utilizar através do browser. Utilize esta shell e os respetivos comandos pré-instalados para executar o código neste artigo, sem ter de instalar nada no seu ambiente local. Para iniciar o Azure Cloud Shell:
- Selecione Experimentar num código ou bloco de comandos neste artigo. Selecionar Experimentar não copia automaticamente o código ou comando para Cloud Shell.
- Aceda a https://shell.azure.comou selecione Iniciar Cloud Shell.
- Selecione Cloud Shell na barra de menus do portal do Azure (https://portal.azure.com)
- O Azure Cloud Shell é um ambiente de shell interativo que pode utilizar através do browser. Utilize esta shell e os respetivos comandos pré-instalados para executar o código neste artigo, sem ter de instalar nada no seu ambiente local. Para iniciar o Azure Cloud Shell:
Create aplicação de contentor
Primeiro, crie uma instância do Azure Container Apps com uma identidade gerida atribuída pelo sistema. Esta identidade é eventualmente concedida permissões de controlo de acesso baseado em funções para aceder a SQL do Azure e Azure Container Registry.
Create uma variável universal
SUFFIX
a utilizar para vários nomes de recursos mais à frente neste tutorial.let SUFFIX=$RANDOM*$RANDOM
Create uma
LOCATION
variável com uma região do Azure que selecionou para utilizar neste tutorial.LOCATION="<azure-region>"
Nota
Por exemplo, se quiser implementar na região E.U.A. Oeste , utilizaria este script.
LOCATION="westus"
Para obter uma lista de regiões suportadas para a subscrição atual, utilize
az account list-locations
az account list-locations --query "[].{Name:displayName,Slug:name}" --output table
Para obter mais informações, veja Regiões do Azure.
Create uma variável com o nome
RESOURCE_GROUP_NAME
do grupo de recursos. Para este tutorial, recomendamosmsdocs-dab-*
. Este valor é utilizado várias vezes neste tutorial.RESOURCE_GROUP_NAME="msdocs-dab$SUFFIX"
Create um novo grupo de recursos com
az group create
.az group create \ --name $RESOURCE_GROUP_NAME \ --location $LOCATION \ --tag "source=msdocs-dab-tutorial"
Create variáveis denominadas
API_CONTAINER_NAME
eCONTAINER_ENV_NAME
com nomes gerados exclusivamente para a instância do Azure Container Apps. Utiliza estas variáveis ao longo do tutorial.API_CONTAINER_NAME="api$SUFFIX" CONTAINER_ENV_NAME="env$SUFFIX"
Utilize
az containerapp env create
para criar um novo ambiente do Azure Container Apps.az containerapp env create \ --resource-group $RESOURCE_GROUP_NAME \ --name $CONTAINER_ENV_NAME \ --logs-destination none \ --location $LOCATION
Create uma nova aplicação de contentor com o
mcr.microsoft.com/azure-databases/data-api-builder
Imagem de contentor da DAB e oaz containerapp create
comando. Esta aplicação de contentor é executada com êxito, mas não está ligada a nenhuma base 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 gerida com
az identity show
e armazene o valor numa variável com o nomeMANAGED_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
Pode sempre verificar a saída deste comando.
echo $MANAGED_IDENTITY_PRINCIPAL_ID
Atribuir permissões
Agora, atribua as permissões de identidade gerida atribuídas pelo sistema para ler dados de SQL do Azure e Azure Container Registry. Além disso, atribua as suas permissões de identidade para escrever no Azure Container Registry.
Create uma variável com o nome
RESOURCE_GROUP_ID
para armazenar o identificador do grupo de recursos. Obtenha o identificador comaz group show
. Irá utilizar esta variável várias vezes neste tutorial.RESOURCE_GROUP_ID=$( \ az group show \ --name $RESOURCE_GROUP_NAME \ --query "id" \ --output "tsv" \ )
Dica
Pode sempre verificar a saída deste comando.
echo $RESOURCE_GROUP_ID
Utilize
az role assignment create
para atribuir a função AcrPush à sua conta para que possa enviar contentores para Azure Container Registry.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 novamente a função AcrPull à sua identidade
az role assignment create
gerida. Esta atribuição permite que a identidade gerida extraia imagens de contentor do Azure Container Registry. A identidade gerida é eventualmente atribuída a uma instância do Azure Container Apps.# AcrPull az role assignment create \ --assignee $MANAGED_IDENTITY_PRINCIPAL_ID \ --role "7f951dda-4ed3-4680-a7ca-43fe172d538d" \ --scope $RESOURCE_GROUP_ID
Implementar base de dados
Em seguida, implemente um novo servidor e base de dados no serviço SQL do Azure. A base de dados utiliza o conjunto de dados de exemplo AdventureWorksLT .
Create uma variável denominada
SQL_SERVER_NAME
com um nome gerado exclusivamente para a instância do servidor SQL do Azure. Irá utilizar esta variável mais à frente nesta secção.SQL_SERVER_NAME="srvr$SUFFIX"
Create um novo recurso de servidor SQL do Azure com
az sql server create
. Configure a identidade gerida como 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
Utilize
az sql server firewall-rule create
para criar uma regra de firewall para permitir o acesso a partir 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"
Utilize
az sql db create
para criar uma base de dados no servidor SQL do Azure com o nomeadventureworks
. Configure a base de dados para utilizar 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 com o nome
SQL_CONNECTION_STRING
com o cadeia de ligação daadventureworks
base de dados na instância do servidor SQL do Azure. Construa o cadeia de ligação com o nome de domínio completamente qualificado do servidor comaz sql server show
. Irá utilizar esta 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
Pode sempre verificar a saída deste comando.
echo $SQL_CONNECTION_STRING
Criar imagem de contentor
Em seguida, crie uma imagem de contentor com um Dockerfile. Em seguida, implemente essa imagem de contentor numa instância de Azure Container Registry criada recentemente.
Create uma variável denominada
CONTAINER_REGISTRY_NAME
com um nome gerado exclusivamente para a sua instância Azure Container Registry. Irá utilizar esta variável mais à frente nesta secção.CONTAINER_REGISTRY_NAME="reg$SUFFIX"
Create uma nova instância de Azure Container Registry com
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árias fases com o nome
Dockerfile
. No ficheiro, implemente estes passos.Utilizar a imagem de
mcr.microsoft.com/dotnet/sdk
contentor como base da fase de compilaçãoInstale a CLI do DAB.
Create um ficheiro de configuração para uma ligação de base de dados SQL (
mssql
) com a variável deDATABASE_CONNECTION_STRING
ambiente como a cadeia de ligação.Create uma entidade denominada
Product
mapeada para aSalesLT.Product
tabela.Copie o ficheiro de configuração para a imagem de contentor final
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
Crie o Dockerfile como uma tarefa Azure Container Registry com
az acr build
.az acr build \ --registry $CONTAINER_REGISTRY_NAME \ --image adventureworkslt-dab:latest \ --image adventureworkslt-dab:{{.Run.ID}} \ --file Dockerfile \ .
Utilize
az acr show
para obter o ponto final do registo de contentor e armazená-lo numa 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
Pode sempre verificar a saída deste comando.
echo $CONTAINER_REGISTRY_LOGIN_SERVER
Implementar imagem de contentor
Por fim, atualize a Aplicação de Contentor do Azure com as novas credenciais e imagem de contentor personalizadas. Teste a aplicação em execução para validar a conectividade à base de dados.
Configure a aplicação de contentor para utilizar o registo de contentor com
az containerapp registry set
.az containerapp registry set \ --resource-group $RESOURCE_GROUP_NAME \ --name $API_CONTAINER_NAME \ --server $CONTAINER_REGISTRY_LOGIN_SERVER \ --identity "system"
Utilize
az containerapp secret set
para criar um segredo com o nomeconn-string
com o SQL do Azure cadeia de ligação.az containerapp secret set \ --resource-group $RESOURCE_GROUP_NAME \ --name $API_CONTAINER_NAME \ --secrets conn-string="$SQL_CONNECTION_STRING"
Importante
Este cadeia de ligação não inclui nenhum nome de utilizador ou palavra-passe. O cadeia de ligação utiliza a identidade gerida para aceder à base de dados SQL do Azure. Isto torna seguro utilizar o cadeia de ligação como segredo no anfitrião.
Atualize a aplicação de contentor com a sua nova imagem de contentor personalizada com
az containerapp update
. Defina aDATABASE_CONNECTION_STRING
variável de ambiente para ler a partir 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
Obtenha o nome de domínio completamente qualificado da revisão mais recente na aplicação de contentor em execução com
az containerapp show
. Armazene esse valor numa variável chamadaAPPLICATION_URL
.APPLICATION_URL=$( \ az containerapp show \ --resource-group $RESOURCE_GROUP_NAME \ --name $API_CONTAINER_NAME \ --query "properties.latestRevisionFqdn" \ --output "tsv" \ )
Dica
Pode sempre verificar a saída deste comando.
echo $APPLICATION_URL
Navegue para o URL e teste a
Product
API REST.echo "https://$APPLICATION_URL/api/Product"
Aviso
A implementação pode demorar até um minuto. Se não estiver a ver uma resposta bem-sucedida, aguarde e atualize o browser.
Limpar os recursos
Quando já não precisar da aplicação ou dos recursos de exemplo, remova a implementação correspondente e todos os recursos.
az group delete \
--name $RESOURCE_GROUP_NAME