Partilhar via


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)

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.

  1. Create uma variável universal SUFFIX a utilizar para vários nomes de recursos mais à frente neste tutorial.

    let SUFFIX=$RANDOM*$RANDOM
    
  2. 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.

  3. Create uma variável com o nome RESOURCE_GROUP_NAME do grupo de recursos. Para este tutorial, recomendamos msdocs-dab-*. Este valor é utilizado várias vezes neste tutorial.

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

    az group create \
      --name $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --tag "source=msdocs-dab-tutorial"
    
  5. Create variáveis denominadas API_CONTAINER_NAME e CONTAINER_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"
    
  6. 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
    
  7. Create uma nova aplicação de contentor com o mcr.microsoft.com/azure-databases/data-api-builder Imagem de contentor da DAB e o az 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
    
  8. Obtenha o identificador principal da identidade gerida com az identity show e armazene o valor numa variável com o nome 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

    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.

  1. Create uma variável com o nome RESOURCE_GROUP_ID para armazenar o identificador do grupo de recursos. Obtenha o identificador com az 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
    
  2. 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
    
  3. 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 .

  1. 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"
    
  2. 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
    
  3. 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"
    
  4. Utilize az sql db create para criar uma base de dados no servidor SQL do Azure com o nome adventureworks. Configure a base de dados para utilizar 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 com o nome SQL_CONNECTION_STRING com o cadeia de ligação da adventureworks 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 com az 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.

  1. 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"
    
  2. 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
    
  3. 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ção

    • Instale a CLI do DAB.

    • Create um ficheiro de configuração para uma ligação de base de dados SQL (mssql) com a variável de DATABASE_CONNECTION_STRING ambiente como a cadeia de ligação.

    • Create uma entidade denominada Product mapeada para a SalesLT.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
    
  4. 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 \
      .
    
  5. Utilize az acr show para obter o ponto final do registo de contentor e armazená-lo numa 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

    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.

  1. 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"
    
  2. Utilize az containerapp secret set para criar um segredo com o nome conn-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.

  3. Atualize a aplicação de contentor com a sua nova imagem de contentor personalizada com az containerapp update. Defina a DATABASE_CONNECTION_STRING variável de ambiente para ler a partir 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. 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 chamada APPLICATION_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
    
  5. 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

Passo seguinte