Självstudie: Ansluta till en MySQL-databas från Java JBoss EAP på Azure App Service

I den här självstudien lär du dig hur du ansluter en Java JBoss EAP-app på Azure App Service till en Azure Database for MySQL databas med hjälp av en hanterad identitet. App Service kan använda hanterad identitet för att ge säker åtkomst till Azure Database for MySQL och andra Azure tjänster. En hanterad identitet eliminerar behovet av att använda hemligheter i din app, till exempel autentiseringsuppgifter i miljövariablerna.

I den här handledningen används Azure CLI-kommando för att utföra följande uppgifter:

  • Skapar en "Azure Database for MySQL"-server och databas.
  • Distribuerar en JBoss EAP-exempelapp till App Service med hjälp av ett WAR-paket.
  • Konfigurerar Spring Boot-webbappen så att den använder Microsoft Entra autentisering med MySQL-databasen.
  • Ansluter webbappen till MySQL-databasen med hjälp av Service Connector med hanterad identitetsautentisering.

Förutsättningar

  • En Azure-prenumeration med Microsoft Entra behörigheter för rolltilldelning och Azure resursskrivningsbehörigheter i en Azure region som supports Service Connector och har tillräckligt med stöd och kvoter för App Service för självstudien.

  • Resursleverantörerna Microsoft.ServiceLinker och Microsoft.DBforMySQL är registrerade i din Azure-prenumeration. Du kan köra az provider register -n Microsoft.[service] för att registrera leverantörerna.

  • Git för att komma åt och klona exempelrepo.

  • Åtkomst till Azure Cloud Shell för att köra självstudiestegen, eller om du föredrar att köra lokalt, följ dessa förutsättningar och steg:

    • Java JDK installerad

    • Maven är installerad

    • jq installerad

    • MySQL-klient installerad

    • Azure CLI 2.46.0 eller senare installerat. Kontrollera din version genom att köra az --version. Om du vill uppgradera kör du az upgrade.

      Om du kör lokalt:

      1. Logga in på Azure med hjälp av az login och följ anvisningarna.
      2. Om du har fler än en Azure prenumeration ansluten till dina inloggningsuppgifter kör du az account set --subscription <subscription-ID> för att välja rätt prenumeration.

Konfigurera din miljö

  1. Installera följande Azure CLI-tillägg:

    az extension add --name serviceconnector-passwordless --upgrade
    az extension add --name rdbms-connect
    
  2. Kör följande kommandon för att klona exempelrepo och ändra kataloger till exempelappens projektmapp. Kör alla återstående kommandon från den här mappen.

    git clone https://github.com/Azure-Samples/Passwordless-Connections-for-Java-Apps
    cd Passwordless-Connections-for-Java-Apps/JakartaEE/jboss-eap/
    
  3. Definiera följande miljövariabler för handledningen och ersätt platshållaren <region> med ett giltigt värde. LOCATION måste vara en Azure region där din prenumeration har tillräcklig kvot för att skapa Azure resurser och inga begränsningar för någon av tjänsterna.

    LOCATION="<region>"
    RESOURCE_GROUP="mysql-mi-webapp"
    
  4. Skapa en Azure resursgrupp för att innehålla alla projektresurser. Resursgruppens namn cachelagras och tillämpas automatiskt på efterföljande kommandon.

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

Skapa en Azure-databas för MySQL

Skapa en Azure-databas för MySQL-server och -databas i din prenumeration. Spring Boot-appen ansluter till den här databasen och lagrar sina data när den körs, vilket bevarar programtillståndet oavsett var du kör programmet.

  1. Kör följande kommando för att skapa en Azure Database for MySQL-server. Namnet MYSQL_HOST måste vara unikt för alla Azure.

    Kommentar

    Även om kommandot definierar ett administratörskonto används inte kontot eftersom det Microsoft Entra administratörskontot utför alla administrativa uppgifter.

    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. Skapa en databas med namnet checklist som programmet ska använda.

    export DATABASE_NAME="checklist"
    az mysql flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $MYSQL_HOST \
        --database-name $DATABASE_NAME
    
  3. Öppna en brandvägg för att tillåta anslutning till databasen från din aktuella IP-adress.

    # 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. Anslut till databasen och skapa tabellerna enligt beskrivningen i exempelprojektfilen /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. Ta bort den tillfälliga brandväggsregeln.

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

