Compartir a través de


Implementación de una aplicación Java con Quarkus en Azure Container Apps

En este artículo se muestra cómo implementar rápidamente Red Hat Quarkus en Microsoft Azure Container Apps con una sencilla aplicación CRUD. La aplicación es una "lista de tareas pendientes" con un front-end de JavaScript y un punto de conexión REST. Servidor flexible de Azure Database for PostgreSQL proporciona la capa de persistencia para la aplicación. En el artículo se muestra cómo probar la aplicación localmente e implementarla en Container Apps.

Requisitos previos

  • Suscripción a Azure. Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
  • Prepara una máquina local con un sistema operativo similar a Unix instalado (por ejemplo, Ubuntu, macOS o Subsistema de Windows para Linux).
  • Instala la versión 17 o una posterior de implementación de Java SE; por ejemplo, Compilación de Microsoft de OpenJDK.
  • Instala Maven, versión 3.9.8 o posterior.
  • Instale Docker para su Sistema Operativo.
  • Instale jq.
  • Instale cURL.
  • Instala la CLI de Quarkus, versión 3.12.1 o posterior.
  • Para ejecutar comandos de la CLI de Azure, instale la CLI de Azure.
    • Inicie sesión en la CLI de Azure mediante el comando az login. Siga los pasos que se muestran en el terminal para completar el proceso de autenticación. Para ver otras opciones de inicio de sesión, consulte Inicio de sesión en Azure con la CLI de Azure.
    • En caso de que se le solicite, instale las extensiones de la CLI de Azure la primera vez que la use. Para obtener más información sobre las extensiones, consulte Uso y administración de extensiones con la CLI de Azure.
    • Ejecute az version para buscar cuál es la versión y las bibliotecas dependientes que están instaladas. Para realizar la actualización a la versión más reciente, ejecute az upgrade. Este artículo requiere al menos la versión 2.61.0 de la CLI de Azure.

Crear el proyecto de la aplicación

Use el siguiente comando para clonar el proyecto de Java de ejemplo para este artículo. El ejemplo se encuentra en GitHub.

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

Si ve un mensaje acerca de estar en estado HEAD desasociado, este mensaje es seguro de omitir. Dado que este artículo no requiere ninguna confirmación, el estado HEAD desasociado es adecuado.

Prueba local de la aplicación Quarkus

Los pasos de esta sección muestran cómo ejecutar la aplicación localmente.

Quarkus admite el aprovisionamiento automático de servicios no configurados en modo de desarrollo y prueba. Quarkus hace referencia a esta funcionalidad como servicios de desarrollo. Supongamos que incluye una característica de Quarkus, como conectarse a un servicio de base de datos. Quiere probar la aplicación, pero aún no ha configurado completamente la conexión a una base de datos real. Quarkus inicia automáticamente una versión de código auxiliar del servicio pertinente y conecta la aplicación a ella. Para obtener más información, consulte Información general de Dev Services en la documentación de Quarkus.

Asegúrese de que el entorno de contenedor se está ejecutando y use el siguiente comando para entrar en el modo dev de Quarkus:

quarkus dev

En lugar de quarkus dev, puede lograr lo mismo con Maven mediante mvn quarkus:dev.

Es posible que se le pregunte si desea enviar telemetría de su uso del modo de desarrollo de Quarkus. Si es así, responda como quiera.

El modo de desarrollo de Quarkus habilita la recarga en vivo con la compilación en segundo plano. Si modifica algún aspecto del código fuente de la aplicación y actualiza el explorador, puede ver los cambios. Si hay algún problema con la compilación o la implementación, una página de error le informará. El modo de desarrollo de Quarkus escucha un depurador en el puerto 5005. Si desea esperar a que el depurador se adjunte antes de ejecutarse, pase -Dsuspend en la línea de comandos. Si no quiere el depurador en absoluto, puede usar -Ddebug=false.

La salida debería tener un aspecto similar al ejemplo siguiente:

__  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
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>

Presione w en el terminal donde se está ejecutando el modo de desarrollo de Quarkus. La tecla w abre el explorador web predeterminado para mostrar la aplicación Todo. También puede acceder a la GUI de la aplicación directamente en http://localhost:8080.

Captura de pantalla de la aplicación de muestra Tareas pendientes.

