Compartilhar via


Implantar um aplicativo Java com o Quarkus em Aplicativos de Contêiner do Azure

Este artigo mostra como implantar rapidamente o Red Hat Quarkus em Aplicativos de Contêiner do Microsoft Azure com um simples aplicativo CRUD. O aplicativo é uma "lista de tarefas" com um front-end em JavaScript e um ponto de extremidade REST. O Servidor Flexível do Banco de Dados do Azure para PostgreSQL fornece a camada de persistência para o aplicativo. O artigo mostra como testar seu aplicativo localmente e implantá-lo em Aplicativos de Contêiner.

Pré-requisitos

  • Uma assinatura do Azure. Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
  • Prepare um computador local com sistema operacional semelhante ao Unix instalado - por exemplo, Ubuntu, macOS ou o Subsistema do Windows para Linux.
  • Instale uma implementação Java SE versão 17 ou posterior – por exemplo, o build da Microsoft do OpenJDK.
  • Instale o Maven, versão 3.9.8 ou superior.
  • Instale o Docker ou o Podman para o seu sistema operacional.
  • Instale o jq.
  • Instale o cURL.
  • Instale a CLI do Quarkus, versão 3.12.1 ou superior.
  • Instalar a CLI do Azure para executar comandos da CLI do Azure.
    • Entre na CLI do Azure usando o comando az login. Para concluir o processo de autenticação, siga as etapas exibidas no terminal. Para obter outras opções de login, confira Entrar no Azure com a CLI do Azure.
    • Quando solicitado, instale a extensão da CLI do Azure no primeiro uso. Para obter mais informações sobre extensões, confira Usar e gerenciar extensões com a CLI do Azure.
    • Execute az version para localizar a versão e as bibliotecas dependentes que estão instaladas. Para fazer a atualização para a versão mais recente, execute az upgrade. Este artigo requer pelo menos a versão 2.61.0 da CLI do Azure.

Criar o projeto de aplicativo

Use o comando a seguir para clonar o projeto Java de exemplo para este artigo. O exemplo está no GitHub.

git clone https://github.com/Azure-Samples/quarkus-azure
cd quarkus-azure
git checkout 2024-10-14
cd aca-quarkus

Se você vir uma mensagem sobre estar no estado HEAD desanexado, essa mensagem pode ser ignorada com segurança. Como esse artigo não requer nenhum commit, o estado HEAD desanexado é apropriado.

Testar seu aplicativo Quarkus localmente

As etapas nessa seção mostram como executar o aplicativo localmente.

O Quarkus dá suporte ao provisionamento automático de serviços não configurados no modo de desenvolvimento e teste. O Quarkus refere-se a essa capacidade como serviços de desenvolvimento. Digamos que você inclua um recurso do Quarkus, como conectar-se a um serviço de banco de dados. Você deseja testar o aplicativo, mas ainda não configurou totalmente a conexão com um banco de dados real. O Quarkus inicia automaticamente uma versão stub do serviço relevante e conecta seu aplicativo a ele. Para obter mais informações, confira Visão Geral dos Serviços de Desenvolvimento na documentação do Quarkus.

Verifique se o seu ambiente de contêiner, Docker ou Podman, esteja em execução e use o comando a seguir para entrar no modo de desenvolvimento do Quarkus:

quarkus dev

Em vez de quarkus dev, você pode realizar a mesma coisa com o Maven usando mvn quarkus:dev.

Talvez você precise responder se deseja enviar telemetria sobre a utilização do modo de desenvolvimento do Quarkus. Nesse caso, responda como quiser.

O modo de desenvolvimento do Quarkus permite recarregar ao vivo com compilação em segundo plano. Se você modificar qualquer aspecto do código-fonte do aplicativo e atualizar o navegador, poderá ver as alterações. Se houver algum problema com a compilação ou implantação, uma página de erro informará você. O modo de desenvolvimento do Quarkus escuta um depurador na porta 5005. Se você quiser esperar que o depurador seja anexado antes de executar, passe -Dsuspend na linha de comando. Se você não quiser o depurador, poderá usar -Ddebug=false.