Skapa en App Service-resurs

Skapa en App Service JBoss EAP-resurs i Linux. JBoss EAP kräver en Premium-nivå 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"

Skapa och konfigurera en användartilldelad hanterad identitet

Använd följande kommando för att skapa en Azure användartilldelad hanterad identitet som ska användas för Microsoft Entra autentisering. Mer information finns i Konfigurera Microsoft Entra-autentisering för Azure Database for MySQL – flexibel server.

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)

Bevilja den nya användartilldelade identiteten User.Read.All, GroupMember.Read.Alloch Application.Read.All behörigheter. Alternativt kan du ge identiteten Katalogläsare Microsoft Entra inbyggd roll.

Azure CLI stöds inte för att tilldela Microsoft Entra behörigheter eller roller. Du kan använda api:et Microsoft Entra administrationscenter, Microsoft Graph PowerShell eller Microsoft Graph för att skapa tilldelningarna. Mer information finns i Tilldela Microsoft Entra-roller.

Kommentar

Om du vill lägga till dessa tilldelningar måste du ha minst rollen Privileged Role Administrator eller behörigheterna i din Microsoft Entra-miljö. Om du inte har den här rollen ber du din globala administratör eller privilegierade rolladministratör att bevilja behörigheterna.

Använda hanterad identitet för att ansluta tjänsterna

Använd Service Connector för att ansluta din App Service JBoss EAP-webbapp till MySQL-databasen med en hanterad identitet. Service Connector utför följande uppgifter i bakgrunden:

  • Anger den aktuella inloggade användaren som Microsoft Entra databasadministratör.
  • Aktiverar systemtilldelad hanterad identitet för appen.
  • Lägger till en databasanvändare för den systemtilldelade hanterade identiteten och ger användaren alla databasbehörigheter.
  • Lägger till en reťazec pripojenia med namnet AZURE_MYSQL_CONNECTIONSTRING i appens Appinställningar.

Använd följande az webapp connection create-kommando för att ansluta din app till MySQL-databasen med hjälp av den hanterade identiteten.

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

Skapa och distribuera appen

  1. Kör följande kod för att lägga till plugin-programmet för lösenordsfri autentisering i anslutningssträngen som genereras av Service Connector. Appens startskript refererar till den här anslutningssträngen.

    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. Skapa appen med hjälp av pom.xml-filen i exempelappen för att generera WAR-filen.

    mvn clean package -DskipTests
    
  3. Distribuera WAR-filen och startskriptet till 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
    

Testa programmet

  1. Kör följande kod för att skapa en lista med vissa listobjekt.

    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. Om du arbetar lokalt kör du följande kod för att visa appen:

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

    Cloud Shell kan inte öppna en lokal webbläsare, så om du arbetar i Cloud Shell är det enklaste sättet att visa webbappen att välja domänen Browse eller Default längst upp på appens Azure portalsida. Lägg sedan till /checklist eller /checklist/1 i slutet av URL:en i webbläsaren, till exempel https://mysql-mi-app.azurewebsites.net/checklist.

Rensa resurser

När du är klar med den här självstudien kan du undvika extra kostnader genom att ta bort resurserna du skapade. Ta bort resursgruppen för att ta bort alla resurser som den innehåller. Se till att du inte längre behöver resurserna innan du kör kommandot.

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

Det kan ta lite tid att ta bort alla resurser. Argumentet --no-wait gör att kommandot kan returneras omedelbart.