Tutorial: Conectar-se a um banco de dados MySQL do Java JBoss EAP no Serviço de Aplicativo do Azure

Neste tutorial, você aprenderá a conectar um aplicativo JBoss EAP Java em Serviço de Aplicativo do Azure a um banco de dados Banco de Dados do Azure para MySQL usando uma identidade gerenciada. O Serviço de Aplicativo pode usar identidade gerenciada para fornecer acesso seguro a Banco de Dados do Azure para MySQL e outros serviços Azure. Uma identidade gerenciada elimina a necessidade de usar segredos em seu aplicativo, como credenciais nas variáveis de ambiente.

Este tutorial usa comandos CLI do Azure para concluir as seguintes tarefas:

  • Cria um servidor e Banco de Dados do Azure para MySQL.
  • Implanta um aplicativo JBoss EAP de exemplo no Serviço de Aplicativo usando um pacote WAR.
  • Configura o aplicativo Web Spring Boot para usar a autenticação Microsoft Entra com o banco de dados MySQL.
  • Conecta o aplicativo Web ao banco de dados MySQL usando o Service Connector com autenticação de identidade gerenciada.

Pré-requisitos

  • Uma assinatura do Azure com permissões de atribuição de função do Microsoft Entra e permissões de gravação de recursos do Azure, em uma região do Azure que compatível com o Service Connector e que tenha suporte e cota suficientes para o Serviço de Aplicativo para o tutorial.

  • Os provedores de recursos Microsoft.ServiceLinker e Microsoft.DBforMySQL registrados em sua assinatura de Azure. Você pode executar az provider register -n Microsoft.[service] para registrar os provedores.

  • Git para acessar e clonar o repositório de exemplo.

  • Para acessar o Azure Cloud Shell e executar as etapas do tutorial, ou se preferir executar localmente, confira os seguintes pré-requisitos e etapas:

    • Java JDK Instalado

    • Maven instalado

    • jq Instalado

    • Cliente MySQL instalado

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

      Se você estiver executando localmente:

      1. Entre no Azure usando az login e seguindo os prompts.
      2. Se você tiver mais de uma assinatura Azure conectada às suas credenciais de entrada, execute az account set --subscription <subscription-ID> para selecionar a assinatura correta.

Configure seu 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 comandos a seguir para clonar o repositório de exemplo e alterar diretórios na pasta de projeto de aplicativo de exemplo. Execute 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 variáveis de ambiente para o tutorial, substituindo o marcador <region> por um valor válido. LOCATION Deve ser uma região do Azure em que sua assinatura tenha cota suficiente para criar os recursos do Azure e nenhuma restrição em qualquer um 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 um Banco de Dados do Azure para MySQL

Crie um servidor Banco de Dados do Azure para MySQL e um banco de dados em sua assinatura. O aplicativo Spring Boot se conecta a esse banco de dados e armazena seus dados durante a execução, mantendo o estado do aplicativo, independentemente de onde você executar o aplicativo.

  1. Execute o comando a seguir para criar um servidor Banco de Dados do Azure para MySQL. O nome MYSQL_HOST deve ser exclusivo em toda a Azure.

    Observação

    Embora o comando defina uma conta de administrador, a conta não é usada porque a conta Microsoft Entra administrador 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 um banco de dados nomeado checklist para o aplicativo a ser usado.

    export DATABASE_NAME="checklist"
    az mysql flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $MYSQL_HOST \
        --database-name $DATABASE_NAME
    
  3. Abra o firewall para permitir a conexão com o banco 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. Conecte-se ao banco de dados e crie as tabelas conforme especificado no arquivo de projeto de exemplo /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 temporária do firewall.

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

Criar um recurso do Serviço de Aplicativo

Crie um recurso JBoss EAP do Serviço de Aplicativo no Linux. O JBoss EAP requer uma camada 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 a seguir para criar uma identidade gerenciada atribuída pelo usuário Azure a ser usada para autenticação Microsoft Entra. Para obter mais informações, consulte Configurar a autenticação do Microsoft Entra para o Banco 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 à nova identidade atribuída ao usuário User.Read.All, GroupMember.Read.All e Application.Read.All permissões. Ou atribua à identidade a função integrada Leitores de Diretório do Microsoft Entra.

CLI do Azure não tem suporte para atribuir permissões ou funções Microsoft Entra. Você pode usar o centro de administração do Microsoft Entra, o Microsoft Graph PowerShell ou a API do Microsoft Graph para criar as atribuições. Para obter mais informações, consulte Atribuir funções do Microsoft Entra.

Observação

Para adicionar essas atribuições, você deve ter pelo menos a função Administrador de Função Privilegiada ou permissões no seu locatário do Microsoft Entra. Se você não tiver essa função, peça ao administrador global ou administrador de funções com privilégios para conceder as permissões.

Usar a identidade gerenciada para conectar os serviços

Use o Service Connector para conectar seu aplicativo Web JBoss EAP do Serviço de Aplicativo ao banco de dados MySQL com uma identidade gerenciada. O Service Connector realiza as seguintes tarefas em segundo plano:

  • Define o usuário conectado atual como o administrador do banco de dados Microsoft Entra.
  • Habilita a identidade gerenciada atribuída pelo sistema para o aplicativo.
  • Adiciona um usuário de banco de dados para a identidade gerenciada atribuída pelo sistema e concede todos os privilégios de banco de dados a esse usuário.
  • Adiciona uma cadeia de conexão chamada AZURE_MYSQL_CONNECTIONSTRING às Configurações do Aplicativo.

Use o comando az webapp connection create a seguir para conectar sua aplicação ao banco de dados MySQL usando a identidade gerenciada.

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

Compilar e implantar o aplicativo

  1. Execute o código a seguir para adicionar o plugin de autenticação sem senha à string de conexão gerada pelo Conector de Serviço. O script de inicialização do aplicativo faz referência a esse 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. Crie o aplicativo usando o arquivo pom.xml no aplicativo de exemplo para gerar o arquivo WAR.

    mvn clean package -DskipTests
    
  3. Implante o arquivo WAR e o script de inicialização no Serviço de Aplicativo.

    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 o aplicativo

  1. Execute o código a seguir para criar uma lista com alguns itens de 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 você estiver trabalhando localmente, execute o seguinte código para exibir o aplicativo:

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

    Cloud Shell não pode abrir um navegador local, portanto, se você estiver trabalhando no Cloud Shell, a maneira mais fácil de exibir o aplicativo Web é selecionar o link Browse ou Default domain próximo à parte superior da página do portal Azure do aplicativo. Em seguida, acrescente /checklist ou /checklist/1 ao final da URL no navegador, por exemplo https://mysql-mi-app.azurewebsites.net/checklist.

Limpar os recursos

Quando terminar este tutorial, você poderá evitar encargos adicionais excluindo os recursos criados. Exclua o grupo de recursos para excluir todos os recursos que ele contém. Verifique se você não precisa mais dos recursos antes de executar o comando.

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

A exclusão de todos os recursos pode levar algum tempo. O --no-wait argumento permite que o comando retorne imediatamente.