Samouczek: Połączenie do bazy danych MySQL z poziomu usługi App Service EAP Java JBoss EAP z połączeniem bez hasła

usługa aplikacja systemu Azure Service oferuje wysoce skalowalną, samonastosową usługę hostingu internetowego na platformie Azure. Zapewnia również tożsamość zarządzaną dla aplikacji, która jest rozwiązaniem kluczowym dla zabezpieczania dostępu do usługi Azure Database for MySQL i innych usług platformy Azure. Tożsamości zarządzane w usłudze App Service sprawiają, że aplikacja jest bezpieczniejsza, eliminując wpisy tajne z aplikacji, takie jak poświadczenia w zmiennych środowiskowych. Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • Utwórz bazę danych MySQL.
  • Wdróż przykładową aplikację JBoss EAP, aby aplikacja systemu Azure Service przy użyciu pakietu WAR.
  • Skonfiguruj aplikację internetową Spring Boot do korzystania z uwierzytelniania entra firmy Microsoft z bazą danych MySQL.
  • Połączenie do bazy danych MySQL z tożsamością zarządzaną przy użyciu Połączenie or usługi.

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto platformy Azure.

Wymagania wstępne

Sklonuj przykładową aplikację i przygotuj repozytorium

Uruchom następujące polecenia w terminalu, aby sklonować przykładowe repozytorium i skonfigurować przykładowe środowisko aplikacji.

git clone https://github.com/Azure-Samples/Passwordless-Connections-for-Java-Apps
cd Passwordless-Connections-for-Java-Apps/JakartaEE/jboss-eap/

Tworzenie usługi Azure Database for MySQL

Wykonaj następujące kroki, aby utworzyć usługę Azure Database for MySQL w ramach subskrypcji. Aplikacja Spring Boot łączy się z tą bazą danych i przechowuje swoje dane podczas działania, utrwalając stan aplikacji bez względu na to, gdzie uruchamiasz aplikację.

  1. Zaloguj się do interfejsu wiersza polecenia platformy Azure i opcjonalnie ustaw subskrypcję, jeśli masz więcej niż jedno połączenie z poświadczeniami logowania.

    az login
    az account set --subscription <subscription-ID>
    
  2. Utwórz grupę zasobów platformy Azure i zanotuj jej nazwę.

    export RESOURCE_GROUP=<resource-group-name>
    export LOCATION=eastus
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Utwórz serwer usługi Azure Database for MySQL. Serwer jest tworzony przy użyciu konta administratora, ale nie jest używany, ponieważ będziemy używać konta administratora Microsoft Entra do wykonywania zadań administracyjnych.

    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
    
  4. Utwórz bazę danych dla aplikacji.

    export DATABASE_NAME=checklist
    
    az mysql flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $MYSQL_HOST \
        --database-name $DATABASE_NAME
    

Tworzenie wystąpienia usługi App Service

Utwórz zasób usługi aplikacja systemu Azure w systemie Linux. Protokół JBoss EAP wymaga jednostki SKU Premium.

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"

Połączenie bazy danych MySQL z łącznością tożsamości

Następnie połącz bazę danych przy użyciu Połączenie or usługi.

Zainstaluj rozszerzenie service Połączenie or passwordless dla interfejsu wiersza polecenia platformy Azure:

az extension add --name serviceconnector-passwordless --upgrade

Następnie użyj następującego polecenia, aby utworzyć tożsamość zarządzaną przypisaną przez użytkownika na potrzeby uwierzytelniania firmy Microsoft Entra. Aby uzyskać więcej informacji, zobacz Konfigurowanie uwierzytelniania entra firmy Microsoft dla usługi Azure Database for MySQL — serwer elastyczny.

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)

Ważne

Po utworzeniu tożsamości przypisanej przez użytkownika poproś administratora globalnego Administracja istratora lub rolę uprzywilejowaną Administracja istrator, aby przyznać następujące uprawnienia dla tej tożsamości: User.Read.All, GroupMember.Read.Alli Application.Read.ALL. Aby uzyskać więcej informacji, zobacz sekcję Uprawnienia uwierzytelniania usługi Active Directory.

Następnie połącz aplikację z bazą danych MySQL przy użyciu przypisanej przez system tożsamości zarządzanej przy użyciu Połączenie or usługi. Aby nawiązać to połączenie, uruchom polecenie az webapp connection create .

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

To polecenie usługi Połączenie or wykonuje następujące zadania w tle:

  • Włącz tożsamość zarządzaną przypisaną przez system dla aplikacji $APPSERVICE_NAME hostowanej przez usługę aplikacja systemu Azure Service.

  • Ustaw administratora firmy Microsoft Entra na bieżącego zalogowanego użytkownika.

  • Dodaj użytkownika bazy danych dla tożsamości zarządzanej przypisanej przez system w kroku 1 i przyznaj wszystkim uprawnieniem bazy danych $DATABASE_NAME do tego użytkownika. Nazwę użytkownika można pobrać z parametry połączenia w danych wyjściowych z poprzedniego polecenia.

  • Dodaj parametry połączenia do usługi App Ustawienia w aplikacji o nazwie AZURE_MYSQL_CONNECTIONSTRING.

    Uwaga

    Jeśli zostanie wyświetlony komunikat The subscription is not registered to use Microsoft.ServiceLinkero błędzie , uruchom polecenie az provider register --namespace Microsoft.ServiceLinker , aby zarejestrować dostawcę zasobów service Połączenie or, a następnie ponownie uruchom polecenie połączenia.

Wdrażanie aplikacji

Wykonaj następujące kroki, aby przygotować dane w bazie danych i wdrożyć aplikację.

Tworzenie schematu bazy danych

  1. Otwórz zaporę, aby zezwolić na połączenie z bieżącego adresu IP.

    # 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}
    
  2. Połączenie do bazy danych i utwórz tabele.

    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
    
  3. Usuń tymczasową regułę zapory.

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

Wdrażanie aplikacji

  1. Zaktualizuj parametry połączenia w usłudze App Ustawienia.

    Pobierz parametry połączenia wygenerowaną przez usługę Service Połączenie or i dodaj wtyczkę uwierzytelniania bez hasła. Do tego parametry połączenia odwołuje się skrypt uruchamiania.

    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. Przykładowa aplikacja zawiera plik pom.xml , który może wygenerować plik WAR. Uruchom następujące polecenie, aby skompilować aplikację.

    mvn clean package -DskipTests
    
  3. Wdróż plik WAR i skrypt uruchamiania w usłudze 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
    

Testowanie przykładowej aplikacji internetowej

Uruchom następujące polecenie, aby przetestować aplikację.

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

Czyszczenie zasobów

W poprzednich krokach utworzono zasoby platformy Azure w grupie zasobów. Jeśli te zasoby nie będą raczej potrzebne w przyszłości, usuń grupę zasobów, uruchamiając następujące polecenie w usłudze Cloud Shell:

az group delete --name myResourceGroup

Wykonanie tego polecenia może potrwać około minutę.

Następne kroki

Dowiedz się więcej na temat uruchamiania aplikacji w języku Java w usłudze App Service dla systemu Linux w przewodniku dla deweloperów.

Java in App Service Linux dev guide (Przewodnik dla deweloperów dotyczący języka Java w usłudze App Service dla systemu Linux)