Share via


Tutorial: Implantar um aplicativo Dapr em Aplicativos de Contêiner do Azure usando a CLI do Azure

O Dapr (Distributed Application Runtime) ajuda os desenvolvedores a criar microsserviços resilientes e confiáveis. Neste tutorial, um aplicativo Dapr de exemplo é implantado nos Aplicativos de Contêiner do Azure.

Sabe como:

  • Criar um ambiente de aplicativos de contêiner para seus aplicativos de contêiner
  • Criar um repositório de estado do Armazenamento de Blobs do Azure para o aplicativo de contêiner
  • Implantar dois aplicativos que produzem e consomem mensagens e mantê-los no armazenamento de estado
  • Verifique a interação entre os dois microsserviços.

Com os Aplicativos de Contêiner do Azure, você obtém uma versão totalmente gerenciada das APIs do Dapr ao criar microsserviços. Ao usar o Dapr nos Aplicativos de Contêiner do Azure, você pode habilitar sidecars para serem executados ao lado de seus microsserviços que fornecem um rico conjunto de recursos. As APIs Dapr disponíveis incluem chamadas Service to Service, Pub/Sub, Event Bindings, State Stores e Actors.

Neste tutorial, você implanta os mesmos aplicativos a partir do início rápido do Dapr Hello World .

O pedido consiste em:

  • Um aplicativo de contêiner cliente (Python) para gerar mensagens.
  • Um aplicativo de contêiner de serviço (nó) para consumir e manter essas mensagens em um armazenamento de estado

O diagrama de arquitetura a seguir ilustra os componentes que compõem este tutorial:

Diagrama de arquitetura para microsserviços Dapr Hello World em Aplicativos de Contêiner do Azure

Configurar

Para entrar no Azure a partir da CLI, execute o seguinte comando e siga os prompts para concluir o processo de autenticação.

az login

Para garantir que você esteja executando a versão mais recente da CLI, execute o comando upgrade.

az upgrade

Em seguida, instale ou atualize a extensão Aplicativos de Contêiner do Azure para a CLI.

az extension add --name containerapp --upgrade

Agora que a extensão ou módulo atual está instalado, registre os Microsoft.App namespaces e Microsoft.OperationalInsights .

Nota

Os recursos dos Aplicativos de Contêiner do Azure migraram do Microsoft.Web namespace para o Microsoft.App namespace. Consulte Migração de namespace de Microsoft.Web para Microsoft.App em março de 2022 para obter mais detalhes.

az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights

Definir variáveis de ambiente

Defina as seguintes variáveis de ambiente. Substitua <PLACEHOLDERS> pelos seus valores:

RESOURCE_GROUP="<RESOURCE_GROUP>"
LOCATION="<LOCATION>"
CONTAINERAPPS_ENVIRONMENT="<CONTAINERAPPS_ENVIRONMENT>"

Criar um grupo de recursos do Azure

Crie um grupo de recursos para organizar os serviços relacionados à implantação do seu aplicativo de contêiner.

az group create \
  --name $RESOURCE_GROUP \
  --location "$LOCATION"

Criar um ambiente

Um ambiente em Aplicativos de Contêiner do Azure cria um limite seguro em torno de um grupo de aplicativos de contêiner. Os aplicativos de contêiner implantados no mesmo ambiente são implantados na mesma rede virtual e gravam logs no mesmo espaço de trabalho do Log Analytics.

Para criar o ambiente, execute o seguinte comando:

az containerapp env create \
  --name $CONTAINERAPPS_ENVIRONMENT \
  --resource-group $RESOURCE_GROUP \
  --location "$LOCATION"

Configurar um repositório de estado

Criar uma conta de Armazenamento de Blob do Azure

Com o ambiente implantado, a próxima etapa é implantar uma conta de Armazenamento de Blob do Azure que é usada por um dos microsserviços para armazenar dados. Antes de implantar o serviço, você precisa escolher um nome para a conta de armazenamento. Os nomes de conta de armazenamento devem ser exclusivos no Azure, de 3 a 24 caracteres de comprimento e devem conter apenas números e letras minúsculas.