Intente seleccionar algunos elementos de tareas pendientes en la lista de tareas pendientes. La interfaz de usuario indica la selección con un estilo de texto tachado. También puede agregar un nuevo elemento de tareas pendientes a la lista de tareas pendientes escribiendo Comprobar aplicaciones de tareas pendientes y presionando ENTRAR, como se muestra en la captura de pantalla siguiente:

Captura de pantalla de la aplicación Tareas pendientes con nuevos elementos añadidos.

Acceda a la API de RESTful (/api) para obtener todos los elementos de tareas pendientes que se almacenan en la base de datos de PostgreSQL local:

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

La salida debería tener un aspecto similar al ejemplo siguiente:

* 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
  }
]

Presione q para salir del modo de desarrollo de Quarkus.

Creación de los recursos de Azure para ejecutar la aplicación Quarkus

Los pasos de esta sección muestran cómo crear los siguientes recursos de Azure para ejecutar la aplicación de ejemplo Quarkus:

  • Servidor flexible de Azure Database for PostgreSQL
  • Azure Container Registry
  • Azure Container Apps

Algunos de estos recursos deben tener nombres únicos dentro del ámbito de la suscripción de Azure. Para garantizar esta unicidad, puede usar el patrón de iniciales, secuencia, fecha y sufijo. Para aplicar este patrón, asigne un nombre a los recursos enumerando las iniciales, algún número de secuencia, la fecha de hoy y algún tipo de sufijo específico del recurso, por ejemplo, rg para "grupo de recursos". Las siguientes variables de entorno utilizan este patrón. Reemplace los valores de marcador de posición en UNIQUE_VALUE y LOCATION por sus propios valores y ejecute los comandos en el 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

A continuación, cree un grupo de recursos con el siguiente comando:

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

Creación de servidor flexible de Azure Database for PostgreSQL

Servidor flexible de Azure Database for PostgreSQL es un servicio de base de datos totalmente administrado diseñado para proporcionar un control más granular y una mayor flexibilidad sobre las funciones de administración de bases de datos y las opciones de configuración. En esta sección se muestra cómo crear una instancia de servidor flexible de Azure Database for PostgreSQL mediante la CLI de Azure. Para más información, consulta Inicio rápido: Creación de una instancia de Servidor flexible de Azure Database for PostgreSQL mediante la CLI de Azure.

Cree una instancia de servidor flexible de Azure Database for PostgreSQL mediante el comando siguiente:

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

Se tarda unos minutos en crear el servidor, la base de datos, el usuario administrador y las reglas de firewall. Si el comando se ejecuta correctamente, la salida es similar al ejemplo siguiente:

{
  "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"
}

Agregue el usuario que ha iniciado sesión actual como Administrador de Microsoft Entra a la instancia del servidor flexible de Azure Database for PostgreSQL mediante los siguientes 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)

La salida correcta es un objeto JSON que incluye la propiedad "type": "Microsoft.DBforPostgreSQL/flexibleServers/administrators".

Crear una instancia de Microsoft Azure Container Registry

Debido a que Quarkus es una tecnología nativa de la nube, tiene soporte integrado para crear contenedores que se ejecutan en Container Apps. Container Apps depende totalmente de tener un registro de contenedor desde el que encontrar las imágenes de contenedor para ejecutarse. Container Apps tiene compatibilidad integrada con Azure Container Registry.

Use el comando az acr create para crear una instancia de Container Registry. En el ejemplo siguiente se crean n instancias de Container Registry denominadas con el valor de la variable de entorno ${REGISTRY_NAME}:

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

Tras un breve período de tiempo, debería ver una salida JSON que contiene las siguientes líneas:

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

Obtenga el servidor de inicio de sesión de la instancia de Container Registry mediante el comando siguiente:

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

Conexión de Docker a la instancia de Container Registry

Inicie sesión en la instancia de Registry. El inicio de sesión le permite insertar una imagen. Use el siguiente comando para iniciar sesión en el Registro:

az acr login --name $REGISTRY_NAME

Debería ver Login Succeeded al final de la salida de los comandos si ha iniciado sesión correctamente en la instancia de Container Registry.

Creación de un entorno

Un entorno de Azure Container Apps crea un límite seguro alrededor de un grupo de aplicaciones de contenedor. Las aplicaciones de contenedor implementadas en el mismo entorno se implementan en la misma red virtual y escriben registros en la misma área de trabajo de Log Analytics. Use el comando az containerapp env create para crear un entorno, como se muestra en el ejemplo siguiente:

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

