Lernprogramm: Herstellen einer Verbindung mit einer MySQL-Datenbank von Java JBoss EAP auf Azure App Service

In diesem Lernprogramm erfahren Sie, wie Sie eine Java JBoss EAP-App auf Azure App Service mit einer Azure Database for MySQL Datenbank mithilfe einer verwalteten Identität verbinden. Der App-Dienst kann managed Identity verwenden, um sicheren Zugriff auf Azure Database for MySQL und andere Azure Dienste zu ermöglichen. Eine verwaltete Identität beseitigt die Notwendigkeit, geheime Schlüssel in Ihrer App zu verwenden, z. B. Anmeldeinformationen in den Umgebungsvariablen.

In diesem Lernprogramm werden Azure CLI Befehle verwendet, um die folgenden Aufgaben auszuführen:

  • Erstellt einen Azure Database for MySQL-Server und eine MySQL-Datenbank.
  • Stellt eine Beispiel-JBoss-EAP-App mit einem WAR-Paket in App Service bereit.
  • Konfiguriert die Spring Boot-Webanwendung so, dass Microsoft Entra Authentifizierung mit der MySQL-Datenbank verwendet wird.
  • Verbindet die Web-App mit der MySQL-Datenbank mithilfe von Service Connector mit verwalteter Identitätsauthentifizierung.

Voraussetzungen

  • Ein Azure-Abonnement mit Microsoft Entra-Rollenzuweisungsberechtigungen und Azure-Ressourcenschreibberechtigungen in einer Azure-Region, die den Service Connector unterstützt und über ausreichende App Service Unterstützung und Kontingent für das Lernprogramm verfügt.

  • Die Microsoft.ServiceLinker und Microsoft.DBforMySQL Ressourcenanbieter, die in Ihrem Azure-Abonnement registriert sind. Sie können az provider register -n Microsoft.[service] ausführen, um die Anbieter zu registrieren.

  • Git verwenden, um auf das Beispiel-Repository zuzugreifen und es zu klonen.

  • Zugriff auf Azure Cloud Shell, um die Schritte des Tutorials auszuführen, oder, wenn Sie es vorziehen, lokal auszuführen, die folgenden Voraussetzungen und Schritte:

    • Java JDK installiert

    • Maven installiert

    • jq installiert

    • MySQL-Client installiert

    • Azure CLI 2.46.0 oder höher installiert. Führen Sie zum Überprüfen der Version az --version aus. Führen Sie zum Upgrade die Ausführung aus az upgrade.

      Wenn Sie es lokal ausführen:

      1. Melden Sie sich mit az login bei Azure an, und folgen Sie den Eingabeaufforderungen.
      2. Wenn Sie mehrere Azure Abonnement mit Ihren Anmeldeinformationen verbunden haben, führen Sie az account set --subscription <subscription-ID> aus, um das richtige Abonnement auszuwählen.

Richten Sie Ihre Umgebung ein

  1. Installieren Sie die folgenden Azure CLI-Erweiterungen:

    az extension add --name serviceconnector-passwordless --upgrade
    az extension add --name rdbms-connect
    
  2. Führen Sie die folgenden Befehle aus, um das Beispiel-Repository zu klonen und Verzeichnisse in den Beispiel-App-Projektordner zu ändern. Führen Sie alle verbleibenden Befehle aus diesem Ordner aus.

    git clone https://github.com/Azure-Samples/Passwordless-Connections-for-Java-Apps
    cd Passwordless-Connections-for-Java-Apps/JakartaEE/jboss-eap/
    
  3. Definieren Sie die folgenden Umgebungsvariablen für das Lernprogramm, und ersetzen Sie den <region> Platzhalter durch einen gültigen Wert. LOCATION muss eine Azure-Region sein, in der Ihr Abonnement über ausreichendes Kontingent verfügt, um die Azure-Ressourcen zu erstellen, und keine Einschränkungen für Dienste bestehen.

    LOCATION="<region>"
    RESOURCE_GROUP="mysql-mi-webapp"
    
  4. Erstellen Sie eine Azure-Ressourcengruppe, um alle Projektressourcen zu enthalten. Der Ressourcengruppenname wird zwischengespeichert und automatisch auf nachfolgende Befehle angewandt.

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

Erstellen einer Azure-Datenbank für MySQL

Erstellen Sie einen Azure Database for MySQL-Server und eine Datenbank in Ihrem Abonnement. Die Spring Boot-App stellt eine Verbindung mit dieser Datenbank bereit und speichert ihre Daten bei der Ausführung, wobei der Anwendungszustand unabhängig davon beibehalten wird, wo Sie die Anwendung ausführen.

  1. Führen Sie den folgenden Befehl aus, um einen Azure Database for MySQL Server zu erstellen. Der Name MYSQL_HOST muss in ganz Azure eindeutig sein.

    Hinweis

    Obwohl der Befehl ein Administratorkonto definiert, wird das Konto nicht verwendet, da das Microsoft Entra Administratorkonto alle administrativen Aufgaben ausführt.

    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. Erstellen Sie eine Datenbank, die für die zu verwendende Anwendung benannt checklist ist.

    export DATABASE_NAME="checklist"
    az mysql flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $MYSQL_HOST \
        --database-name $DATABASE_NAME
    
  3. Öffnen Sie eine Firewall, um die Verbindung mit der Datenbank von Ihrer aktuellen IP-Adresse aus zuzulassen.

    # 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. Stellen Sie eine Verbindung mit der Datenbank her, und erstellen Sie die Tabellen, wie in der Beispielprojektdatei /azure/init-db.sql angegeben.

    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. Entfernen Sie die temporäre Firewallregel:

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

