Zelfstudie: Verbinding maken met een MySQL-database vanuit Java JBoss EAP App Service met een wachtwoordloze verbinding
Azure App Service biedt een uiterst schaalbare webhostingservice met self-patchfunctie in Azure. Het biedt ook een beheerde identiteit voor uw app, een kant-en-klare oplossing voor het beveiligen van de toegang tot Azure Database for MySQL en andere Azure-services. Beheerde identiteiten in App Service maken uw app veiliger door geheimen uit uw app te elimineren, zoals referenties in de omgevingsvariabelen.
In deze zelfstudie leert u het volgende:
- Maak een MySQL-database.
- Implementeer een JBoss EAP-voorbeeld-app in Azure-app Service met behulp van een WAR-pakket.
- Configureer een Spring Boot-webtoepassing voor het gebruik van Microsoft Entra-verificatie met MySQL Database.
- Maak verbinding met MySQL Database met Managed Identity met behulp van Service Connector.
Als u geen Azure-abonnement hebt, kunt u een gratis Azure-account maken voordat u begint.
Vereisten
- Git
- Java-JDK
- Maven
- Azure CLI versie 2.46.0 of hoger.
- Azure CLI serviceconnector-wachtwoordloze extensie versie 0.2.2 of hoger.
- jq
De voorbeeld-app klonen en de opslagplaats voorbereiden
Voer de volgende opdrachten in de terminal uit om de voorbeeldopslagplaats te klonen en de omgeving van de voorbeeld-app in te stellen.
git clone https://github.com/Azure-Samples/Passwordless-Connections-for-Java-Apps
cd Passwordless-Connections-for-Java-Apps/JakartaEE/jboss-eap/
Een Azure Database for MySQL maken
Volg deze stappen om een Azure Database for MySQL-resource te maken in uw abonnement. De Spring Boot-app maakt verbinding met deze database en slaat de bijbehorende gegevens op wanneer deze wordt uitgevoerd, waardoor de toepassingsstatus behouden blijft, ongeacht waar u de toepassing uitvoert.
Meld u aan bij de Azure CLI en stel eventueel uw abonnement in als er meerdere zijn verbonden met uw aanmeldingsreferenties.
az login az account set --subscription <subscription-ID>
Maak een Azure-resourcegroep.
export RESOURCE_GROUP=<resource-group-name> export LOCATION=eastus az group create --name $RESOURCE_GROUP --location $LOCATION
Maak een Azure-database voor MySQL-server. De server wordt gemaakt met een beheerdersaccount, maar wordt niet gebruikt omdat we het Microsoft Entra-beheerdersaccount gaan gebruiken om beheertaken uit te voeren.
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
Maak een database voor de toepassing.
export DATABASE_NAME=checklist az mysql flexible-server db create \ --resource-group $RESOURCE_GROUP \ --server-name $MYSQL_HOST \ --database-name $DATABASE_NAME
Een App Service-instantie maken
Maak een Azure-app Service-resource in Linux. JBoss EAP vereist Premium SKU.
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"
De MySQL-database verbinden met identiteitsconnectiviteit
Verbind vervolgens de database met behulp van Service Connector.
Installeer de serviceconnector-extensie zonder wachtwoord voor de Azure CLI:
az extension add --name serviceconnector-passwordless --upgrade
Maak een door de gebruiker toegewezen beheerde identiteit voor Microsoft Entra-verificatie met behulp van de volgende opdracht. Zie Microsoft Entra-verificatie instellen voor Azure Database for MySQL - Flexible Server voor meer informatie.
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)
Vraag de globale beheerder of bevoorrechte rolbeheerder om de volgende machtigingen te verlenen aan de nieuwe door de gebruiker toegewezen identiteit:
User.Read.All
,GroupMember.Read.All
enApplication.Read.ALL
. Zie de sectie Machtigingen van Active Directory-verificatie voor meer informatie.Verbind uw app met een MySQL-database met een door het systeem toegewezen beheerde identiteit met behulp van Service Connector. Voer de opdracht az webapp connection create uit om deze verbinding te maken .
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
Met deze opdracht serviceconnector worden de volgende taken op de achtergrond uitgevoerd:
Schakel door het systeem toegewezen beheerde identiteit in voor de app
$APPSERVICE_NAME
die wordt gehost door Azure-app Service.Stel de Microsoft Entra-beheerder in op de huidige aangemelde gebruiker.
Voeg in stap 1 een databasegebruiker toe voor de door het systeem toegewezen beheerde identiteit en verdeel alle bevoegdheden van de database
$DATABASE_NAME
aan deze gebruiker. U kunt de gebruikersnaam ophalen uit de verbindingsreeks in de uitvoer van de vorige opdracht.Voeg een verbindingsreeks toe aan app-instellingen in de app met de naam
AZURE_MYSQL_CONNECTIONSTRING
.Notitie
Als u het foutbericht
The subscription is not registered to use Microsoft.ServiceLinker
ziet, voert u de opdrachtaz provider register --namespace Microsoft.ServiceLinker
uit om de resourceprovider van de serviceconnector te registreren en voert u de verbindingsopdracht opnieuw uit.
De toepassing implementeren
Volg deze stappen om gegevens in een database voor te bereiden en de toepassing te implementeren.
Databaseschema maken
Open een firewall om verbinding vanaf uw huidige IP-adres toe te staan.
# 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}
Maak verbinding met de database en maak tabellen.
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
Verwijder de tijdelijke firewallregel.
az mysql flexible-server firewall-rule delete \ --resource-group $RESOURCE_GROUP \ --name $MYSQL_HOST \ --rule-name AllowCurrentMachineToConnect
De toepassing implementeren
Werk de verbindingsreeks bij in app-instellingen.
Haal de verbindingsreeks op die door Service Connector is gegenereerd en voeg de invoegtoepassing voor verificatie zonder wachtwoord toe. Naar deze verbindingsreeks wordt verwezen in het opstartscript.
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}"
De voorbeeld-app bevat een pom.xml-bestand dat het WAR-bestand kan genereren. Voer de volgende opdracht uit om de app te bouwen.
mvn clean package -DskipTests
Implementeer de WAR en het opstartscript in de 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
Voorbeeldweb-app testen
Voer de volgende opdracht uit om de toepassing te testen.
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
Resources opschonen
In de voorgaande stappen hebt u Azure-resources in een resourcegroep gemaakt. Als u deze resources niet meer nodig denkt te hebben, verwijdert u de resourcegroep door de volgende opdracht in Cloud Shell uit te voeren:
az group delete --name myResourceGroup
Het kan een minuut duren voordat deze opdracht is uitgevoerd.
Volgende stap
Lees meer over het uitvoeren van Java-apps in Azure App Service in Linux in de handleiding voor ontwikkelaars.