Implantando microsserviço usando Devprime no Azure Container Apps

O Azure Container Apps é uma plataforma serverless que simplifica a execução de aplicações containerizadas, eliminando a necessidade de configurar servidores e gerenciar a orquestração de containers. Nesse artigo, abordaremos como publicar um microsserviço cloud-native utilizando a plataforma Devprime.

As aplicações baseadas na plataforma DevPrime incorporam nativamente uma abordagem de arquitetura dirigida por eventos (Event-Driven Architecture). Elas recebem eventos externos, processam regras de negócio, emitem eventos internos e, quando necessário, propagam os eventos externamente utilizando o adaptador Stream, que se conecta nativamente com Kafka e outras plataformas.

Agora, montaremos uma demonstração envolvendo um microsserviço chamado “Order”, receberá pedidos. É fundamental subir os containers MongoDB e Kafka para realizar os testes locais.

Cheklist e preperação do ambiente inicial:

Criando o primeiro microsserviço “Order”

Nós utilizaremos o DevPrime CLI para a criação dos microsserviços. Neste exemplo, informaremos o nome da nova aplicação, o tipo de serviço de Stream como “Kafka” para emissão de eventos assíncronos e o State como “MongoDB” para a persistência dos dados. Para iniciar um novo microsserviço, utilize o comando de exemplo apresentado. Uma nova aplicação será criada em segundos e estará pronta para produção.
dp new order --stream kafka --state mongodb

Adicionando uma regra de negócio de pedidos via Devprime Marketplace
dp marketplace order

Executando acelerador para implementação de código baseado o Domain. Ao executar o comando a primeira vez nessa demonstração digite “A” para que possa avançar e realizar as alterações.
dp init

O acelerador implementa automaticamente as classes de “Domain Events” em Domain, “Event Handlers” em Application, “Domain Services” em Application, “Application Services” em Application, a persistência em State, as APIs em Web e alguns testes unitários em Tests como exemplo.

Criando um repositório no Azure Container Registry (ACR)

Nós utilizaremos o Azure Container Registry (ACR) para repositório de imagens docker privadas. Você pode acessar o portal do Azure e criar um novo repositório privado ou, se preferir, utilizar o Azure CLI e outras estratégias para provisionar os recursos.

Entre no portal e crie um novo Container Registry. No exemplo, nós utilizamos o nome de “devprimeregistry” e avançamos até ativar o serviço.

Azure Container Registry

Após criar o ACR, localize o item “Settings > Access keys” e ative a opção “Admin user” para obter a credencial que será utilizada para se conectar ao serviço do Azure Container Registry (ACR) e realizar a publicação de uma imagem.

Azure Container Registry

Na tabela abaixo, é apresentado um resumo das informações necessárias para conexão ao serviço do Azure Container Registry (ACR). É importante lembrar que você deve obter os dados no seu portal do Azure.

Chave Valor
Server devprimeregistry.azurecr.io
Registry devprimeregistry
Username devprimeregistry
Password 2t44H70qmRDGdBCo

Efetuando login no repositório no Azure Container Registry (ACR)

Agora chegou o momento de utilizar o Azure CLI ou “az” para efetuar login no Azure Container Registry criado no passo anterior e permitir realizar o envio de imagens docker do seu ambiente local para o ACR. Antes de avançar, certifique-se de que você tem o Azure CLI ativado (az login) no seu ambiente.

Execute no prompt de comando:

1
az acr login -n devprimeregistry -u devprimeregistry -p 2t44H70qmRDGdBCo

Analisando a porta padrão no Dockerfile e na configuração do App

Os microsserviços desenvolvidos utilizando a plataforma Devprime são implementados automaticamente com um arquivo Dockerfile na pasta do projeto que deve ser configurado caso deseje modificar a porta interna para receber requests. Caso deseje modificar para 8080 ou outro valor, você deverá alterar no Dockerfile e também na configuração da aplicação.

Analisando a porta padrão no arquivo Dockerfile
Abra pelo Visual Studio Code:

1
code ./Dockerfile
1
2
3
4
# Step 1
FROM mcr.microsoft.com/dotnet/aspnet:8.0.6-jammy AS base
WORKDIR /app
EXPOSE 80

Analisando a porta padrão no arquivo AppSettings
Abra pelo Visual Studio Code:

1
code .\src\App\appsettings.json
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
{
  "DevPrime_Web": {
    "url": "http://*:80",
    "enable": "true",
    "enableswagger": "true",
    "PostSuccess": "201",
    "PostFailure": "500",
    "GetSuccess": "200",
    "GetFailure": "500",
    "PatchSuccess": "200",
    "PatchFailure": "500",
    "PutSuccess": "200",
    "PutFailure": "500",
    "DeleteSuccess": "200",
    "DeleteFailure": "500",
    "EnableWebLegacy": "false",
    "EnableStaticFiles": "true",
    "ShowHttpRequests": "false",
    "ShowBadRequestDetails": "false"
  }
}

