Share via


Tutorial: Herstellen einer Verbindung mit PostgreSQL-Datenbank über eine Java Quarkus-Container-App ohne Geheimnisse mithilfe einer verwalteten Identität

Azure Container Apps stellt eine verwaltete Identität für Ihre App zur Verfügung. Hierbei handelt es sich um eine vorgefertigte Lösung zum Schutz des Zugriffs auf Azure Database for PostgreSQL und andere Azure-Dienste. Verwaltete Identitäten in Container Apps machen Ihre App frei von Geheimnissen (wie etwa Anmeldeinformationen in den Umgebungsvariablen) und verbessern so die Sicherheit Ihrer App.

Dieses Tutorial führt Sie durch den Prozess der Kompilierung, Konfiguration, Bereitstellung und Skalierung von Java-Container-Apps in Azure. Am Ende dieses Tutorials besitzen Sie eine Quarkus-Anwendung, die Daten in einer PostgreSQL-Datenbank mit einer verwalteten Identität unter Container Apps speichert.

Sie lernen Folgendes:

  • Konfigurieren Sie eine Quarkus-App für die Authentifizierung mithilfe von Microsoft Entra ID mit einer PostgreSQL-Datenbank.
  • Erstellen einer Azure-Containerregistrierung und Pushen eines Java-App-Images in die Registrierung
  • Erstellen einer Container-App in Azure
  • Erstellen einer PostgreSQL-Datenbank in Azure
  • Herstellen einer Verbindung mit der PostgreSQL-Datenbank mit einer verwalteten Identität mithilfe von Service Connector

Sollten Sie über kein Azure-Abonnement verfügen, können Sie zunächst ein kostenloses Azure-Konto erstellen.

1. Voraussetzungen

2. Erstellen einer Containerregistrierung

Erstellen Sie mithilfe des Befehls az group create eine Ressourcengruppe. Eine Azure-Ressourcengruppe ist ein logischer Container, in dem Azure-Ressourcen bereitgestellt und verwaltet werden.

Im folgenden Beispiel wird eine Ressourcengruppe namens myResourceGroup in der Azure-Region „USA, Osten“ erstellt:

az group create --name myResourceGroup --location eastus

Erstellen Sie mit dem Befehl az acr create eine Azure Container Registry-Instanz. Der Registrierungsname muss innerhalb von Azure eindeutig sein und aus 5 bis 50 alphanumerischen Zeichen bestehen. Alle Buchstaben müssen in Kleinbuchstaben angegeben werden. Im folgenden Beispiel wird mycontainerregistry007 verwendet. Ersetzen Sie diesen Namen durch einen eindeutigen Wert.

az acr create \
    --resource-group myResourceGroup \
    --name mycontainerregistry007 \
    --sku Basic

3. Klonen der Beispiel-App und Vorbereiten des Repository Containerimages

Dieses Tutorial verwendet eine beispielhafte Fruits-Listen-App mit einer Webbenutzeroberfläche, die eine Quarkus-REST-API aufruft, die von Azure-Datenbank für PostgreSQL unterstützt wird. Den Code für die App finden Sie auf GitHub. Weitere Informationen zum Schreiben von Java-Apps mit Quarkus und PostgreSQL finden Sie im Quarkus Hibernate ORM mit Panache Guide und im Quarkus Datasource Guide.

Führen Sie die folgenden Befehle in Ihrem Terminal aus, um das Beispielrepository zu klonen und die Beispiel-App-Umgebung einzurichten.

git clone https://github.com/quarkusio/quarkus-quickstarts
cd quarkus-quickstarts/hibernate-orm-panache-quickstart

