Ejercicio: Configuración de Azure Container Apps

Completados

En esta unidad, creará un grupo de recursos de Azure que contiene los recursos de la aplicación. Después, configure la base de datos postgreSQL mediante la CLI de Azure. Por último, configure la aplicación Quarkus para acceder a la base de datos de PostgreSQL remota. Ejecute los comandos en el entorno local de Bash configurado en los requisitos previos. En Windows, usa la distribución WSL 2 configurada.

Preparación del entorno de trabajo

Vuelva al shell de Bash que usó para los comandos anteriores de Maven, en el directorio del proyecto generado todo . Si el modo de desarrollo de Quarkus sigue en ejecución, presione Ctrl+C antes de continuar. Use este shell para las siguientes operaciones de exportación y manténgalo abierto durante el inicio, el empaquetado y la implementación de la aplicación.

Use CLI de Azure 2.87.0 o posterior. Necesita permisos para crear el grupo de recursos y los recursos y registrar sus proveedores de recursos, por ejemplo, Colaborador o Propietario en el ámbito de la suscripción. La política de suscripción y la cuota pueden imponer restricciones adicionales.

Inicie sesión en Azure en este entorno local de Bash mediante el flujo de inicio de sesión de CLI de Azure interactivo, incluida la autenticación multifactor necesaria. Sustituya <subscription-id> por el identificador de suscripción previsto y, a continuación, seleccione y muestre esa suscripción:

az login
az account set --subscription "<subscription-id>"
az account show --query "{name:name,id:id}" --output table

Confirme que la suscripción mostrada es la que quiere usar antes de crear recursos cobrables. Iniciar sesión en Cloud Shell no inicia sesión en una CLI local independiente. Complete correctamente cada comando de Azure antes de continuar.

Debe configurar algunas variables de entorno. Estas son algunas notas sobre las variables que creará:

Variable Descripción
AZ_PROJECT Valor de proyecto corto y en minúsculas con un sufijo de unicidad. Mantenga el nombre de la variable sin cambios; El sufijo pertenece a su valor.
AZ_RESOURCE_GROUP Nombre del grupo de recursos que contiene los recursos.
AZ_LOCATION Región de Azure. Se recomienda usar una región cercana a la ubicación en la que vive. Para ver la lista de regiones disponibles, escriba az account list-locations en un indicador de comando.
AZ_CONTAINERAPP Nombre de la instancia de Azure Container Apps que contiene los contenedores.
AZ_CONTAINERAPP_ENV Nombre del entorno de Azure Container Apps.
AZ_POSTGRES_SERVER_NAME Nombre único global del servidor flexible de PostgreSQL. Usa entre 3 y 63 caracteres que constan de letras minúsculas, números y guiones. El valor generado psql${AZ_PROJECT} sigue estas reglas; elija un sufijo diferente si ese nombre no está disponible.
AZ_POSTGRES_DB_NAME Nombre de la base de datos de la aplicación. Usted crea esta base de datos explícitamente después de crear el servidor.
AZ_POSTGRES_USERNAME Nombre de usuario de administrador para el servidor de base de datos postgreSQL.
AZ_POSTGRES_PASSWORD Contraseña de administrador para su servidor de base de datos PostgreSQL. Escriba una contraseña segura cuando se le solicite, sin que se muestre en pantalla.

Nota:

Puede asignar un nombre a los recursos de Azure de cualquier manera que desee, pero se recomienda revisar ejemplos de abreviatura para los recursos de Azure. En este artículo se proporcionan abreviaturas de ejemplo para muchos recursos de Azure (por ejemplo, rg para grupos de recursos y ca para aplicaciones contenedoras).

Ejecute el siguiente bloque una vez para configurar las variables. Seleccione una región adecuada para la suscripción y escriba una contraseña que cumpla los requisitos del servicio PostgreSQL. La solicitud de contraseña no muestra lo que escribes.

export AZ_PROJECT="quarkus-${RANDOM}${RANDOM}"
export AZ_RESOURCE_GROUP="rg${AZ_PROJECT}"
export AZ_LOCATION="eastus"
export AZ_CONTAINERAPP="ca${AZ_PROJECT}"
export AZ_CONTAINERAPP_ENV="cae${AZ_PROJECT}"
export AZ_POSTGRES_DB_NAME="postgres${AZ_PROJECT}"
export AZ_POSTGRES_SERVER_NAME="psql${AZ_PROJECT}"
export AZ_POSTGRES_USERNAME="pgadmin"