Si se le pide que instale una extensión, responda Y.

Personalización de la configuración nativa de la nube

Como tecnología nativa en la nube, Quarkus ofrece la capacidad de generar automáticamente imágenes de contenedor. Para obtener más información, consulte Imágenes de contenedor. A continuación, los desarrolladores pueden implementar la imagen de aplicación en una plataforma en contenedor de destino, por ejemplo, Azure Container Apps.

Para generar la imagen de contenedor, use el siguiente comando para agregar la extensión container-image-jib en el terminal local:

quarkus ext add container-image-jib

Quarkus modifica el POM para asegurarse de que la extensión se incluye entre <dependencies> Si se le pide que instale algo llamado JBang, responda y permita que se instale.

La salida debería tener un aspecto similar al ejemplo siguiente:

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

Abra el archivo pom.xml y debería ver las siguientes dependencias agregadas por la container-image-jib extensión:

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

A continuación, agregue las siguientes dependencias al archivo pom.xml para admitir la autenticación sin contraseña con el servidor flexible de Azure Database for PostgreSQL:

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

Como tecnología nativa en la nube, Quarkus admite la noción de perfiles de configuración. Quarkus tiene los tres perfiles integrados siguientes:

  • dev - Activado cuando está en modo de desarrollo.
  • test - Activado al ejecutar pruebas.
  • prod - El perfil predeterminado cuando no se ejecuta en modo de desarrollo o prueba.

Quarkus admite cualquier número de perfiles con nombre, según sea necesario.

Los pasos restantes de esta sección le dirigen a quitar la marca de comentario y personalizar los valores en el archivo src/main/resources/application.properties. Asegúrese de que todas las líneas que comienzan por # %prod. estén sin la marca de comentario, eliminando los caracteres # iniciales.

El prefijo %prod. indica que estas propiedades están activas al ejecutarse en el perfil prod. Para obtener más información sobre los perfiles de configuración, consulte la documentación de Quarkus.

Análisis de la configuración de la base de datos

Después de quitar la marca de comentario de las propiedades, la configuración de la base de datos en el archivo src/main/resources/application.properties debe ser similar al ejemplo siguiente:

# 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

Quite la propiedad %prod.quarkus.datasource.password porque no es necesaria al usar la autenticación sin contraseña con el servidor flexible de Azure Database for PostgreSQL. Actualice las demás propiedades %prod.quarkus.datasource.jdbc.url relacionadas con la conexión de base de datos y %prod.quarkus.datasource.username con los valores como se muestra en el ejemplo siguiente. La configuración final debe ser similar al ejemplo siguiente:

# 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

El valor de ${AZURE_POSTGRESQL_HOST}, ${AZURE_POSTGRESQL_PORT}, ${AZURE_POSTGRESQL_DATABASE}y ${AZURE_POSTGRESQL_USERNAME} lo proporciona el entorno de Azure Container Apps en tiempo de ejecución mediante la extensión sin contraseña de Service Connector más adelante en este artículo.

Por lo general, no se espera que los datos almacenados en la base de datos se quiten y se vuelvan a rellenar con los datos de ejemplo en un entorno de producción. Por eso puede ver que el esquema para quarkus.hibernate-orm.database.generation se especifica como create para que la aplicación solo cree el esquema cuando no exista en el inicio inicial. Además, la base de datos no se rellena previamente con ningún dato de ejemplo porque hibernate-orm.sql-load-script se especifica como no-file. Esta configuración es diferente de cuando ejecutó la aplicación localmente en modo de desarrollo anteriormente. Los valores predeterminados en modo de desarrollo para quarkus.hibernate-orm.database.generation y hibernate-orm.sql-load-script son drop-and-create y import.sql, respectivamente, lo que significa que la aplicación siempre quita y vuelve a crear el esquema de la base de datos y carga los datos definidos en import.sql. El archivo import.sql es una comodidad de Quarkus. Si el archivo src/main/resources/import.sql existe en el archivo jar de Quarkus y el valor de la propiedad hibernate-orm.sql-load-script es import.sql, las instrucciones DML de SQL de este archivo se ejecutan en tiempo de inicio para la aplicación.

Prueba de la aplicación Quarkus localmente con el servidor flexible de Azure Database for PostgreSQL

Antes de implementar la aplicación Quarkus en Azure Container Apps, pruebe la conexión a la instancia de servidor flexible de Azure Database for PostgreSQL localmente.

