Tutorial: Liga-te a uma base de dados MySQL a partir do Java JBoss EAP no Serviço de Aplicações do Azure

Neste tutorial, aprende a ligar uma aplicação EAP Java JBoss em Serviço de Aplicações do Azure a uma base de dados Base de Dados do Azure para MySQL usando uma identidade gerida. A App Service pode usar managed identity para fornecer acesso seguro a Base de Dados do Azure para MySQL e outros serviços Azure. Uma identidade gerida elimina a necessidade de usar segredos na sua aplicação, como credenciais nas variáveis de ambiente.

Este tutorial utiliza comandos CLI do Azure para completar as seguintes tarefas:

  • Cria um servidor e uma base de dados no Base de Dados do Azure para MySQL.
  • Implementa um exemplo de aplicação JBoss EAP para App Service usando um pacote WAR.
  • Configura a aplicação web Spring Boot para usar autenticação Microsoft Entra com a base de dados MySQL.
  • Liga a aplicação web à base de dados MySQL usando o Service Connector com autenticação de identidade gerida.

Pré-requisitos

  • Uma subscrição Azure com permissões para atribuição de funções Microsoft Entra e permissões de escrita em recursos Azure, numa região Azure que suporte o Service Connector e tenha suporte e quota suficientes de App Service para o tutorial.

  • Os fornecedores de recursos Microsoft.ServiceLinker e Microsoft.DBforMySQL registrados na sua subscrição do Azure. Pode executar az provider register -n Microsoft.[service] para registar os fornecedores.

  • Git para aceder e clonar o repositório de exemplos.

  • Acesso a Azure Cloud Shell para executar os passos do tutorial, ou, se preferires correr localmente, os seguintes pré-requisitos e passos:

    • Java JDK instalado

    • Maven instalado

    • jq instalado

    • Cliente MySQL instalado

    • CLI do Azure 2.46.0 ou superior instalado. Para verificar a sua versão, execute az --version. Para atualizar, execute az upgrade.

      Se estiver a executar localmente:

      1. Inicie sessão no Azure usando az login e seguindo as indicações.
      2. Se tiver mais do que uma subscrição de Azure ligada às suas credenciais de inicio, execute az account set --subscription <subscription-ID> para selecionar a subscrição correta.

Configurar o ambiente

  1. Instale as seguintes extensões da CLI do Azure:

    az extension add --name serviceconnector-passwordless --upgrade
    az extension add --name rdbms-connect
    
  2. Execute os seguintes comandos para clonar o repositório de exemplo e alterar diretórios para a pasta de projeto da aplicação de exemplo. Executa todos os comandos restantes desta pasta.

    git clone https://github.com/Azure-Samples/Passwordless-Connections-for-Java-Apps
    cd Passwordless-Connections-for-Java-Apps/JakartaEE/jboss-eap/
    
  3. Defina as seguintes variáveis de ambiente para o tutorial, substituindo o <region> marcador por um valor válido. LOCATION deve ser uma região Azure onde a sua subscrição tenha quota suficiente para criar os recursos Azure e sem restrições a nenhum dos serviços.

    LOCATION="<region>"
    RESOURCE_GROUP="mysql-mi-webapp"
    
  4. Crie um grupo de recursos Azure para conter todos os recursos do projeto. O nome do grupo de recursos é armazenado em cache e aplicado automaticamente aos comandos subsequentes.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    

Criar uma Base de dados do Azure para MySQL