A saída deve ser semelhante ao exemplo a seguir:

__  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
INFO  [io.quarkus] (Quarkus Main Thread) quarkus-todo-demo-app-aca 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.2.0.Final) started in 14.826s. Listening on: http://localhost:8080
INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [agroal, cdi, hibernate-orm, hibernate-validator, jdbc-postgresql, narayana-jta, resteasy-reactive, resteasy-reactive-jackson, smallrye-context-propagation, vertx]

--
Tests paused
Press [e] to edit command line args (currently ''), [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options>

Pressione w no terminal onde o modo de desenvolvimento do Quarkus está sendo executado. A tecla w abre seu navegador padrão para mostrar o aplicativo Todo. Você também pode acessar a GUI do aplicativo diretamente no http://localhost:8080.

Captura de tela do aplicativo de exemplo Todo.

Tente selecionar alguns itens de tarefas na lista de tarefas. A interface do usuário indica a seleção com um estilo de texto tachado. Você também pode adicionar um novo item de tarefa à lista de tarefas digitando Verificar o aplicativo Todo e pressionando ENTER, conforme mostrado na captura de tela a seguir:

Captura de tela do aplicativo de exemplo Todo com novos itens adicionados.

Acesse a API RESTful (/api) para obter todos os itens de tarefas armazenados no banco de dados PostgreSQL local:

curl --verbose http://localhost:8080/api | jq .

A saída deve ser semelhante ao exemplo a seguir:

* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /api HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.88.1
> Accept: */*
>
< HTTP/1.1 200 OK
< content-length: 664
< Content-Type: application/json;charset=UTF-8
<
{ [664 bytes data]
100   664  100   664    0     0  13278      0 --:--:-- --:--:-- --:--:-- 15441
* Connection #0 to host localhost left intact
[
  {
    "id": 1,
    "title": "Introduction to Quarkus Todo App",
    "completed": false,
    "order": 0,
    "url": null
  },
  {
    "id": 2,
    "title": "Quarkus on Azure App Service",
    "completed": false,
    "order": 1,
    "url": "https://learn.microsoft.com/en-us/azure/developer/java/eclipse-microprofile/deploy-microprofile-quarkus-java-app-with-maven-plugin"
  },
  {
    "id": 3,
    "title": "Quarkus on Azure Container Apps",
    "completed": false,
    "order": 2,
    "url": "https://learn.microsoft.com/en-us/training/modules/deploy-java-quarkus-azure-container-app-postgres/"
  },
  {
    "id": 4,
    "title": "Quarkus on Azure Functions",
    "completed": false,
    "order": 3,
    "url": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-first-quarkus"
  },
  {
    "id": 5,
    "title": "Verify Todo apps",
    "completed": false,
    "order": 5,
    "url": null
  }
]

Pressione q para sair do modo de desenvolvimento do Quarkus.

Crie os recursos do Azure para executar o aplicativo Quarkus

As etapas nessa seção mostram como criar os seguintes recursos do Azure para executar o aplicativo de exemplo do Quarkus:

  • Banco de Dados do Azure para PostgreSQL Servidor Flexível
  • Registro de Contêiner do Azure
  • Aplicativos de Contêiner do Azure

Alguns desses recursos devem ter nomes exclusivos dentro do escopo da assinatura do Azure. Para garantir essa exclusividade, você pode usar o padrão de iniciais, sequência, data e sufixo. Para aplicar esse padrão, nomeie seus recursos listando suas iniciais, algum número de sequência, a data de hoje e algum tipo de sufixo específico do recurso - por exemplo, rg para "grupo de recursos". As variáveis de ambiente a seguir usam esse padrão. Substitua os valores de espaço reservado em UNIQUE_VALUE e LOCATION por seus próprios valores e execute os comandos em seu terminal.

export UNIQUE_VALUE=<your unique value, such as mjg101424>
export RESOURCE_GROUP_NAME=${UNIQUE_VALUE}rg-passwordless
export LOCATION=<your desired Azure region for deploying your resources - for example, eastus>
export REGISTRY_NAME=${UNIQUE_VALUE}regpasswordless
export DB_SERVER_NAME=${UNIQUE_VALUE}dbpasswordless
export DB_NAME=demodb
export ACA_ENV=${UNIQUE_VALUE}envpasswordless
export ACA_NAME=${UNIQUE_VALUE}acapasswordless

Em seguida, crie um grupo de recursos usando o seguinte comando:

az group create \
    --name $RESOURCE_GROUP_NAME \
    --location $LOCATION

Criar um servidor flexível do Banco de Dados do Azure para PostgreSQL

O Servidor Flexível do Banco de Dados do Azure para PostgreSQL é um serviço de banco de dados totalmente gerenciado projetado para fornecer controle e flexibilidade mais granulares nas funções de gerenciamento de banco de dados e definições de configuração. Esta seção mostra como criar uma instância do Servidor Flexível do Banco de Dados do Azure para PostgreSQL usando a CLI do Azure. Para obter mais informações, consulte Início Rápido: Criar uma instância do Banco de Dados do Azure para PostgreSQL – Servidor Flexível usando a CLI do Azure.

Crie uma instância de servidor flexível do Banco de Dados do Azure para PostgreSQL usando o seguinte comando:

az postgres flexible-server create \
    --name $DB_SERVER_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --database-name $DB_NAME \
    --public-access None \
    --sku-name Standard_B1ms \
    --tier Burstable \
    --active-directory-auth Enabled

Leva alguns minutos para criar o servidor, o banco de dados, o usuário administrador e as regras de firewall. Se o comando for bem-sucedido, a saída será semelhante ao exemplo a seguir:

{
  "connectionString": "postgresql://REDACTED:REDACTED@<DB_SERVER_NAME>.postgres.database.azure.com/<DB_NAME>?sslmode=require",
  "databaseName": "<DB_NAME>",
  "host": "<DB_SERVER_NAME>.postgres.database.azure.com",
  "id": "/subscriptions/REDACTED/resourceGroups/<RESOURCE_GROUP_NAME>/providers/Microsoft.DBforPostgreSQL/flexibleServers/<DB_SERVER_NAME>",
  "location": "East US",
  "password": "REDACTED",
  "resourceGroup": "<RESOURCE_GROUP_NAME>",
  "skuname": "Standard_B1ms",
  "username": "REDACTED",
  "version": "13"
}

Adicione o usuário conectado atual como Administrador do Microsoft Entra à instância do Servidor Flexível do Banco de Dados do Azure para PostgreSQL usando os seguintes comandos:

ENTRA_ADMIN_NAME=$(az ad signed-in-user show --query userPrincipalName -o tsv)
az postgres flexible-server ad-admin create \
    --resource-group $RESOURCE_GROUP_NAME \
    --server-name $DB_SERVER_NAME \
    --display-name $ENTRA_ADMIN_NAME \
    --object-id $(az ad signed-in-user show --query id -o tsv)

A saída bem-sucedida é um objeto JSON, que inclui a propriedade "type": "Microsoft.DBforPostgreSQL/flexibleServers/administrators".

Criar uma instância do Registro de Contêiner do Azure da Microsoft

Como o Quarkus é uma tecnologia nativa em nuvem, ele tem suporte integrado para a criação de contêineres executados em Aplicativos de Contêiner. Os Aplicativos de Contêiner dependem totalmente de um registro de contêiner do qual ele encontra as imagens de contêiner a serem executadas. Os Aplicativos de Contêiner têm suporte interno para o Registro de Contêiner do Azure.

Use o comando az acr create para criar a instância do Registro de Contêiner. O exemplo a seguir cria uma instância do Registro de Contêiner nomeada com o valor da variável de ambiente ${REGISTRY_NAME}:

az acr create \
    --resource-group $RESOURCE_GROUP_NAME \
    --location ${LOCATION} \
    --name $REGISTRY_NAME \
    --sku Basic

Após um curto período de tempo, você deverá ver a saída JSON que contém as linhas a seguir:

  "provisioningState": "Succeeded",
  "publicNetworkAccess": "Enabled",
  "resourceGroup": "<YOUR_RESOURCE_GROUP>",

Obtenha o servidor de logon para a instância do Container Registry usando o seguinte comando:

export LOGIN_SERVER=$(az acr show \
    --name $REGISTRY_NAME \
    --query 'loginServer' \
    --output tsv)
echo $LOGIN_SERVER

Conectar o docker à instância do Registro de Contêiner

Entre na instância do Registro de Contêiner. Entrar permite que você envie uma imagem por push. Use o seguinte comando para entrar no registro:

az acr login --name $REGISTRY_NAME

Se você estiver usando o Podman em vez do Docker, faça as alterações necessárias no comando.

Se você tiver conseguido entrar na instância de Registro de Contêiner, deverá ver Login Succeeded no final da saída do comando.

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 gravam logs no mesmo workspace do Log Analytics. Use o comando az containerapp env create para criar um ambiente, conforme mostrado no exemplo a seguir:

az containerapp env create \
    --resource-group $RESOURCE_GROUP_NAME \
    --location $LOCATION \
    --name $ACA_ENV

Se aparecer a pergunta sobre instalação de uma extensão, responda Y.

Personalize a configuração nativa de nuvem

Como uma tecnologia nativa em nuvem, o Quarkus possibilita gerar automaticamente imagens de contêiner. Para obter mais informações, consulte Imagens de contêiner. Em seguida, os desenvolvedores podem implantar a imagem do aplicativo em uma plataforma conteinerizada de destino; por exemplo, Aplicativos de Contêiner do Azure.

Para gerar a imagem do contêiner, use o seguinte comando e adicione a extensão container-image-jib ao terminal local:

quarkus ext add container-image-jib

O Quarkus modifica o POM para que a extensão seja incluída entre <dependencies>. Se aparecer a pergunta sobre a instalação de JBang, responda sim e permita a instalação.

A saída deve ser semelhante ao exemplo a seguir:

[SUCCESS] ✅  Extension io.quarkus:quarkus-container-image-jib has been installed

Abra o arquivo pom.xml e você verá as seguintes dependências adicionadas pela container-image-jib extensão:

<dependency>
  <groupId>io.quarkus</groupId>
  <artifactId>quarkus-container-image-jib</artifactId>
</dependency>

Em seguida, adicione as seguintes dependências ao arquivo pom.xml para dar suporte à autenticação sem senha com o Servidor Flexível do Banco de Dados do Azure para PostgreSQL:

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-identity-extensions</artifactId>
    <version>1.1.20</version>
</dependency>

Como uma tecnologia nativa de nuvem, o Quarkus dá suporte a noção de perfis de configuração. O Quarkus tem os seguintes três perfis integrados:

  • dev - Ativado quando em modo de desenvolvimento.
  • test - Ativado ao executar testes.
  • prod - O perfil padrão quando não estiver em execução no modo de desenvolvimento ou teste.

O Quarkus dá suporte a qualquer número de perfis nomeados, conforme necessário.

As etapas restantes nessa seção orientam você a remover marca de comentário e customizar valores no arquivo src/main/resources/application.properties. Certifique-se de que todas as linhas que começam com # %prod. estejam sem a marca de comentário removendo o entrelinhamento #.

O prefixo %prod. indica que essas propriedades estão ativas durante a execução no perfil prod. Para obter mais informações sobre perfis de configuração, confira a documentação do Quarkus.

Consultar a configuração do banco de dados

Depois de remover o comentário das propriedades, a configuração do banco de dados no arquivo src/main/resources/application.properties deve ser semelhante ao exemplo a seguir:

# Database configurations
%prod.quarkus.datasource.db-kind=postgresql
%prod.quarkus.datasource.jdbc.url=
%prod.quarkus.datasource.username=
%prod.quarkus.datasource.password=
%prod.quarkus.hibernate-orm.database.generation=create
%prod.quarkus.hibernate-orm.sql-load-script=no-file

Remova a propriedade %prod.quarkus.datasource.password porque ela não é necessária ao usar a autenticação sem senha com o Servidor Flexível do Banco de Dados do Azure para PostgreSQL. Atualize as outras propriedades %prod.quarkus.datasource.jdbc.url relacionadas à conexão de banco de dados e %prod.quarkus.datasource.username com os valores, conforme mostrado no exemplo a seguir. A configuração final deve ser semelhante ao exemplo a seguir:

# Database configurations
%prod.quarkus.datasource.db-kind=postgresql
%prod.quarkus.datasource.jdbc.url=jdbc:postgresql://${AZURE_POSTGRESQL_HOST}:${AZURE_POSTGRESQL_PORT}/${AZURE_POSTGRESQL_DATABASE}?\
authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin\
&sslmode=require
%prod.quarkus.datasource.username=${AZURE_POSTGRESQL_USERNAME}
%prod.quarkus.hibernate-orm.database.generation=create
%prod.quarkus.hibernate-orm.sql-load-script=no-file

O valor de , ${AZURE_POSTGRESQL_PORT}, ${AZURE_POSTGRESQL_DATABASE}, e ${AZURE_POSTGRESQL_USERNAME} são fornecidos pelo ambiente dos ${AZURE_POSTGRESQL_HOST}Aplicativos de Contêiner do Azure em runtime usando a extensão sem senha do Service Connector mais adiante neste artigo.

Em geral, você não espera que os dados persistentes no banco de dados sejam descartados e preenchidos novamente com os dados de exemplo em um ambiente de produção. É por isso que você pode ver que o esquema de quarkus.hibernate-orm.database.generation é especificado como create para que o aplicativo só crie o esquema quando ele não existir na primeira inicialização. Além disso, o banco de dados não é previamente preenchido com dados de exemplo porque hibernate-orm.sql-load-script é especificado como no-file. Essa configuração difere de quando você executou o aplicativo localmente no modo de desenvolvimento antes. Os valores padrão no modo de desenvolvimento para quarkus.hibernate-orm.database.generation e hibernate-orm.sql-load-script são drop-and-create e import.sql, respectivamente, ou seja, o aplicativo sempre descarta e recria o esquema de banco de dados e carrega os dados definidos em import.sql. O arquivo import.sql é um recurso de conveniência do Quarkus. Se o arquivo src/main/resources/import.sql existir no jar do Quarkus e o valor da propriedade hibernate-orm.sql-load-script for import.sql, as instruções SQL DML nesse arquivo serão executadas no momento da inicialização do aplicativo.

Testar seu aplicativo Quarkus localmente com o Servidor Flexível do Banco de Dados do Azure para PostgreSQL

Antes de implantar o aplicativo Quarkus nos Aplicativos de Contêiner do Azure, teste a conexão com a instância do Servidor Flexível do Banco de Dados do Azure para PostgreSQL localmente.

Primeiro, adicione o endereço IP local às regras de firewall da instância do Servidor Flexível do Banco de Dados do Azure para PostgreSQL usando os seguintes comandos:

export AZ_LOCAL_IP_ADDRESS=$(curl -s https://whatismyip.akamai.com)

az postgres flexible-server firewall-rule create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $DB_SERVER_NAME \
    --rule-name $DB_SERVER_NAME-database-allow-local-ip \
    --start-ip-address $AZ_LOCAL_IP_ADDRESS \
    --end-ip-address $AZ_LOCAL_IP_ADDRESS

Em seguida, defina as seguintes variáveis de ambiente em seu terminal anterior. Essas variáveis de ambiente são usadas para se conectar à instância do Servidor Flexível do Banco de Dados do Azure para PostgreSQL do aplicativo Quarkus em execução localmente:

export AZURE_POSTGRESQL_HOST=${DB_SERVER_NAME}.postgres.database.azure.com
export AZURE_POSTGRESQL_PORT=5432
export AZURE_POSTGRESQL_DATABASE=${DB_NAME}
export AZURE_POSTGRESQL_USERNAME=${ENTRA_ADMIN_NAME}

Execute o aplicativo Quarkus localmente para testar a conexão com a instância do Servidor Flexível do Banco de Dados do Azure para PostgreSQL. Use o seguinte comando para iniciar o aplicativo no modo de produção:

mvn clean package -DskipTests
java -jar target/quarkus-app/quarkus-run.jar

Abra um novo navegador da Web para http://localhost:8080 acessar o aplicativo Todo. Você deve ver o mesmo aplicativo Todo que viu quando executou o aplicativo localmente no modo de desenvolvimento, sem nenhum item Todo.

Pressione Control+C para parar o aplicativo.

Compilar a imagem de contêiner e efetuá-la por push para o Registro de Contêiner

Agora, use o comando a seguir para criar o próprio aplicativo. Este comando usa a extensão Jib para criar a imagem do contêiner.

export TODO_QUARKUS_IMAGE_NAME=todo-quarkus-aca
export TODO_QUARKUS_IMAGE_TAG=${LOGIN_SERVER}/${TODO_QUARKUS_IMAGE_NAME}:1.0
quarkus build -Dquarkus.container-image.build=true -Dquarkus.container-image.image=${TODO_QUARKUS_IMAGE_TAG} --no-tests 

A saída deve terminar com BUILD SUCCESS.

Você pode verificar se a imagem de contêiner também é gerada usando a docker CLI (linha de comando) ou podman , conforme mostrado no exemplo a seguir:

docker images | grep ${TODO_QUARKUS_IMAGE_NAME}

A saída deve ser semelhante ao seguinte exemplo:

<LOGIN_SERVER_VALUE>/todo-quarkus-aca   1.0       0804dfd834fd   2 minutes ago   407MB

Envie as imagens de contêiner para o Registro de Contêiner usando o seguinte comando:

docker push ${TODO_QUARKUS_IMAGE_TAG}

O resultado deverá ser semelhante ao seguinte exemplo:

The push refers to repository [<LOGIN_SERVER_VALUE>/todo-quarkus-aca]
188a550fce3d: Pushed
4e3afea591e2: Pushed
1db0eba807a6: Pushed
c72d9ccda0b2: Pushed
d7819b8a2d18: Pushed
d0e5cba6b262: Pushed
e0bac91f0f10: Pushed
1.0: digest: sha256:f9ccb476e2388efa0dfdf817625a94f2247674148a69b7e4846793e63c8be994 size: 1789

Implantar o aplicativo Quarkus nos Aplicativos de Contêiner do Azure

Agora que você enviou a imagem do aplicativo para o Registro de Contêiner, use o seguinte comando para criar uma instância de Aplicativos de Contêiner para executar o aplicativo depois de extrair a imagem do Registro de Contêiner:

az containerapp create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $ACA_NAME \
    --image $TODO_QUARKUS_IMAGE_TAG \
    --environment $ACA_ENV \
    --registry-server $LOGIN_SERVER \
    --registry-identity system \
    --target-port 8080 \
    --ingress 'external' \
    --min-replicas 1

A saída bem-sucedida é um objeto JSON, que inclui a propriedade "type": "Microsoft.App/containerApps".

Em seguida, conecte a instância do Servidor Flexível do Banco de Dados do Azure para PostgreSQL ao aplicativo de contêiner usando o Service Connector usando as seguintes etapas:

  1. Instale a extensão sem senha do Service Connector para a CLI do Azure usando o seguinte comando:

    az extension add --name serviceconnector-passwordless --upgrade --allow-preview true
    
  2. Conecte o banco de dados ao aplicativo de contêiner com uma identidade gerenciada atribuída pelo sistema usando o seguinte comando:

    az containerapp connection create postgres-flexible \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $ACA_NAME \
        --target-resource-group $RESOURCE_GROUP_NAME \
        --server $DB_SERVER_NAME \
        --database $DB_NAME \
        --system-identity \
        --container $ACA_NAME
    

    A saída bem-sucedida é um objeto JSON, que inclui a propriedade "type": "microsoft.servicelinker/linkers".

Use uma URL totalmente qualificada para acessar o aplicativo Todo usando o seguinte comando:

export QUARKUS_URL=https://$(az containerapp show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $ACA_NAME \
    --query properties.configuration.ingress.fqdn -o tsv)
echo $QUARKUS_URL

Abra um novo navegador da Web com o valor de ${QUARKUS_URL}. Se a página da Web não for renderizada corretamente, aguarde um pouco e atualize a página.

Em seguida, adicione um novo item de tarefa com o texto Deployed the Todo app to Container Apps. Selecione este item para marcá-lo como concluído.

Captura de tela do aplicativo de exemplo Todo em execução nos Aplicativos de Contêiner.

Acesse a API RESTful (/api) para obter todos os itens do Todo armazenados no Banco de Dados do Azure para PostgreSQL, conforme mostrado no exemplo a seguir:

curl --verbose -k ${QUARKUS_URL}/api | jq .

A saída deve ser semelhante ao exemplo a seguir:

* Connected to <aca-name>.<random-id>.eastus.azurecontainerapps.io (20.231.235.79) port 443 (#0)
> GET /api HTTP/2
> Host: <aca-name>.<random-id>.eastus.azurecontainerapps.io
> user-agent: curl/7.88.1
> accept: */*
>
< HTTP/2 200
< content-length: 88
< content-type: application/json;charset=UTF-8
<
[
  {
    "id": 1,
    "title": "Deployed the Todo app to Container Apps",
    "completed": true,
    "order": 1,
    "url": null
  }
]

Verifique se o banco de dados foi atualizado

Execute o seguinte comando para verificar se o banco de dados foi atualizado com o novo item de tarefas:

export ACCESS_TOKEN=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken)
az postgres flexible-server execute \
    --admin-user $ENTRA_ADMIN_NAME \
    --admin-password $ACCESS_TOKEN \
    --name $DB_SERVER_NAME \
    --database-name $DB_NAME \
    --querytext "select * from todo;"

