Share via


Tutorial: implantar um aplicativo Dapr nos Aplicativos de Contêiner do Azure usando a CLI do Azure

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

Você aprenderá como:

  • Criar um ambiente de Aplicativos de Contêiner para os seus aplicativos de contêiner
  • Criar um armazenamento 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
  • Verificar 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 Dapr ao criar microsserviços. Ao usar a Dapr nos Aplicativos de Contêiner do Azure, você pode habilitar sidecars para executar ao lado de microsserviços que fornecem um conjunto avançado de funcionalidades. As APIs de Dapr disponíveis incluem chamadas de Serviço a Serviço, Pub/Sub, Associações de Eventos, Armazenamentos de Estado e Atores.

Neste tutorial, você implantará os mesmos aplicativos do guia de início rápido do Dapr Olá, Mundo.

Esse aplicativo consiste em:

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

O diagrama de arquitetura a seguir ilustra os componentes deste tutorial:

Diagrama de arquitetura para microsserviços Dapr

Instalação

Para entrar no Azure usando a CLIl, execute o comando a seguir 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 de atualização.

az upgrade

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

az extension add --name containerapp --upgrade

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

Observação

Os recursos dos Aplicativos de Contêiner do Azure migraram do namespace Microsoft.Web para o namespace Microsoft.App. Consulte a 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 variáveis de ambiente a seguir. Substitua os <espaços reservados> 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 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 um grupo de aplicativos de contêiner. Os Aplicativos de Contêiner implantados no mesmo ambiente são implantados na mesma rede virtual e registram 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 armazenamento de estado

Criar uma conta de Armazenamento de Blobs do Azure

Com o ambiente implantado, a próxima etapa é implantar uma conta Armazenamento de Blobs do Azure 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 precisam ser exclusivos no Azure, ter de 3 a 24 caracteres de comprimento e incluir 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 Microsoft 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ó

Embora os Aplicativos de Contêiner ofereçam suporte à identidade gerenciada atribuída pelo usuário e atribuída pelo sistema, uma identidade atribuída pelo usuário fornece ao aplicativo de nó habilitado para Dapr permissões para acessar a conta de armazenamento de blobs.

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

Recupere as propriedades principalId e id e as 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 função Storage Blob Data Contributor à identidade atribuída pelo usuário

Recupere a ID da assinatura para sua 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 se autenticar em recursos externos por meio do Dapr. Este exemplo não usa a API de Segredos do Dapr em runtime, mas usa um armazenamento de estado baseado em Azure. Portanto, você pode renunciar à criação de um componente de armazenamento secreto e, em vez disso, fornecer acesso direto do aplicativo de nó ao armazenamento de blobs usando a Identidade Gerenciada. Se você quiser usar um armazenamento de estado não Azure ou a API de Segredos do Dapr em runtime, poderá criar um componente de armazenamento secreto. Esse componente carregaria segredos de runtime para que você possa referenciá-los em runtime.

Abra um editor de texto e crie um arquivo de configuração nomeado como statestore.yaml com as propriedades originadas das etapas anteriores. Esse arquivo permite que o seu aplicativo Dapr acesse o armazenamento de estado. O exemplo a seguir mostra como o arquivo statestore.yaml deve ser exibido quando configurado para a conta de Armazenamento de Blobs 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ço reservados:

  • Substitua <STORAGE_ACCOUNT_NAME> pelo valor da variável STORAGE_ACCOUNT_NAME que você definiu. Para obter seu valor, execute o seguinte comando:
echo $STORAGE_ACCOUNT_NAME
  • Substitua <MANAGED_IDENTITY_CLIENT_ID> pelo valor da variável CLIENT_ID 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 comando a seguir para configurar o componente Dapr no ambiente de Aplicativos de Contêiner. Para obter mais informações sobre como configurar componentes Dapr, consulte Configurar componentes 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 é retirada do Docker Hub.

Implantar o aplicativo cliente (cliente sem periféricos)

Execute o comando a seguir para implantar o aplicativo do contêiner do 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

Verifique os resultados

Confirmar a permanência de estado bem-sucedida

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

  1. No portal do Azure no navegador, acesse a sua conta de armazenamento.

  2. Selecione o menu do lado esquerdo Contêineres.

  3. Selecione mycontainer.

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

  5. Selecione o arquivo .

  6. Selecione a guia Editar.

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

Exibir Logs

Os logs de aplicativos de contêiner são armazenados na tabela personalizada ContainerAppConsoleLogs_CL no workspace do Log Analytics. Você pode exibir logs pelo portal do Azure ou por meio da CLI. Pode haver um pequeno atraso inicial para a tabela aparecer no workspace.

Use o comando da CLI a seguir 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 mostra o tipo de resposta a esperar do comando da 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

Limpar os recursos

Parabéns! Você concluiu este tutorial. Se você quiser excluir os recursos criados como parte deste passo a passo, execute o comando a seguir.

Cuidado

O 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

Observação

Como pythonapp faz chamadas continuamente para nodeapp com mensagens que são mantidas em seu armazenamento de estado configurado, é importante concluir essas etapas de limpeza para evitar operações de cobrança contínuas.

Dica

Está enfrentando problemas? Deixe-nos saber sobre GitHub abrindo um problema no repositório dos Aplicativos de Contêiner do Azure.

Próximas etapas