STORAGE_ACCOUNT_NAME="<storage account name>"

Use o comando a seguir para criar a conta de Armazenamento do Azure.

az storage account create \
  --name $STORAGE_ACCOUNT_NAME \
  --resource-group $RESOURCE_GROUP \
  --location "$LOCATION" \
  --sku Standard_RAGRS \
  --kind StorageV2

Configurar uma identidade atribuída pelo usuário para o aplicativo de nó

Enquanto os Aplicativos de Contêiner oferecem suporte à identidade gerenciada atribuída pelo usuário e ao sistema, uma identidade atribuída pelo usuário fornece ao aplicativo de nó habilitado para Dpr permissões para acessar a conta de armazenamento de blob.

  1. Crie uma identidade atribuída pelo usuário.
az identity create --resource-group $RESOURCE_GROUP --name "nodeAppIdentity" --output json

Recupere as principalId propriedades e id armazene em variáveis.

PRINCIPAL_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query principalId | tr -d \")
IDENTITY_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query id | tr -d \")
CLIENT_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query clientId | tr -d \")
  1. Atribuir a Storage Blob Data Contributor função à identidade atribuída pelo usuário

Recupere o ID da assinatura atual.

SUBSCRIPTION_ID=$(az account show --query id --output tsv)
az role assignment create --assignee $PRINCIPAL_ID  \
--role "Storage Blob Data Contributor" \
--scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Storage/storageAccounts/$STORAGE_ACCOUNT_NAME"

Configurar o componente de armazenamento de estado

Há várias maneiras de autenticar recursos externos via Dapr. Este exemplo não usa a API Dapr Secrets em tempo de execução, mas usa um armazenamento de estado baseado no Azure. Portanto, você pode renunciar à criação de um componente de armazenamento secreto e, em vez disso, fornecer acesso direto do aplicativo de nó para o repositório de blob usando a Identidade Gerenciada. Se quiser usar um repositório de estado que não seja do Azure ou a API de Segredos do Dapr em tempo de execução, você pode criar um componente de armazenamento secreto. Esse componente carregaria segredos de tempo de execução para que você possa fazer referência a eles em tempo de execução.

Abra um editor de texto e crie um arquivo de configuração chamado statestore.yaml com as propriedades originadas das etapas anteriores. Esse arquivo ajuda a habilitar seu aplicativo Dapr para acessar sua loja estadual. O exemplo a seguir mostra como seu arquivo statestore.yaml deve parecer quando configurado para sua conta de Armazenamento de Blob do Azure:

# statestore.yaml for Azure Blob storage component
componentType: state.azure.blobstorage
version: v1
metadata:
  - name: accountName
    value: "<STORAGE_ACCOUNT_NAME>"
  - name: containerName
    value: mycontainer
  - name: azureClientId
    value: "<MANAGED_IDENTITY_CLIENT_ID>"
scopes:
  - nodeapp

Para usar esse arquivo, atualize os espaços reservados:

  • Substitua <STORAGE_ACCOUNT_NAME> pelo valor da STORAGE_ACCOUNT_NAME variável que você definiu. Para obter seu valor, execute o seguinte comando:
echo $STORAGE_ACCOUNT_NAME
  • Substitua <MANAGED_IDENTITY_CLIENT_ID> pelo valor da CLIENT_ID variável que você definiu. Para obter seu valor, execute o seguinte comando:
echo $CLIENT_ID

Navegue até o diretório no qual você armazenou o arquivo yaml do componente e execute o seguinte comando para configurar o componente Dapr no ambiente Container Apps. Para obter mais informações sobre como configurar componentes do Dapr, consulte Configurar componentes do Dapr.

az containerapp env dapr-component set \
    --name $CONTAINERAPPS_ENVIRONMENT --resource-group $RESOURCE_GROUP \
    --dapr-component-name statestore \
    --yaml statestore.yaml

Implantar o aplicativo de serviço (servidor Web HTTP)

