Tutorial: Conexión a una base de datos PostgreSQL desde Java Tomcat App Service sin secretos mediante una identidad administrada

Azure App Service proporciona un servicio de hospedaje web muy escalable y con aplicación de revisiones de un modo automático en Azure. También proporciona una identidad administrada para la aplicación, la cual constituye una solución inmediata para proteger el acceso a Azure Database for PostgreSQL y a otros servicios de Azure. Las identidades administradas de App Service hacen que su aplicación sea más segura mediante la eliminación de los secretos de aplicación como, por ejemplo, las credenciales de las variables de entorno. En este tutorial, aprenderá a:

  • Crear una base de datos PostgreSQL.
  • Implementar la aplicación de ejemplo en Azure App Service en Tomcat mediante el empaquetado WAR.
  • Configure una aplicación web de Tomcat para que use la autenticación de Microsoft Entra con una base de datos de PostgreSQL.
  • Conectar una base de datos PostgreSQL con una identidad administrada mediante el conector de servicio.

Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.

Requisitos previos

Clonación de la aplicación de ejemplo y preparación del repositorio

Ejecute los comandos siguientes en su terminal para clonar el repositorio de ejemplo y configurar el entorno de aplicación de ejemplo.

git clone https://github.com/Azure-Samples/Passwordless-Connections-for-Java-Apps
cd Passwordless-Connections-for-Java-Apps/Tomcat/

Creación de una instancia de Azure Database for PostgreSQL

Siga estos pasos para crear una instancia de Azure Database for Postgres en la suscripción. La aplicación Tomcat se conecta a esta base de datos y almacena sus datos al ejecutarse, lo que conserva el estado de la aplicación, independientemente de dónde se ejecute esta.

  1. Inicie sesión en la CLI de Azure y, de manera opcional, establezca la suscripción si tiene más de una conectada a las credenciales de inicio de sesión.

    az login
    az account set --subscription <subscription-ID>
    
  2. Cree un grupo de recursos de Azure, teniendo en cuenta el nombre del grupo de recursos.

    export RESOURCE_GROUP=<resource-group-name>
    export LOCATION=eastus
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Cree un servidor de Azure Database for PostgreSQL. El servidor se crea con una cuenta de administrador, pero no se utiliza porque se utilizará la cuenta de administrador de Microsoft Entra para realizar tareas administrativas.

    export POSTGRESQL_ADMIN_USER=azureuser
    # PostgreSQL admin access rights won't be used because Azure AD authentication is leveraged to administer the database.
    export POSTGRESQL_ADMIN_PASSWORD=<admin-password>
    export POSTGRESQL_HOST=<postgresql-host-name>
    
    # Create a PostgreSQL server.
    az postgres flexible-server create \
        --resource-group $RESOURCE_GROUP \
        --name $POSTGRESQL_HOST \
        --location $LOCATION \
        --admin-user $POSTGRESQL_ADMIN_USER \
        --admin-password $POSTGRESQL_ADMIN_PASSWORD \
        --public-access 0.0.0.0 \
        --sku-name Standard_D2s_v3
    
  4. Cree una base de datos para la aplicación.

    export DATABASE_NAME=checklist
    
    az postgres flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $POSTGRESQL_HOST \
        --database-name $DATABASE_NAME
    

Implementación de la aplicación en App Service

Siga estos pasos para crear un archivo WAR e implementarlo en Azure App Service en Tomcat mediante un empaquetado WAR.

  1. La aplicación de ejemplo contiene un archivo pom.xml que puede generar el archivo WAR. Ejecute el siguiente comando para crear la aplicación.

    mvn clean package -f pom.xml
    
  2. Cree un recurso de Azure App Service en Linux con Tomcat 9.0.

    export APPSERVICE_PLAN=<app-service-plan>
    export APPSERVICE_NAME=<app-service-name>
    # Create an App Service plan
    az appservice plan create \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_PLAN \
        --location $LOCATION \
        --sku B1 \
        --is-linux
    
    # Create an App Service resource.
    az webapp create \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --plan $APPSERVICE_PLAN \
        --runtime "TOMCAT:10.0-java11"
    
  3. Implemente el paquete WAR en App Service.

    az webapp deploy \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --src-path target/app.war \
        --type war
    

Conexión de la base de datos de Postgres con conectividad de identidad

Después, conecte la base de datos mediante el Conector de servicio.

Instale la extensión sin contraseña del Conector de servicio para la CLI de Azure:

az extension add --name serviceconnector-passwordless --upgrade

Después, conecte la aplicación a una base de datos de Postgres con una identidad administrada asignada por el sistema mediante el Conector de servicio.

Para ello, ejecute el comando az webapp connection create.

az webapp connection create postgres-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $POSTGRESQL_HOST \
    --database $DATABASE_NAME \
    --system-identity \
    --client-type java

Este comando crea una conexión entre la aplicación web y el servidor PostgreSQL y administra la autenticación mediante una identidad administrada asignada por el sistema.

A continuación, actualice la configuración de la aplicación y agregue el complemento en la cadena de conexión

export AZURE_POSTGRESQL_CONNECTIONSTRING=$(\
    az webapp config appsettings list \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
    | jq -c -r '.[] \
    | select ( .name == "AZURE_POSTGRESQL_CONNECTIONSTRING" ) \
    | .value')

az webapp config appsettings set \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --settings 'CATALINA_OPTS=-DdbUrl="'"${AZURE_POSTGRESQL_CONNECTIONSTRING}"'&authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin"'

Prueba de la aplicación web de ejemplo

Use el siguiente comando para ejecutar la aplicación.

export WEBAPP_URL=$(az webapp show \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --query defaultHostName \
    --output tsv)

# Create a list
curl -X POST -H "Content-Type: application/json" -d '{"name": "list1","date": "2022-03-21T00:00:00","description": "Sample checklist"}' https://${WEBAPP_URL}/checklist

# Create few items on the list 1
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 1"}' https://${WEBAPP_URL}/checklist/1/item
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 2"}' https://${WEBAPP_URL}/checklist/1/item
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 3"}' https://${WEBAPP_URL}/checklist/1/item

# Get all lists
curl https://${WEBAPP_URL}/checklist

# Get list 1
curl https://${WEBAPP_URL}/checklist/1

Limpieza de recursos

En los pasos anteriores, creó recursos de Azure en un grupo de recursos. Si prevé que no necesitará estos recursos en el futuro, elimine el grupo de recursos ejecutando el siguiente comando en Cloud Shell:

az group delete --name myResourceGroup

Este comando puede tardar varios segundos en ejecutarse.

Pasos siguientes

Más información acerca de la ejecución de aplicaciones de Java en App Service en Linux en la guía del desarrollador.

Obtenga información sobre cómo proteger la aplicación con un dominio personalizado y un certificado.