Zelfstudie: Verbinding maken met een MySQL-database vanuit Java JBoss EAP op Azure App Service

In deze zelfstudie leert u hoe u een Java JBoss EAP-app verbindt op Azure App Service met een Azure Database for MySQL-database met behulp van een beheerde identiteit. App Service kan managed identity gebruiken om beveiligde toegang te bieden tot Azure Database for MySQL en andere Azure-services. Een beheerde identiteit elimineert de noodzaak om geheimen in uw app te gebruiken, zoals referenties in de omgevingsvariabelen.

In deze zelfstudie worden Azure CLI opdrachten gebruikt om de volgende taken uit te voeren:

  • Hiermee maakt u een Azure Database for MySQL-server en -database.
  • Implementeert een JBoss EAP-voorbeeld-app in App Service met behulp van een WAR-pakket.
  • Hiermee configureert u de Spring Boot-webtoepassing voor het gebruik van Microsoft Entra verificatie met de MySQL-database.
  • Hiermee verbindt u de web-app met de MySQL-database met behulp van Service Connector met verificatie van beheerde identiteiten.

Vereisten

  • Een Azure-abonnement met Microsoft Entra roltoewijzingsmachtigingen en Azure schrijfmachtigingen voor resources in een Azure regio die serviceconnector ondersteunt en voldoende App-serviceondersteuning en -quota heeft voor de zelfstudie.

  • De Microsoft.ServiceLinker en Microsoft.DBforMySQL resourceproviders die zijn geregistreerd in uw Azure-abonnement. U kunt az provider register -n Microsoft.[service] uitvoeren om de providers te registreren.

  • Git om de voorbeeldopslagplaats te openen en te klonen.

  • Toegang tot Azure Cloud Shell om de zelfstudiestappen uit te voeren, of als u liever lokaal wilt uitvoeren, zijn de volgende vereisten en stappen:

    • Java JDK Geïnstalleerd

    • Maven geïnstalleerd

    • jq Geïnstalleerd

    • MySQL-client geïnstalleerd

    • Azure CLI 2.46.0 of hoger geïnstalleerd. Voer de opdracht uit az --versionom uw versie te controleren. Voer az upgrade uit voor een upgrade.

      Als u lokaal werkt:

      1. Meld u aan bij Azure met behulp van az login en volg de aanwijzingen.
      2. Als u meer dan één Azure abonnement hebt verbonden met uw aanmeldingsreferenties, voert u az account set --subscription <subscription-ID> uit om het juiste abonnement te selecteren.

Uw omgeving instellen

  1. Installeer de volgende Azure CLI-extensies:

    az extension add --name serviceconnector-passwordless --upgrade
    az extension add --name rdbms-connect
    
  2. Voer de volgende opdrachten uit om de voorbeeldopslagplaats te klonen en mappen te wijzigen in de projectmap van de voorbeeld-app. Voer alle resterende opdrachten uit vanuit deze map.

    git clone https://github.com/Azure-Samples/Passwordless-Connections-for-Java-Apps
    cd Passwordless-Connections-for-Java-Apps/JakartaEE/jboss-eap/
    
  3. Definieer de volgende omgevingsvariabelen voor de zelfstudie, waarbij u de <region> tijdelijke aanduiding vervangt door een geldige waarde. LOCATION moet een regio van Azure zijn waarin uw abonnement voldoende capaciteit heeft om de Azure-resources aan te maken en geen beperkingen op een van de services.

    LOCATION="<region>"
    RESOURCE_GROUP="mysql-mi-webapp"
    
  4. Maak een Azure resourcegroep om alle projectresources te bevatten. De naam van de resourcegroep wordt in de cache opgeslagen en automatisch toegepast op volgende opdrachten.

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

Een Azure MySQL-database maken

Maak een Azure-database voor een MySQL-server en database in uw abonnement aan. 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.

  1. Voer de volgende opdracht uit om een Azure Database for MySQL-server te maken. De naam MYSQL_HOST moet uniek zijn in alle Azure.

    Notitie

    Hoewel de opdracht een beheerdersaccount definieert, wordt het account niet gebruikt omdat het Microsoft Entra beheerdersaccount alle beheertaken uitvoert.

    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. Maak een database genaamd checklist voor gebruik door de applicatie.

    export DATABASE_NAME="checklist"
    az mysql flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $MYSQL_HOST \
        --database-name $DATABASE_NAME
    
  3. Open een firewall om verbinding met de database 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}
    
  4. Maak verbinding met de database en maak de tabellen zoals opgegeven in het voorbeeldprojectbestand /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. Verwijder de tijdelijke firewallregel.

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