Ändern Ihres Projekts

  1. Fügen Sie der BOM-Datei Ihres Projekts die erforderlichen Abhängigkeiten hinzu.

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity-providers-jdbc-postgresql</artifactId>
        <version>1.0.0-beta.1</version>
    </dependency>
    
  2. Konfigurieren Sie die Quarkus-App-Eigenschaften.

    Die Quarkus-Konfiguration ist in der Datei src/main/resources/application.properties enthalten. Öffnen Sie diese Datei in Ihrem Editor und beobachten Sie mehrere Standardeigenschaften. Die Eigenschaften mit dem Präfix %prod werden nur verwendet, wenn die Anwendung erstellt und bereitgestellt wird, beispielsweise bei der Bereitstellung in Azure App Service. Wenn die Anwendung lokal ausgeführt wird, werden %prod-Eigenschaften ignoriert. In ähnlicher Weise werden %dev-Eigenschaften im Live Coding / Dev-Modus von Quarkus verwendet, und %test-Eigenschaften werden während des kontinuierlichen Testens verwendet.

    Löschen Sie den vorhandenen Inhalt in application.properties, und ersetzen Sie ihn durch Folgendes, um Ihre Datenbank für den Entwicklungs-, Test- und Produktionsmodus zu konfigurieren:

    quarkus.package.type=uber-jar
    
    quarkus.hibernate-orm.database.generation=drop-and-create
    quarkus.datasource.db-kind=postgresql
    quarkus.datasource.jdbc.max-size=8
    quarkus.datasource.jdbc.min-size=2
    quarkus.hibernate-orm.log.sql=true
    quarkus.hibernate-orm.sql-load-script=import.sql
    quarkus.datasource.jdbc.acquisition-timeout = 10
    
    %dev.quarkus.datasource.username=${AZURE_CLIENT_NAME}
    %dev.quarkus.datasource.jdbc.url=jdbc:postgresql://${DBHOST}.postgres.database.azure.com:5432/${DBNAME}?\
    authenticationPluginClassName=com.azure.identity.providers.postgresql.AzureIdentityPostgresqlAuthenticationPlugin\
    &sslmode=require\
    &azure.clientId=${AZURE_CLIENT_ID}\
    &azure.clientSecret=${AZURE_CLIENT_SECRET}\
    &azure.tenantId=${AZURE_TENANT_ID}
    
    %prod.quarkus.datasource.username=${AZURE_MI_NAME}
    %prod.quarkus.datasource.jdbc.url=jdbc:postgresql://${DBHOST}.postgres.database.azure.com:5432/${DBNAME}?\
    authenticationPluginClassName=com.azure.identity.providers.postgresql.AzureIdentityPostgresqlAuthenticationPlugin\
    &sslmode=require
    
    %dev.quarkus.class-loading.parent-first-artifacts=com.azure:azure-core::jar,\
    com.azure:azure-core-http-netty::jar,\
    io.projectreactor.netty:reactor-netty-core::jar,\
    io.projectreactor.netty:reactor-netty-http::jar,\
    io.netty:netty-resolver-dns::jar,\
    io.netty:netty-codec::jar,\
    io.netty:netty-codec-http::jar,\
    io.netty:netty-codec-http2::jar,\
    io.netty:netty-handler::jar,\
    io.netty:netty-resolver::jar,\
    io.netty:netty-common::jar,\
    io.netty:netty-transport::jar,\
    io.netty:netty-buffer::jar,\
    com.azure:azure-identity::jar,\
    com.azure:azure-identity-providers-core::jar,\
    com.azure:azure-identity-providers-jdbc-postgresql::jar,\
    com.fasterxml.jackson.core:jackson-core::jar,\
    com.fasterxml.jackson.core:jackson-annotations::jar,\
    com.fasterxml.jackson.core:jackson-databind::jar,\
    com.fasterxml.jackson.dataformat:jackson-dataformat-xml::jar,\
    com.fasterxml.jackson.datatype:jackson-datatype-jsr310::jar,\
    org.reactivestreams:reactive-streams::jar,\
    io.projectreactor:reactor-core::jar,\
    com.microsoft.azure:msal4j::jar,\
    com.microsoft.azure:msal4j-persistence-extension::jar,\
    org.codehaus.woodstox:stax2-api::jar,\
    com.fasterxml.woodstox:woodstox-core::jar,\
    com.nimbusds:oauth2-oidc-sdk::jar,\
    com.nimbusds:content-type::jar,\
    com.nimbusds:nimbus-jose-jwt::jar,\
    net.minidev:json-smart::jar,\
    net.minidev:accessors-smart::jar,\
    io.netty:netty-transport-native-unix-common::jar
    