Crie um servidor e uma base de dados do Base de Dados do Azure para MySQL na sua subscrição. A aplicação Spring Boot liga-se a esta base de dados e armazena os seus dados durante a execução, mantendo o estado da aplicação independentemente de onde a execute.

  1. Execute o seguinte comando para criar um servidor Base de Dados do Azure para MySQL. O nome MYSQL_HOST deve ser único em todo o Azure.

    Nota

    Embora o comando defina uma conta de administrador, a conta não é usada porque a conta de administrador da Microsoft Entra faz todas as tarefas administrativas.

    export MYSQL_ADMIN_USER=azureuser
    export MYSQL_ADMIN_PASSWORD="AdminPassword1"
    export RAND_ID=$RANDOM
    export MYSQL_HOST="mysql-mi-$RAND_ID"
    az mysql flexible-server create \
        --name $MYSQL_HOST \
        --resource-group $RESOURCE_GROUP \
        --location $LOCATION \
        --admin-user $MYSQL_ADMIN_USER \
        --admin-password $MYSQL_ADMIN_PASSWORD \
        --public-access 0.0.0.0 \
        --tier Burstable \
        --sku-name Standard_B1ms \
        --storage-size 32
    
  2. Crie uma base de dados com o nome checklist da aplicação a utilizar.

    export DATABASE_NAME="checklist"
    az mysql flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $MYSQL_HOST \
        --database-name $DATABASE_NAME
    
  3. Abra um firewall para permitir a ligação à base de dados a partir do seu endereço IP atual.

    # Create a temporary firewall rule to allow connections from your current machine to the MySQL server
    export MY_IP=$(curl http://whatismyip.akamai.com)
    az mysql flexible-server firewall-rule create \
        --resource-group $RESOURCE_GROUP \
        --name $MYSQL_HOST \
        --rule-name AllowCurrentMachineToConnect \
        --start-ip-address ${MY_IP} \
        --end-ip-address ${MY_IP}
    
  4. Ligue-se à base de dados e crie as tabelas conforme especificado no ficheiro de exemplo do projeto /azure/init-db.sql .

    export DATABASE_FQDN=${MYSQL_HOST}.mysql.database.azure.com
    export CURRENT_USER=$(az account show --query user.name --output tsv)
    export RDBMS_ACCESS_TOKEN=$(az account get-access-token \
        --resource-type oss-rdbms \
        --output tsv \
        --query accessToken)
    mysql -h "${DATABASE_FQDN}" --user "${CURRENT_USER}" --password="$RDBMS_ACCESS_TOKEN" < azure/init-db.sql
    
  5. Remova a regra de firewall temporária.

    az mysql flexible-server firewall-rule delete \
        --resource-group $RESOURCE_GROUP \
        --name $MYSQL_HOST \
        --rule-name AllowCurrentMachineToConnect
    

Criar um recurso de Serviço de Aplicação

Crie um recurso EAP JBoss de serviço de aplicação no Linux. O EAP do JBoss requer um nível Premium sku .

# Create an App Service plan
export APPSERVICE_PLAN="mysql-mi-plan"
export APPSERVICE_NAME="mysql-mi-app"
az appservice plan create \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_PLAN \
    --location $LOCATION \
    --sku P1V3 \
    --is-linux

# Create an App Service web app
az webapp create \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --plan $APPSERVICE_PLAN \
    --runtime "JBOSSEAP:7-java8"

Criar e configurar uma identidade gerenciada atribuída pelo usuário

Use o comando seguinte para criar uma identidade gerida atribuída pelo utilizador do Azure para a autenticação Microsoft Entra. Para obter mais informações, consulte Configurar a autenticação do Microsoft Entra para o Base de Dados do Azure para MySQL - Servidor Flexível.

export USER_IDENTITY_NAME="my-user-assigned-identity"
export IDENTITY_RESOURCE_ID=$(az identity create \
    --name $USER_IDENTITY_NAME \
    --resource-group $RESOURCE_GROUP \
    --query id \
    --output tsv)

Conceda permissões à nova identidade atribuída ao utilizador User.Read.All, GroupMember.Read.All e Application.Read.All. Alternativamente, atribua à identidade o papel incorporado Microsoft Entra Leitores de Diretório.

O CLI do Azure não é suportado para atribuir permissões ou funções ao Microsoft Entra. Pode usar o centro de administração Microsoft Entra, o Microsoft Graph PowerShell ou a Microsoft Graph API para criar as atribuições. Para obter mais informações, consulte Atribuir funções do Microsoft Entra.

Nota

Para adicionar estas atribuições, deve ter, pelo menos, a função ou permissões de Administrador de Funções Privilegiadas no seu tenant do Microsoft Entra. Se não tiver esta função, peça ao seu Administrador Global ou ao Administrador de Funções Privilegiadas para conceder as permissões.

Use a identidade gerida para ligar os serviços

Use o Service Connector para ligar a sua aplicação web App Service JBoss EAP à base de dados MySQL com uma identidade gerida. O Service Connector realiza as seguintes tarefas em segundo plano:

  • Define o utilizador atual com sessão como administrador da base de dados Microsoft Entra.
  • Ativa a identidade gerida atribuída ao sistema para a aplicação.
  • Adiciona um utilizador da base de dados para a identidade gerida atribuída pelo sistema e concede todos os privilégios da base de dados a este utilizador.
  • Adiciona uma cadeia de ligação chamada AZURE_MYSQL_CONNECTIONSTRING às Definições da App.

Use o seguinte comando az webapp connection create para conectar a sua aplicação à base de dados MySQL usando a identidade gerida.

az webapp connection create mysql-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $MYSQL_HOST \
    --database $DATABASE_NAME \
    --system-identity mysql-identity-id=$IDENTITY_RESOURCE_ID \
    --client-type java

Criar e implementar a aplicação

  1. Execute o código seguinte para adicionar o plug-in de autenticação sem palavra-passe à cadeia de conexão gerada pelo Service Connector. O script de arranque da aplicação refere-se a esta cadeia de conexão.

    export PASSWORDLESS_URL=$(\
        az webapp config appsettings list \
            --resource-group $RESOURCE_GROUP \
            --name $APPSERVICE_NAME \
        | jq -c '.[] \
        | select ( .name == "AZURE_MYSQL_CONNECTIONSTRING" ) \
        | .value' \
        | sed 's/"//g')
    # Create a new environment variable with the connection string including the passwordless authentication plugin
    export PASSWORDLESS_URL=${PASSWORDLESS_URL}'&defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin'
    az webapp config appsettings set \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --settings "AZURE_MYSQL_CONNECTIONSTRING_PASSWORDLESS=${PASSWORDLESS_URL}"
    
  2. Constrói a aplicação usando o ficheiropom.xml na aplicação de exemplo para gerar o ficheiro WAR.

    mvn clean package -DskipTests
    
  3. Implemente o ficheiro WAR e o script de arranque no App Service.

    az webapp deploy \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --src-path target/ROOT.war \
        --type war
    az webapp deploy \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --src-path src/main/webapp/WEB-INF/createMySQLDataSource.sh \
        --type startup
    

Testar a aplicação

  1. Execute o código seguinte para criar uma lista com alguns itens da lista.

    export WEBAPP_URL=$(az webapp show \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --query defaultHostName \
        --output tsv)/$DATABASE_NAME
    
    # 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}
    
    # Create few items on the list 1
    curl -X POST -H "Content-Type: application/json" -d '{"description": "item 1"}' https://${WEBAPP_URL}/1/item
    curl -X POST -H "Content-Type: application/json" -d '{"description": "item 2"}' https://${WEBAPP_URL}/1/item
    curl -X POST -H "Content-Type: application/json" -d '{"description": "item 3"}' https://${WEBAPP_URL}/1/item
    
  2. Se estiver a trabalhar localmente, execute o seguinte código para visualizar a aplicação:

    # Get all list items
    curl https://${WEBAPP_URL}
    
    # Get list item 1
    curl https://${WEBAPP_URL}/1
    

    Cloud Shell não consegue abrir um navegador local, por isso, se estiver a trabalhar em Cloud Shell, a forma mais fácil de ver a aplicação web é selecionar o link Browse ou Domínio predefinido perto do topo da página do portal de Azure da app. Depois acrescenta /checklist ou /checklist/1 ao final da URL no teu navegador, por exemplo https://mysql-mi-app.azurewebsites.net/checklist.

Limpar recursos

Quando terminares este tutorial, podes evitar mais encargos apagando os recursos que criaste. Apague o grupo de recursos para eliminar todos os recursos que contém. Certifica-te de que já não precisas dos recursos antes de executares o comando.

az group delete --name $RESOURCE_GROUP --no-wait

Excluir todos os recursos pode levar algum tempo. O --no-wait argumento permite que o comando volte imediatamente.