IMPORTANTE:

  • O valor da porta exposta no Dockerfile tem que ser igual ao valor da porta configurada na chave DevPrime_Web enviada como environment para o Azure Container App.
  • Caso modifique o Dockerfile é necessário publicar uma nova imagem no ACR.

Executando o Docker Build e criando uma tag

Entre na pasta do projeto e execute:

1
docker build . -t devprimeregistry.azurecr.io/ms-order:v1

Liste a tag local no Docker:

1
docker images

Executando o push para o repositório do Azure Container Registry (ACR)

Entre na pasta do projeto e execute:

1
docker push devprimeregistry.azurecr.io/ms-order:v1

Ao final desse procedimento, o objetivo é conseguir visualizar no portal do Azure Container Registry a nossa imagem docker publicada no repositório privado docker do ACR e disponível para utilização no Azure Container Apps ou qualquer outro serviço do Azure, como o AKS.

Azure Container Registry

Exportando as variaveis de ambiente para o Azure Container Apps

O Azure Container Apps adota um padrão paercido do Kubernetes permitindo receber as configurações da aplicação por meio de vaviaveis de ambientes o que permite a utilização de cofres como Azure Vault para proteger as credenciais e passar para o container no momento
da utilização.

A Devprime ofece no Devprime CLI o comando export que permitir gerar um arquivo yaml com as variaveis que devem ser aplicadas no ambiente da aplicação em produção. Utilize como referencia.

1
dp export kubernetes

Azure Container App

Abra pelo Visual Studio Code:

1
code .devprime/kubernetes/deployment.yml

Na imagem abaixo, é possível conferir o ponto das variáveis de ambiente que copiaremos os itens de chave e valor que estiverem preenchidos para aplicar nas configurações de ambiente no Azure Container Apps.

Azure Container App

  • Nós utilizaremos as chaves devprime_app, devprime_web, devprime_observability, devprime_stream1, devprime_state1, devprime_custom e devprime_services. A chave devprime_security não está sendo utilizada nesse projeto.
  • É importante lembrar que chaves não preenchidas não precisam ser utilizadas.
  • A chaves devprime_state e devprime_stream devem conter as credenciais e referências ao ambiente de produção e você pode utilizar valores salvos no Azure Key Vault.

Criando um novo Azure Container App

Utilizaremos o portal do Azure para criar o Azure Container App. Caso prefira, você pode utilizar o Azure CLI, Bicep, Terraform ou outras ferramentas para replicar o mesmo procedimento em sua estratégia de DevOps.

Definimos o nome do serviço como “devprime-container-app” e escolhemos a opção de publicação por meio de uma imagem “Container Image”. Como é a primeira vez que estamos criando o serviço, será necessário criar em conjunto um “Container Apps Environment”.
Azure Container App

Após avançar na tela anterior, localize a aba “Container”. Você terá acesso a algumas configurações importantes, como a definição da “Image Source”, onde encontramos o nosso Azure Container Registry com o nome “devprimeregistry” e a imagem do microsserviço enviada anteriormente.
Azure Container App

Nessa aba, encontramos informações iniciais importantes, como o tipo de CPU/Memory e, principalmente, as variáveis de ambiente exportadas anteriormente, que devem ser inseridas usando o modelo de chave/valor.
Azure Container App

Neste momento, aplicamos as configurações nas chaves devprime_app, devprime_web, devprime_observability, devprime_stream1, devprime_state1, devprime_custom e devprime_services. A devprime_security não está sendo utilizada nesse projeto.
Azure Container App

Habilitando o Ingress no Azure Container App

Ao seguir os passos anteriores, sua aplicação estará rodando e pronta para receber requests externos. Para isso, vamos habilitar o recurso de “Ingress”, disponível no portal do Azure Container App em Settings > Ingress. Habilite a funcionalidade e escolha a opção “Accepting traffic from anywhere”, com a “Target port” definida como “80”, para que o Ingress se conecte internamente com o seu Container. Essa configuração de porta é a mesma exposta no Dockerfile e na variável de ambiente “DevPrime_Web”.

Azure Container App

Após ativar o Ingress, será gerado um link público com acesso direto ao seu microsserviço disponível por meio do Azure Container App.

Azure Container App

Ajustando a escalabilidade dos Containers e variáveis de ambiente

Após executar o procedimento padrão pelo portal, caso deseje ajustar a escalabilidade das réplicas disponíveis, é possível defini-la como “zero” e rodar totalmente como serverless. Outro ponto importante é atualizar outros parâmetros, como as próprias variáveis de ambiente. Para modificá-las, acesse o menu “Application > Containers”.

Azure Container App

Parabéns! 🚀 Você acabou de implantar um microsserviço desenvolvido com os aceleradores da plataforma Devprime no Azure Container Apps.

Sugestão para próximos passos

  • Automatize esse processo utilizando Azure DevOps, Github…
  • Adicione uma configuração de segurança na exposição das API’s
  • Adicione um serviço do Azure API Management
  • Adicione um Azuer Key Vault

Para saber mais:

Última modificação June 11, 2024 (06327e5d)