Erstellen einer App Service-Ressource

Erstellen Sie eine App Service JBoss EAP-Ressource unter Linux. JBoss EAP erfordert eine Premium-Stufe 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"

Erstellen und Konfigurieren einer vom Benutzer zugewiesenen verwalteten Identität

Verwenden Sie den folgenden Befehl, um eine Azure vom Benutzer zugewiesenen verwalteten Identität zu erstellen, die für Microsoft Entra Authentifizierung verwendet werden soll. Weitere Informationen finden Sie unter Einrichten der Microsoft Entra-Authentifizierung für Azure Database for MySQL – Flexibler 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)

Gewähren Sie der neuen vom Benutzer zugewiesenen Identität User.Read.All, GroupMember.Read.Allund Application.Read.All Berechtigungen. Geben Sie alternativ der identität die Directory Readers Microsoft Entra integrierte Rolle.

Azure CLI wird für die Zuweisung von Microsoft Entra-Berechtigungen oder -Rollen nicht unterstützt. Sie können die Microsoft Entra Admin Center, Microsoft Graph PowerShell oder Microsoft Graph-API verwenden, um die Zuweisungen zu erstellen. Weitere Informationen finden Sie unter Zuweisen von Microsoft Entra-Rollen.

Hinweis

Um diese Zuweisungen hinzuzufügen, müssen Sie mindestens über die Privileged Role Administrator Rolle oder Berechtigungen in Ihrem Microsoft Entra Mandanten verfügen. Wenn Sie nicht über diese Rolle verfügen, bitten Sie Ihren globalen Administrator oder privilegierten Rollenadministrator , die Berechtigungen zu erteilen.

Verwenden der verwalteten Identität zum Verbinden der Dienste

Verwenden Sie Service Connector , um Ihre App Service JBoss EAP-Web-App mit der MySQL-Datenbank mit einer verwalteten Identität zu verbinden. Service Connector führt die folgenden Aufgaben im Hintergrund aus:

  • Legt den aktuellen angemeldeten Benutzer als Microsoft Entra Datenbankadministrator fest.
  • Aktiviert vom System zugewiesene verwaltete Identität für die App.
  • Fügt einen Datenbankbenutzer für die vom System zugewiesene verwaltete Identität hinzu und gewährt diesem Benutzer alle Datenbankberechtigungen.
  • Fügt eine Verbindungszeichenfolge namens AZURE_MYSQL_CONNECTIONSTRING zu den App Settings der App hinzu.

Verwenden Sie den folgenden Befehl " az webapp connection create ", um Ihre App mit der verwalteten Identität mit der MySQL-Datenbank zu verbinden.

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

Erstellen und Bereitstellen der App

  1. Führen Sie den folgenden Code aus, um das kennwortlose Authentifizierungs-Plugin zur durch Service Connector generierten Verbindungszeichenfolge hinzuzufügen. Das App-Startskript verweist auf diese Verbindungszeichenfolge.

    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. Erstellen Sie die App mithilfe der pom.xml-Datei in der Beispiel-App, um die WAR-Datei zu generieren.

    mvn clean package -DskipTests
    
  3. Stellen Sie die WAR-Datei und das Startskript für App Service bereit.

    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
    

Testen der App

  1. Führen Sie den folgenden Code aus, um eine Liste mit einigen Listenelementen zu erstellen.

    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. Wenn Sie lokal arbeiten, führen Sie den folgenden Code aus, um die App anzuzeigen:

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

    Cloud Shell kann keinen lokalen Browser öffnen. Wenn Sie also in Cloud Shell arbeiten, besteht die einfachste Möglichkeit zum Anzeigen der Web-App darin, den Link Browse oder Default domain am oberen Rand der Azure Portalseite der App auszuwählen. Fügen Sie /checklist an das Ende der URL in Ihrem Browser an, z. B. https://mysql-mi-app.azurewebsites.net/checklist.

Bereinigen von Ressourcen

Wenn Sie mit diesem Lernprogramm fertig sind, können Sie weitere Gebühren vermeiden, indem Sie die von Ihnen erstellten Ressourcen löschen. Löschen Sie die Ressourcengruppe, um alle darin enthaltenen Ressourcen zu löschen. Achten Sie darauf, dass Sie die Ressourcen nicht mehr benötigen, bevor Sie den Befehl ausführen.

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

Das Löschen aller Ressourcen kann einige Zeit dauern. Mit --no-wait dem Argument kann der Befehl sofort zurückgegeben werden.