Tutorial: conectar a um banco de dados MySQL a partir do Serviço de Aplicativo Java JBoss EAP com conexão sem senha

O Serviço de Aplicativo do Azure fornece um serviço de hospedagem na Web altamente escalonável e com aplicação automática de patches no Azure. Ele também fornece uma identidade gerenciada para seu aplicativo, que é uma solução pronta para proteger o acesso ao Banco de Dados do Azure para MySQL e a outros serviços do Azure. As identidades gerenciadas no Serviço de Aplicativo tornam seu aplicativo mais seguro, eliminando os segredos do aplicativo, como as credenciais nas variáveis de ambiente. Neste tutorial, você aprenderá a:

  • Crie um banco de dados MySQL.
  • Implantar um aplicativo JBoss EAP de amostra no Serviço de Aplicativo do Azure utilizando um pacote WAR.
  • Configure um aplicativo Web do Spring Boot para usar a autenticação do Microsoft Entra com o Banco de Dados MySQL.
  • Conecte-se ao banco de dados MySQL com a Identidade Gerenciada utilizando o conector de serviço.

Caso você não tenha uma assinatura do Azure, crie uma conta gratuita do Azure antes de começar.

Pré-requisitos

Clonar o aplicativo de exemplo e preparar o repositório

Execute os seguintes comandos no seu terminal para clonar o repositório de exemplo e configurar o ambiente de aplicativo de exemplo.

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

Criar um Banco de Dados do Azure para MySQL

Siga estas etapas para criar um Banco de Dados do Azure para MySQL na sua assinatura. O aplicativo Spring Boot se conecta a esse banco de dados e armazena seus dados durante a execução, persistindo o estado do aplicativo independentemente de onde ele seja executado.

  1. Entre na CLI do Azure e, opcionalmente, configure sua assinatura se tiver mais de um usuário conectado às suas credenciais de logon.

    az login
    az account set --subscription <subscription-ID>
    
  2. Crie um Grupo de Recursos do Azure observando o nome do grupo de recursos.

    export RESOURCE_GROUP=<resource-group-name>
    export LOCATION=eastus
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Criar um servidor de Banco de Dados do Azure para MySQL. O servidor é criado com uma conta de administrador, mas ela não é usada porque utilizaremos a conta de administrador do Microsoft Entra para realizar tarefas administrativas.

    export MYSQL_ADMIN_USER=azureuser
    # MySQL admin access rights won't be used because Azure AD authentication is leveraged to administer the database.
    export MYSQL_ADMIN_PASSWORD=<admin-password>
    export MYSQL_HOST=<mysql-host-name>
    
    # Create a MySQL server.
    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
    
  4. Crie um banco de dados para o aplicativo.

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

Criar um Serviço de Aplicativo

Crie um recurso do Serviço de Aplicativo do Azure no Linux. O JBoss EAP exige a SKU Premium.

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 P1V3 \
    --is-linux

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

Conecte o banco de dados MySQL com a conectividade da identidade

Em seguida, conecte o banco de dados usando o Conector de Serviço.

Instale a extensão sem senha do Conector de Serviço para a CLI do Azure:

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

Em seguida, use o comando a seguir para criar uma identidade gerenciada atribuída pelo usuário para autenticação do Microsoft Entra. Para obter mais informações, confira Configurar a autenticação do Microsoft Entra para o Banco de Dados do Azure para MySQL – Servidor Flexível.

export USER_IDENTITY_NAME=<your-user-assigned-managed-identity-name>
export IDENTITY_RESOURCE_ID=$(az identity create \
    --name $USER_IDENTITY_NAME \
    --resource-group $RESOURCE_GROUP \
    --query id \
    --output tsv)

Importante

Após criar a identidade atribuída pelo usuário, peça ao Administrador Global ou Administrador de Função com Privilégios para conceder as seguintes permissões para essa identidade: User.Read.All, GroupMember.Read.All e Application.Read.ALL. Para obter mais informações, consulte a seção Permissões da autenticação do Active Directory.

Em seguida, conecte seu aplicativo a um banco de dados MySQL com uma identidade gerenciada atribuída pelo sistema usando o Conector de Serviço. Para fazer essa conexão, execute o comando az webapp connection create.

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

Esse comando do conector de serviço executa as seguintes tarefas em segundo plano:

  • Habilitar a identidade gerenciada atribuída pelo sistema para o aplicativo $APPSERVICE_NAME hospedado pelo Serviço de Aplicativo do Azure.

  • Defina o administrador do Microsoft Entra como o usuário conectado atual.

  • Adicione um usuário de banco de dados para a identidade atribuída pelo sistema e gerenciada na etapa 1 e conceda todos os privilégios do banco de dados $DATABASE_NAME a esse usuário. Você pode obter o nome de usuário da cadeia de conexão na saída do comando anterior.

  • Adicione uma cadeia de conexão às Configurações do Aplicativo no aplicativo chamado AZURE_MYSQL_CONNECTIONSTRING.

    Observação

    Se você conferir a mensagem de erro The subscription is not registered to use Microsoft.ServiceLinker, execute o comando az provider register --namespace Microsoft.ServiceLinker para registrar o provedor de recursos do Conector de Serviço e, em seguida, execute o comando de conexão novamente.

Implantar o aplicativo

Siga estas etapas para preparar os dados em um banco de dados e implantar o aplicativo.

Criar um esquema de banco de dados

  1. Abra um firewall para permitir a conexão 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}
    
  2. Conecte-se ao banco de dados e crie tabelas.

    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}" --enable-cleartext-plugin --password="$RDBMS_ACCESS_TOKEN" < azure/init-db.sql
    
  3. Remova a regra temporária do firewall.

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

Implantar o aplicativo

  1. Obtenha a cadeia de conexão gerada pelo Conector de Serviço e adicione o plug-in de autenticação sem senha.

    Obtenha a cadeia de conexão gerada pelo Conector de Serviço e adicione o plug-in de autenticação sem senha. Essa cadeia de conexão está referenciada no script de inicializaçã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. O aplicativo de exemplo contém um arquivo pom.xml que pode gerar o arquivo WAR. Execute o comando a seguir para compilar o aplicativo.

    mvn clean package -DskipTests
    
  3. Implante o WAR e o script de inicialização no serviço do 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 Web de amostra

Execute o seguinte comando para testar o aplicativo.

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

Limpar os recursos

Nas etapas anteriores, você criou os recursos do Azure em um grupo de recursos. Se você acha que não precisará desses recursos no futuro, exclua o grupo de recursos executando o seguinte comando no Cloud Shell:

az group delete --name myResourceGroup

Esse comando pode demorar um pouco para ser executado.

Próximas etapas

Saiba mais sobre como executar aplicativos Java no Serviço de Aplicativo no Linux no guia do desenvolvedor.