read -r -s -p "PostgreSQL administrator password: " AZ_POSTGRES_PASSWORD
printf '\n'
export AZ_POSTGRES_PASSWORD

El sufijo aleatorio reduce las colisiones de nombre de recurso; no garantiza la disponibilidad global. Si el nombre del servidor postgreSQL no está disponible, elija otro sufijo para AZ_POSTGRES_SERVER_NAME antes de crear el servidor. Mantenga los demás identificadores de recursos sin cambios.

Estas variables de entorno se usan en el resto de este módulo. Guárdelos en este shell de Bash y no vuelva a ejecutar el bloque de nombre aleatorio y contraseña entre unidades. El terminal independiente usado para las solicitudes HTTP no necesita la contraseña de la base de datos.

A continuación, cree un grupo de recursos:

az group create \
    --name "$AZ_RESOURCE_GROUP" \
    --location "$AZ_LOCATION"

Creación de una instancia de Azure Database for PostgreSQL

Ahora creará un servidor PostgreSQL 16 administrado estándar con la SKU B1ms de tipo Burstable y 32 GiB de almacenamiento SSD Premium. La región seleccionada debe admitir esta versión y SKU y tener capacidad de suscripción disponible. Resuelva cualquier error de cuota o directiva antes de continuar.

Registre el proveedor de PostgreSQL y espere a que se complete el registro:

az provider register --namespace Microsoft.DBforPostgreSQL --wait

Important

Este paso permite temporalmente los intentos de conexión a la base de datos desde todas las direcciones IPv4 públicas. La autenticación sigue siendo necesaria. Use un nuevo servidor y grupo de recursos dedicado al ejercicio, complete la restricción de firewall posterior y elimine los recursos del ejercicio cuando haya finalizado. Esta configuración de red inicial no se recomienda para entornos de producción.

Cree el servidor PostgreSQL:

az postgres flexible-server create \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --location "$AZ_LOCATION" \
    --name "$AZ_POSTGRES_SERVER_NAME" \
    --admin-user "$AZ_POSTGRES_USERNAME" \
    --admin-password="$AZ_POSTGRES_PASSWORD" \
    --public-access All \
    --tier Burstable \
    --sku-name Standard_B1ms \
    --storage-type Premium_LRS \
    --storage-size 32 \
    --version 16 \
    --yes \
    --output none

La --public-access All opción habilita el punto de conexión público y crea la regla de firewall de direcciones all-addresses única que se usa más adelante en este módulo. La excepción Azure-services posterior sigue usando ese punto de conexión público y permite los intentos de conexión de Azure recursos, incluidas las suscripciones de otros clientes. No es acceso privado ni exclusivo de la aplicación.

Después de que la creación del servidor se realice correctamente, cree explícitamente la base de datos de la aplicación:

az postgres flexible-server db create \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --server-name "$AZ_POSTGRES_SERVER_NAME" \
    --name "$AZ_POSTGRES_DB_NAME" \
    --output none

Compruebe que la base de datos existe antes de iniciar la aplicación:

az postgres flexible-server db show \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --server-name "$AZ_POSTGRES_SERVER_NAME" \
    --name "$AZ_POSTGRES_DB_NAME" \
    --query name \
    --output tsv

El nombre devuelto debe coincidir con el valor de AZ_POSTGRES_DB_NAME. Estos comandos de base de datos usan --server-name para el servidor y --name para la base de datos.

Configuración de Quarkus para acceder a la base de datos postgreSQL

Obtenga el nombre de dominio completo (FQDN) del servidor y genere una URL de JDBC sin credenciales:

export AZ_POSTGRES_HOST=$(
    az postgres flexible-server show \
        --resource-group "$AZ_RESOURCE_GROUP" \
        --name "$AZ_POSTGRES_SERVER_NAME" \
        --query fullyQualifiedDomainName \
        --output tsv
)
export AZ_POSTGRES_JDBC_URL="jdbc:postgresql://${AZ_POSTGRES_HOST}:5432/${AZ_POSTGRES_DB_NAME}?sslmode=require"

Esta dirección URL usa sslmode=require para requerir el transporte cifrado. El nombre de usuario y la contraseña se proporcionan por separado a través de las propiedades del origen de datos, por lo que los caracteres como & en una contraseña no se analizan como parámetros de dirección URL. No imprima ni trace los valores de las credenciales.

