Samouczek: Nawiązywanie połączenia z bazą danych PostgreSQL z aplikacji Java na Tomcat App Service bez użycia tajnych danych przy wykorzystaniu tożsamości zarządzanej

Azure App Service zapewnia wysoce skalowalną, samonaporządkową usługę hostingu internetowego w Azure. Udostępnia również zarządzaną tożsamość dla aplikacji, która jest kluczowym rozwiązaniem do zabezpieczania dostępu do Azure Database for PostgreSQL i innych usług Azure. Tożsamości zarządzane w usłudze App Service sprawiają, że aplikacja jest bezpieczniejsza, eliminując tajne wartości z aplikacji, takie jak dane uwierzytelniające w zmiennych środowiskowych. Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • Utwórz bazę danych PostgreSQL.
  • Wdróż przykładową aplikację do usługi Azure App Service na serwerze Tomcat przy użyciu archiwum WAR.
  • Skonfiguruj aplikację internetową serwera Tomcat do używania uwierzytelniania Microsoft Entra z bazą danych PostgreSQL.
  • Nawiązywanie połączenia z bazą danych PostgreSQL przy użyciu tożsamości zarządzanej przy użyciu łącznika usługi.

Jeśli nie masz konta Azure, przed rozpoczęciem utwórz konto free.

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/Tomcat/

Tworzenie Azure Bazy Danych dla PostgreSQL

Wykonaj następujące kroki, aby utworzyć bazę danych usługi Azure Database for Postgres w ramach subskrypcji. Aplikacja Tomcat łączy się z tą bazą danych i przechowuje swoje dane podczas działania, utrwalając stan aplikacji bez względu na to, gdzie jest uruchamiana aplikacja.

  1. Zaloguj się do Azure CLI, a jeśli masz więcej niż jedną subskrypcję powiązaną z poświadczeniami logowania, opcjonalnie ustaw tę, z której chcesz korzystać.

    az login
    az account set --subscription <subscription-ID>
    
  2. Utwórz grupę zasobów Azure, zwracając uwagę na nazwę grupy zasobów.

    export RESOURCE_GROUP=<resource-group-name>
    export LOCATION=eastus
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Utwórz serwer Azure Database for PostgreSQL. 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 POSTGRESQL_ADMIN_USER=azureuser
    # PostgreSQL admin access rights won't be used because Azure AD authentication is leveraged to administer the database.
    export POSTGRESQL_ADMIN_PASSWORD=<admin-password>
    export POSTGRESQL_HOST=<postgresql-host-name>
    
    # Create a PostgreSQL server.
    az postgres flexible-server create \
        --resource-group $RESOURCE_GROUP \
        --name $POSTGRESQL_HOST \
        --location $LOCATION \
        --admin-user $POSTGRESQL_ADMIN_USER \
        --admin-password $POSTGRESQL_ADMIN_PASSWORD \
        --public-access 0.0.0.0 \
        --sku-name Standard_D2s_v3
    
  4. Utwórz bazę danych dla aplikacji.

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

Wdrażanie aplikacji w usłudze App Service

Wykonaj następujące kroki, aby utworzyć plik WAR i wdrożyć go w Azure App Service na serwerze Tomcat przy użyciu pakietu WAR.

  1. Przykładowa aplikacja zawiera plik pom.xml , który może wygenerować plik WAR. Aby skompilować aplikację, uruchom następujące polecenie.

    mvn clean package -f pom.xml
    
  2. Utwórz zasób Azure App Service w systemie Linux przy użyciu serwera Tomcat 9.0.

    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 B1 \
        --is-linux
    
    # Create an App Service resource.
    az webapp create \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --plan $APPSERVICE_PLAN \
        --runtime "TOMCAT:10.0-java11"
    
  3. Wdróż pakiet WAR w usłudze App Service.

    az webapp deploy \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
        --src-path target/app.war \
        --type war
    

Łączenie bazy danych Postgres z łącznością tożsamości

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

Zainstaluj rozszerzenie bez hasła łącznika usługi dla Azure CLI:

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

Następnie połącz swoją aplikację z bazą danych Postgres za pomocą przypisanej przez system zarządzanej tożsamości, korzystając z Service Connector.

Aby nawiązać to połączenie, wykonaj polecenie az webapp connection create.

az webapp connection create postgres-flexible \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --target-resource-group $RESOURCE_GROUP \
    --server $POSTGRESQL_HOST \
    --database $DATABASE_NAME \
    --system-identity \
    --client-type java

To polecenie tworzy połączenie między aplikacją internetową a serwerem PostgreSQL i zarządza uwierzytelnianiem za pomocą tożsamości zarządzanej przypisanej przez system.

Następnie zaktualizuj ustawienia aplikacji i dodaj wtyczkę w connection string

export AZURE_POSTGRESQL_CONNECTIONSTRING=$(\
    az webapp config appsettings list \
        --resource-group $RESOURCE_GROUP \
        --name $APPSERVICE_NAME \
    | jq -c -r '.[] \
    | select ( .name == "AZURE_POSTGRESQL_CONNECTIONSTRING" ) \
    | .value')

az webapp config appsettings set \
    --resource-group $RESOURCE_GROUP \
    --name $APPSERVICE_NAME \
    --settings 'CATALINA_OPTS=-DdbUrl="'"${AZURE_POSTGRESQL_CONNECTIONSTRING}"'&authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin"'

Testowanie przykładowej aplikacji internetowej

Przetestuj aplikację, uruchamiając następujące polecenie.

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 Azure w grupie zasobów. Jeśli nie oczekujesz, że te zasoby będą potrzebne w przyszłości, usuń grupę zasobów, uruchamiając następujące polecenie w Cloud Shell:

az group delete --name myResourceGroup

Uruchomienie tego polecenia może potrwać minutę.

Następne kroki

Dowiedz się więcej na temat uruchamiania aplikacji Java na platformie App Service on Linux w przewodniku dla deweloperów.

Dowiedz się, jak zabezpieczyć aplikację przy użyciu domeny niestandardowej i certyfikatu.