Se aparecer a pergunta sobre instalação de uma extensão, responda Y.

A saída deve ser semelhante ao exemplo a seguir e deve incluir o mesmo item na GUI do aplicativo Todo mostrada anteriormente:

Successfully connected to <DB_SERVER_NAME>.
Ran Database Query: 'select * from todo;'
Retrieving first 30 rows of query output, if applicable.
Closed the connection to <DB_SERVER_NAME>
[
  {
    "completed": true,
    "id": 1,
    "ordering": 1,
    "title": "Deployed the Todo app to Container Apps",
    "url": null
  }
]

Quando terminar, exclua a regra de firewall que permite que seu endereço IP local acesse a instância do Servidor Flexível do Banco de Dados do Azure para PostgreSQL usando o seguinte comando:

az postgres flexible-server firewall-rule delete \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $DB_SERVER_NAME \
    --rule-name $DB_SERVER_NAME-database-allow-local-ip \
    --yes

Limpar os recursos

Para evitar cobranças do Azure, limpe recursos desnecessários. Quando o cluster não for mais necessário, use o comando az group delete para remover o grupo de recursos, o serviço de contêiner, o registro de contêiner e todos os recursos relacionados.

git reset --hard
docker rmi ${TODO_QUARKUS_IMAGE_TAG}
az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait

Você também pode usar docker rmi para excluir as imagens de contêiner postgres e testcontainers, geradas pelo modo de desenvolvimento do Quarkus.

Próximas etapas