Compartir vía


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 alojamiento web autogestionado y altamente escalable en Azure. También proporciona una identidad administrada para la aplicación, que es una solución llave en clave para proteger el acceso a Azure Database for PostgreSQL y 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.
  • Implemente la aplicación de ejemplo en Azure App Service en Tomcat mediante el empaquetado WAR.
  • Configura una aplicación web de Tomcat para usar la autenticación de Microsoft Entra con la base de datos PostgreSQL.
  • Conectar una base de datos PostgreSQL con una identidad administrada mediante el conector de servicio.

Si no tiene una cuenta de Azure, cree una cuenta free antes de comenzar.

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/

Cree una base de datos de Azure para PostgreSQL

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

  1. Inicie sesión en el CLI de Azure y, opcionalmente, 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 Azure y observe 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 Azure Database for PostgreSQL. El servidor se crea con una cuenta de administrador, pero no se usa porque vamos a usar 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 compilar 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. Para compilar la aplicación, ejecute el siguiente comando.

    mvn clean package -f pom.xml
    
  2. Cree un recurso de Azure App Service en Linux mediante 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 de Service Connector 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 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

Pruebe la aplicación mediante la ejecución del comando siguiente.

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 no espera necesitar estos recursos en el futuro, elimine el grupo de recursos ejecutando el comando siguiente en el Cloud Shell:

az group delete --name myResourceGroup

Este comando puede tardar un par de minutos en ejecutarse.

Pasos siguientes

Obtenga más información sobre cómo ejecutar aplicaciones de Java en App Service en Linux en la guía para desarrolladores.

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