az containerapp create \
  --name nodeapp \
  --resource-group $RESOURCE_GROUP \
  --user-assigned $IDENTITY_ID \
  --environment $CONTAINERAPPS_ENVIRONMENT \
  --image dapriosamples/hello-k8s-node:latest \
  --min-replicas 1 \
  --max-replicas 1 \
  --enable-dapr \
  --dapr-app-id nodeapp \
  --dapr-app-port 3000 \
  --env-vars 'APP_PORT=3000'

Por padrão, a imagem é extraída do Docker Hub.

Implantar o aplicativo cliente (cliente sem cabeça)

Execute o seguinte comando para implantar o aplicativo de contêiner cliente.

az containerapp create \
  --name pythonapp \
  --resource-group $RESOURCE_GROUP \
  --environment $CONTAINERAPPS_ENVIRONMENT \
  --image dapriosamples/hello-k8s-python:latest \
  --min-replicas 1 \
  --max-replicas 1 \
  --enable-dapr \
  --dapr-app-id pythonapp

Verificar os resultados

Confirmar persistência de estado bem-sucedida

Você pode confirmar se os serviços estão funcionando corretamente exibindo dados em sua conta de Armazenamento do Azure.

  1. Abra o portal do Azure em seu navegador e navegue até sua conta de armazenamento.

  2. Selecione Menu do lado esquerdo Contêineres .

  3. Selecione mycontainer.

  4. Verifique se você pode ver o arquivo nomeado order no contêiner.

  5. Selecione o arquivo.

  6. Selecione a guia Editar .

  7. Selecione o botão Atualizar para observar como os dados são atualizados automaticamente.

Ver registos

Os logs de aplicativos de contêiner são armazenados na ContainerAppConsoleLogs_CL tabela personalizada no espaço de trabalho do Log Analytics. Você pode exibir logs por meio do portal do Azure ou da CLI. Pode haver um pequeno atraso inicialmente para que a tabela apareça no espaço de trabalho.

Use o seguinte comando da CLI para exibir logs usando a linha de comando.

LOG_ANALYTICS_WORKSPACE_CLIENT_ID=`az containerapp env show --name $CONTAINERAPPS_ENVIRONMENT --resource-group $RESOURCE_GROUP --query properties.appLogsConfiguration.logAnalyticsConfiguration.customerId --out tsv`

az monitor log-analytics query \
  --workspace $LOG_ANALYTICS_WORKSPACE_CLIENT_ID \
  --analytics-query "ContainerAppConsoleLogs_CL | where ContainerAppName_s == 'nodeapp' and (Log_s contains 'persisted' or Log_s contains 'order') | project ContainerAppName_s, Log_s, TimeGenerated | sort by TimeGenerated | take 5" \
  --out table

A saída a seguir demonstra o tipo de resposta a esperar do comando CLI.

ContainerAppName_s    Log_s                            TableName      TimeGenerated
--------------------  -------------------------------  -------------  ------------------------
nodeapp               Got a new order! Order ID: 61    PrimaryResult  2021-10-22T21:31:46.184Z
nodeapp               Successfully persisted state.    PrimaryResult  2021-10-22T21:31:46.184Z
nodeapp               Got a new order! Order ID: 62    PrimaryResult  2021-10-22T22:01:57.174Z
nodeapp               Successfully persisted state.    PrimaryResult  2021-10-22T22:01:57.174Z
nodeapp               Got a new order! Order ID: 63    PrimaryResult  2021-10-22T22:45:44.618Z

Clean up resources (Limpar recursos)

Parabéns! Você concluiu este tutorial. Se quiser excluir os recursos criados como parte desta explicação passo a passo, execute o seguinte comando.

Atenção

Este comando exclui o grupo de recursos especificado e todos os recursos contidos nele. Se existirem recursos fora do escopo deste tutorial no grupo de recursos especificado, eles também serão excluídos.

az group delete --resource-group $RESOURCE_GROUP

Nota

Como pythonapp continuamente faz chamadas com nodeapp mensagens que persistem em seu armazenamento de estado configurado, é importante concluir essas etapas de limpeza para evitar operações faturáveis contínuas.

Gorjeta

Tem problemas? Informe-nos no GitHub abrindo um problema no repositório de Aplicativos de Contêiner do Azure.

Próximos passos