El cifrado no es la verificación de identidad del certificado. sslmode=require no comprueba el certificado de servidor ni el nombre de host. Si necesita esa comprobación, siga las instrucciones pgJDBC verify-full e instrucciones de confianza de certificados Azure, incluida la configuración raíz de confianza. Simplemente cambiar el modo sin configurar la confianza no es un procedimiento completo de validación de certificados.

Configuración de la aplicación Quarkus para conectarse a la base de datos postgreSQL

En src/main/resources/application.properties, reemplaza las entradas existentes de URL del origen de datos sin perfil y generación de esquemas por las cuatro líneas siguientes. Quite también cualquier entrada de nombre de usuario o contraseña de origen de datos sin perfil. Mantenga literales las expresiones ${...} en el archivo; no los reemplace por los valores de credencial. Deje la configuración no relacionada sin cambios.

%dev,prod.quarkus.hibernate-orm.database.generation=update
%dev,prod.quarkus.datasource.jdbc.url=${AZ_POSTGRES_JDBC_URL}
%dev,prod.quarkus.datasource.username=${AZ_POSTGRES_USERNAME}
%dev,prod.quarkus.datasource.password=${AZ_POSTGRES_PASSWORD}

Estos ajustes se aplican a los perfiles dev y prod, no a las pruebas automatizadas. El modo de desarrollo usa la base de datos Azure para esta unidad y la aplicación implementada la usa en modo de producción. Las pruebas usan un servicio de desarrollo de PostgreSQL independiente. Mantenga Docker en ejecución al probar o empaquetar la aplicación. El ciclo de vida de Maven package ejecuta las pruebas; no debe agregar registros de prueba a la base de datos de Azure.

No exporte sobrescrituras sin perfil QUARKUS_DATASOURCE_*. Si ha establecido previamente alguno en este shell, quítelos antes de probarlos o empaquetarlos porque anulan esta separación. Las AZ_ variables solo se resuelven mediante las expresiones con ámbito de perfil. Para obtener más información, consulte la referencia de configuración de Quarkus 3.18.4.

Ejecute la aplicación Quarkus localmente para probar la conexión remota a la base de datos.

Un proceso hereda las variables de entorno cuando se inicia. Exportar AZ_POSTGRES_* en otro terminal no actualiza un proceso de Quarkus ya en ejecución y editar application.properties por sí solo no es suficiente para esta transición.

Asegúrese de que el proceso de desarrollo anterior se ha detenido presionando Ctrl+C en su terminal si es necesario. Desde el todo directorio del shell de Bash que contiene las variables de recursos y de base de datos exportadas, inicie la aplicación:

./mvnw clean quarkus:dev

Cuando se ejecuta Quarkus, cree algunos to-dos mediante los siguientes comandos cURL en un segundo terminal local de Bash. Deje el shell que contiene la variable ejecutando Quarkus:

curl --header "Content-Type: application/json" \
    --request POST \
    --data '{"description":"Take Quarkus MS Learn","details":"Take the MS Learn on deploying Quarkus to Azure Container Apps","done": "true"}' \
    http://127.0.0.1:8080/api/todos

curl --header "Content-Type: application/json" \
    --request POST \
    --data '{"description":"Take Azure Container Apps MS Learn","details":"Take the ACA Learn module","done": "false"}' \
    http://127.0.0.1:8080/api/todos

A continuación, compruebe que las tareas pendientes están en la base de datos accediendo al punto de conexión GET definido en la aplicación to-do:

curl http://127.0.0.1:8080/api/todos

La respuesta debe contener las descripciones enviadas, de forma similar a la siguiente salida. Los identificadores, las marcas de tiempo y el orden pueden variar y repetir un POST crea otro elemento.

[
  {
    "id": 1,
    "description": "Take Quarkus MS Learn",
    "details": "Take the MS Learn on deploying Quarkus to Azure Container Apps",
    "done": true,
    "createdAt": "2025-02-26T08:03:28.390854Z"
  },
  {
    "id": 2,
    "description": "Take Azure Container Apps MS Learn",
    "details": "Take the ACA Learn module",
    "done": false,
    "createdAt": "2025-02-26T08:03:34.142249Z"
  }
]

Si la respuesta contiene los elementos que creó, ha ejecutado correctamente la aplicación Quarkus y se ha conectado a la base de datos de PostgreSQL remota.

Antes de continuar empaquetando en la unidad siguiente, vuelva al terminal que ejecuta Quarkus y presione Ctrl+C. Mantenga el shell de Bash abierto en el todo directorio con todas las variables exportadas intactas. No vuelva a ejecutar el bloque de nombre aleatorio y contraseña; use este mismo terminal para empaquetar e implementar.