Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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.ServiceLinkereMicrosoft.DBforMySQLregistrados na sua subscrição do Azure. Pode executaraz 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 JDKinstaladoMaven instalado
jqinstaladoCliente MySQL instalado
CLI do Azure 2.46.0 ou superior instalado. Para verificar a sua versão, execute
az --version. Para atualizar, executeaz upgrade.Se estiver a executar localmente:
- Inicie sessão no Azure usando
az logine seguindo as indicações. - 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.
- Inicie sessão no Azure usando
Configurar o ambiente
Instale as seguintes extensões da CLI do Azure:
az extension add --name serviceconnector-passwordless --upgrade az extension add --name rdbms-connectExecute 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/Defina as seguintes variáveis de ambiente para o tutorial, substituindo o
<region>marcador por um valor válido.LOCATIONdeve 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"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.
Execute o seguinte comando para criar um servidor Base de Dados do Azure para MySQL. O nome
MYSQL_HOSTdeve 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 32Crie uma base de dados com o nome
checklistda 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_NAMEAbra 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}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.sqlRemova 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
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}"Constrói a aplicação usando o ficheiropom.xml na aplicação de exemplo para gerar o ficheiro WAR.
mvn clean package -DskipTestsImplemente 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
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/itemSe 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}/1Cloud 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
/checklistou/checklist/1ao final da URL no teu navegador, por exemplohttps://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.