Een App Service-resource maken

Maak een App Service JBoss EAP-resource in Linux. JBoss EAP vereist een Premium-laag 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"

Een door de gebruiker toegewezen beheerde identiteit maken en configureren

Gebruik de volgende opdracht om een Azure door de gebruiker toegewezen beheerde identiteit te maken die moet worden gebruikt voor Microsoft Entra verificatie. Zie Microsoft Entra-verificatie instellen voor Azure Database for MySQL - Flexible Server voor meer informatie.

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)

De nieuwe door de gebruiker toegewezen identiteit User.Read.All, GroupMember.Read.All en Application.Read.All machtigingen verlenen. Als alternatief kunt u de identiteit de Microsoft Entra ingebouwde rol Directory Readers geven.

Azure CLI wordt niet ondersteund voor het toewijzen van Microsoft Entra machtigingen of rollen. U kunt de Microsoft Entra-beheercentrum, Microsoft Graph PowerShell of Microsoft Graph-API gebruiken om de toewijzingen te maken. Zie Microsoft Entra-rollen toewijzenvoor meer informatie.

Notitie

Als u deze toewijzingen wilt toevoegen, moet u ten minste de rol of machtigingen van Privileged Role Administrator in uw Microsoft Entra-tenant hebben. Als u deze rol niet hebt, vraagt u de globale beheerder of bevoorrechte rolbeheerder om de machtigingen te verlenen.

Beheerde identiteit gebruiken om de services te verbinden

Gebruik Service Connector om uw App Service JBoss EAP-web-app te verbinden met de MySQL-database met een beheerde identiteit. ServiceConnector voert de volgende taken op de achtergrond uit:

  • Hiermee stelt u de huidige aangemelde gebruiker in als de Microsoft Entra-databasebeheerder.
  • Hiermee schakelt u door het systeem toegewezen beheerde identiteit voor de app in.
  • Voegt een databasegebruiker toe voor de door het systeem toegewezen beheerde identiteit en verleent alle databasebevoegdheden aan deze gebruiker.
  • Hiermee voegt u een verbindingsreeks met de naam AZURE_MYSQL_CONNECTIONSTRING toe aan de App-instellingen.

Gebruik de volgende opdracht az webapp connection create om uw app te verbinden met de MySQL-database met behulp van de beheerde identiteit.

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

De app bouwen en implementeren

  1. Voer de volgende code uit om de invoegtoepassing voor verificatie zonder wachtwoord toe te voegen aan de gegenereerde verbindingsreeks Service Connector. Het opstartscript van de app verwijst naar deze verbindingsreeks.

    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. Bouw de app met behulp van het pom.xml-bestand in de voorbeeld-app om het WAR-bestand te genereren.

    mvn clean package -DskipTests
    
  3. Implementeer het WAR-bestand en het opstartscript in 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
    

De app testen

  1. Voer de volgende code uit om een lijst met enkele lijstitems te maken.

    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. Als u lokaal werkt, voert u de volgende code uit om de app weer te geven:

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

    Cloud Shell kan geen lokale browser openen, dus als u in Cloud Shell werkt, kunt u de web-app het eenvoudigst weergeven door de Browse of Default-domein koppeling boven aan de Azure portalpagina van de web-app te selecteren. Voeg vervolgens /checklist en /checklist/1 toe aan het einde van de URL in uw browser, bijvoorbeeld https://mysql-mi-app.azurewebsites.net/checklist.

Resources opschonen

Wanneer u klaar bent met deze zelfstudie, kunt u verdere kosten voorkomen door de resources die u hebt gemaakt te verwijderen. Verwijder de resourcegroep om alle resources te verwijderen die deze bevat. Zorg ervoor dat u de resources niet meer nodig hebt voordat u de opdracht uitvoert.

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

Alle resources verwijderen kan enige tijd duren. Met --no-wait het argument kan de opdracht onmiddellijk worden geretourneerd.