Erstellen eines Docker-Images und Pushen in die Containerregistrierung

  1. Erstellen des Containerimages

    Führen Sie den folgenden Befehl aus, um das Quarkus-App-Image zu erstellen. Sie müssen es mit dem vollqualifizierten Namen des Anmeldeservers Ihrer Registrierung markieren. Der Name des Anmeldeservers wird im Format <Registrierungsname>.azurecr.io (nur Kleinbuchstaben) angegeben (Beispiel: mycontainerregistry007.azurecr.io). Ersetzen Sie den Namen durch Ihren eigenen Registrierungsnamen.

    mvnw quarkus:add-extension -Dextensions="container-image-jib"
    mvnw clean package -Pnative -Dquarkus.native.container-build=true -Dquarkus.container-image.build=true -Dquarkus.container-image.registry=mycontainerregistry007 -Dquarkus.container-image.name=quarkus-postgres-passwordless-app -Dquarkus.container-image.tag=v1
    
  2. Melden Sie sich bei der Registrierung an.

    Bevor Sie Pushvorgänge für Containerimages ausführen können, müssen Sie sich bei der Registrierung anmelden. Verwenden Sie hierzu den Befehl [az acr login][az-acr-login]. Geben Sie beim Anmelden mit der Azure CLI nur den Namen der Registrierungsressource an. Verwenden Sie nicht den vollqualifizierten Namen des Anmeldeservers.

    az acr login --name <registry-name>
    

    Der Befehl gibt nach Abschluss die Meldung Login Succeeded zurück.

  3. Puschen Sie das Image in die Registrierung.

    Verwenden Sie [docker push][docker-push], um das Image in die Registrierungsinstanz zu pushen. Ersetzen Sie mycontainerregistry007 durch den Anmeldeservernamen Ihrer Registrierungsinstanz. In diesem Beispiel wird das Repository quarkus-postgres-passwordless-app mit dem Image quarkus-postgres-passwordless-app:v1 erstellt.

    docker push mycontainerregistry007/quarkus-postgres-passwordless-app:v1
    

4. Erstellen einer Container-App in Azure

  1. Erstellen Sie eine Container Apps-Instanz, indem Sie den folgenden Befehl ausführen. Ersetzen Sie den Wert der Umgebungsvariablen unbedingt durch den tatsächlichen Namen und den tatsächlichen Speicherort, die Sie verwenden möchten.

    RESOURCE_GROUP="myResourceGroup"
    LOCATION="eastus"
    CONTAINERAPPS_ENVIRONMENT="my-environment"
    
    az containerapp env create \
        --resource-group $RESOURCE_GROUP \
        --name $CONTAINERAPPS_ENVIRONMENT \
        --location $LOCATION
    
  2. Erstellen Sie eine Container-App mit Ihrem App-Image, indem Sie den folgenden Befehl ausführen. Ersetzen Sie die Platzhalter durch Ihre Werte. Informationen zum Abrufen der Details zum Administratorkonto der Containerregistrierung finden Sie unter Authentifizieren mit einer Azure-Containerregistrierung.

    CONTAINER_IMAGE_NAME=quarkus-postgres-passwordless-app:v1
    REGISTRY_SERVER=mycontainerregistry007
    REGISTRY_USERNAME=<REGISTRY_USERNAME>
    REGISTRY_PASSWORD=<REGISTRY_PASSWORD>
    
    az containerapp create \
        --resource-group $RESOURCE_GROUP \
        --name my-container-app \
        --image $CONTAINER_IMAGE_NAME \
        --environment $CONTAINERAPPS_ENVIRONMENT \
        --registry-server $REGISTRY_SERVER \
        --registry-username $REGISTRY_USERNAME \
        --registry-password $REGISTRY_PASSWORD
    

5. Erstellen und Verbinden einer PostgreSQL-Datenbank mit Identitätskonnektivität

Erstellen Sie als Nächstes eine Instanz von PostgreSQL-Datenbank, und konfigurieren Sie Ihre Container-App so, dass eine Verbindung mit PostgreSQL-Datenbank mit einer systemseitig zugewiesenen verwalteten Identität hergestellt wird. Die Quarkus-App stellt eine Verbindung mit dieser Datenbank her und speichert ihre Daten, wenn sie ausgeführt wird. Dabei wird der Anwendungsstatus beibehalten, unabhängig davon, wo Sie die Anwendung ausführen.

  1. Erstellen Sie den Datenbankdienst.

    DB_SERVER_NAME='msdocs-quarkus-postgres-webapp-db'
    ADMIN_USERNAME='demoadmin'
    ADMIN_PASSWORD='<admin-password>'
    
    az postgres flexible-server create \
        --resource-group $RESOURCE_GROUP \
        --name $DB_SERVER_NAME \
        --location $LOCATION \
        --admin-user $DB_USERNAME \
        --admin-password $DB_PASSWORD \
        --sku-name GP_Gen5_2
    