En primer lugar, agregue la dirección IP local a las reglas de firewall de instancia del servidor flexible de Azure Database for PostgreSQL mediante los siguientes 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

A continuación, establezca las siguientes variables de entorno en el terminal anterior. Estas variables de entorno se usan para conectarse a la instancia del servidor flexible de Azure Database for PostgreSQL desde la aplicación Quarkus que se ejecuta 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}

Ejecute la aplicación Quarkus localmente para probar la conexión a la instancia de servidor flexible de Azure Database for PostgreSQL. Use el siguiente comando para iniciar la aplicación en modo de producción:

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

Abra un nuevo explorador web para acceder a http://localhost:8080 la aplicación Todo. Debería ver la misma aplicación Todo que vio cuando ejecutó la aplicación localmente en modo de desarrollo, sin elementos Todo.

Presione Control+C para detener la aplicación.

Compilación de la imagen de contenedor e inserción en Container Registry

Ahora, use el siguiente comando para compilar la propia aplicación. Este comando utiliza la extensión Jib para crear la imagen del contenedor.

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 

La salida debe terminar con BUILD SUCCESS.

También puede comprobar si la imagen del contenedor se genera mediante la línea de comandos (CLI) de docker, como se muestra en el ejemplo siguiente:

docker images | grep ${TODO_QUARKUS_IMAGE_NAME}

El resultado es similar al ejemplo siguiente:

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

Inserte las imágenes de contenedor en Container Registry mediante el siguiente comando:

docker push ${TODO_QUARKUS_IMAGE_TAG}

La salida debería tener un aspecto similar al ejemplo siguiente:

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

Implementación de la aplicación Quarkus en Azure Container Apps

Ahora que insertó la imagen de aplicación en Container Registry, use el siguiente comando para crear una instancia de Container Apps para ejecutar la aplicación después de extraer la imagen de Container Registry:

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

La salida correcta es un objeto JSON que incluye la propiedad "type": "Microsoft.App/containerApps".

A continuación, conecte la instancia del servidor flexible de Azure Database for PostgreSQL a la aplicación contenedora mediante Service Connector mediante los pasos siguientes:

  1. Instale la extensión sin contraseña de Service Connector para la CLI de Azure mediante el comando siguiente:

    az extension add --name serviceconnector-passwordless --upgrade --allow-preview true
    
  2. Conecte la base de datos a la aplicación contenedora con una identidad administrada asignada por el sistema mediante el comando siguiente:

    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
    

    La salida correcta es un objeto JSON que incluye la propiedad "type": "microsoft.servicelinker/linkers".

Obtenga una dirección URL completa para acceder a la aplicación Todo mediante el siguiente 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 un nuevo explorador web en el valor de ${QUARKUS_URL}. Si la página web no se representa correctamente, espere un tiempo y actualice la página.

A continuación, agregue un nuevo elemento de tareas pendientes con el texto Deployed the Todo app to Container Apps. Seleccione este elemento para marcarlo como completado.

Captura de pantalla de la aplicación de ejemplo Todo que se ejecuta en Container Apps.

Acceda a la API RESTful (/api) para obtener todos los elementos de tareas pendientes almacenados en Azure Database for PostgreSQL, como se muestra en el ejemplo siguiente:

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

La salida debería tener un aspecto similar al ejemplo siguiente:

* 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
  }
]

Comprobación de que la base de datos se ha actualizado

Ejecute el siguiente comando para comprobar que la base de datos se ha actualizado con el nuevo elemento de tareas pendientes:

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;"

Si se le pide que instale una extensión, responda Y.

La salida debe ser similar al ejemplo siguiente y debe incluir el mismo elemento en la GUI de la aplicación 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
  }
]

Cuando haya terminado, elimine la regla de firewall que permite que la dirección IP local acceda a la instancia del servidor flexible de Azure Database for PostgreSQL mediante el comando siguiente:

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

Limpieza de recursos

Para evitar los cargos de Azure, se recomienda limpiar los recursos que no sean necesarios. Cuando el clúster ya no se necesite, puede usar el comando az group delete para quitar el grupo de recursos, el servicio de contenedor, el registro de contenedor y todos los recursos relacionados.

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

Es posible que también desee utilizar docker rmi para eliminar las imágenes de contenedor generadas postgres y testcontainers generadas con el modo de desarrollo de Quarkus.

Pasos siguientes