Die folgenden Parameter werden im obigen Azure CLI-Befehl verwendet:

  • resource-group: Verwenden Sie den gleichen Ressourcengruppennamen, unter dem Sie auch die Web-App erstellt haben, etwa msdocs-quarkus-postgres-webapp-rg.

  • name: Der Name des PostgreSQL-Datenbankservers. Dieser Name muss innerhalb von Azure eindeutig sein. (Der Serverendpunkt isthttps://<name>.postgres.database.azure.com.) Gültige Zeichen sind A-Z, 0-9 und -. Ein bewährtes Muster ist eine Kombination aus Ihrem Firmennamen und einer Server-ID. (msdocs-quarkus-postgres-webapp-db)

  • location: Verwenden Sie den gleichen Standort wie für die Web-App.

  • admin-user: Benutzername für das Administratorkonto. Er darf nicht azure_superuser, admin, administrator, root, guest oder public lauten. demoadmin ist beispielsweise in Ordnung.

  • admin-password: Das Kennwort des Administratorbenutzers. Es muss 8 bis 128 Zeichen aus drei der folgenden Kategorien enthalten: Englische Großbuchstaben, englische Kleinbuchstaben, Zahlen und nicht alphanumerische Zeichen.

    Wichtig

    Verwenden Sie beim Erstellen von Benutzernamen oder Kennwörtern nicht das Zeichen $. Später in diesem Tutorial erstellen Sie Umgebungsvariablen mit diesen Werten, wobei das Zeichen $ innerhalb des Linux-Containers, der zum Ausführen von Java-Apps verwendet wird, eine besondere Bedeutung hat.

  • public-access: None: Damit wird der Server in den Modus „Öffentlicher Zugriff“ ohne Firewallregeln versetzt. Regeln werden in einem späteren Schritt erstellt.

  • sku-name: Der Name des Tarifs und der Computekonfiguration, etwa GP_Gen5_2. Weitere Informationen finden Sie unter Azure Database for PostgreSQL – Preise.

  1. Erstellen Sie mit diesem Befehl eine Datenbank namens fruits innerhalb des PostgreSQL-Diensts:

    az postgres flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $DB_SERVER_NAME \
        --database-name fruits
    
  2. Installieren Sie die kennwortlose Dienstconnector-Erweiterung für die Azure CLI:

    az extension add --name serviceconnector-passwordless --upgrade
    
  3. Verbinden Sie mithilfe des Verbindungsbefehls die Datenbank mit der Container-App mit einer systemseitig zugewiesenen verwalteten Identität.

    az containerapp connection create postgres-flexible \
        --resource-group $RESOURCE_GROUP \
        --name my-container-app \
        --target-resource-group $RESOURCE_GROUP \
        --server $DB_SERVER_NAME \
        --database fruits \
        --managed-identity
    

6. Überprüfen Ihrer Änderungen

Sie können mit dem folgenden Befehl die Anwendungs-URL (FQDN) ermitteln:

az containerapp list --resource-group $RESOURCE_GROUP

Wenn die neue Webseite Ihre Liste mit Früchten anzeigt, stellt Ihre App unter Verwendung der verwalteten Identität eine Verbindung mit der Datenbank her. Die Liste der Früchte sollte sich nun wie gewohnt bearbeiten lassen.

Bereinigen von Ressourcen

In den vorherigen Schritten haben Sie Azure-Ressourcen in einer Ressourcengruppe erstellt. Wenn Sie diese Ressourcen in Zukunft nicht mehr benötigen, löschen Sie die Ressourcengruppe, indem Sie den folgenden Befehl in Cloud Shell ausführen:

az group delete --name myResourceGroup

Die Ausführung dieses Befehls kann eine Minute in Anspruch nehmen.

Nächste Schritte

Im Entwicklerhandbuch finden Sie weitere Informationen zum Ausführen von Java-Apps in Azure.