Delen via


Zelfstudie: Verbinding maken met PostgreSQL Database vanuit een Java Quarkus-container-app zonder geheimen met behulp van een beheerde identiteit

Azure Container Apps biedt een beheerde identiteit voor uw app. Dit is een kant-en-klare oplossing voor het beveiligen van toegang tot Azure Database for PostgreSQL en andere Azure-services. Beheerde identiteiten in Container Apps maken uw app veiliger door geheimen uit uw app te elimineren, zoals referenties in de omgevingsvariabelen.

In deze zelfstudie wordt u begeleid bij het bouwen, configureren, implementeren en schalen van Java-container-apps in Azure. Aan het einde van deze zelfstudie hebt u een Quarkus-toepassing die gegevens opslaat in een PostgreSQL-database met een beheerde identiteit die wordt uitgevoerd in Container Apps.

U leert het volgende:

  • Configureer een Quarkus-app voor verificatie met behulp van Microsoft Entra-id met een PostgreSQL-database.
  • Maak een Azure-containerregister en push er een Java-app-installatiekopieën naartoe.
  • Een container-app maken in Azure.
  • Maak een PostgreSQL-database in Azure.
  • Maak verbinding met een PostgreSQL-database met beheerde identiteit met behulp van Service Connector.

Als u geen Azure-abonnement hebt, kunt u een gratis Azure-account maken voordat u begint.

1. Vereisten

2. Een containerregister maken

Een resourcegroep maken met de opdracht az group create. Een Azure-resourcegroep is een logische container waarin Azure-resources worden geïmplementeerd en beheerd.

In het volgende voorbeeld wordt een resourcegroep gemaakt met de naam myResourceGroup in de Azure-regio VS - oost.

RESOURCE_GROUP="myResourceGroup"
LOCATION="eastus"

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

Maak een Azure Container Registry-exemplaar met behulp van de opdracht az acr create en haal de bijbehorende aanmeldingsserver op met behulp van de opdracht az acr show . De registernaam moet uniek zijn binnen Azure en mag 5 tot 50 alfanumerieke tekens bevatten. Alle letters moeten in kleine letters worden opgegeven. In het volgende voorbeeld mycontainerregistry007 wordt gebruikt. Werk deze waarde bij naar een unieke waarde.

REGISTRY_NAME=mycontainerregistry007
az acr create \
    --resource-group $RESOURCE_GROUP \
    --name $REGISTRY_NAME \
    --sku Basic

REGISTRY_SERVER=$(az acr show \
    --name $REGISTRY_NAME \
    --query 'loginServer' \
    --output tsv | tr -d '\r')

3. Kloon de voorbeeld-app en bereid de containerinstallatiekopieën voor

In deze zelfstudie wordt gebruikgemaakt van een voorbeeldapp voor fruitslijsten met een webgebruikersinterface die een Quarkus REST API aanroept die wordt ondersteund door Azure Database for PostgreSQL. De code voor de app is beschikbaar op GitHub. Zie de Quarkus Hibernate ORM met Panache Guide en de Quarkus Datasource Guide voor meer informatie over het schrijven van Java-apps met Quarkus en PostgreSQL.

Voer de volgende opdrachten in de terminal uit om de voorbeeldopslagplaats te klonen en de omgeving van de voorbeeld-app in te stellen.

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

Uw project wijzigen

  1. Voeg de vereiste afhankelijkheden toe aan het BOM-bestand van uw project.

    <dependency>
       <groupId>com.azure</groupId>
       <artifactId>azure-identity-extensions</artifactId>
       <version>1.1.20</version>
    </dependency>
    
  2. Configureer de eigenschappen van de Quarkus-app.

    De Quarkus-configuratie bevindt zich in het bestand src/main/resources/application.properties . Open dit bestand in uw editor en bekijk verschillende standaardeigenschappen. De eigenschappen waaraan %prod wordt voorafgegaan, worden alleen gebruikt wanneer de toepassing wordt gebouwd en geïmplementeerd, bijvoorbeeld wanneer deze wordt geïmplementeerd in Azure-app Service. Wanneer de toepassing lokaal wordt uitgevoerd, %prod worden eigenschappen genegeerd. Op dezelfde manier %dev worden eigenschappen gebruikt in de Live Coding/Dev-modus van Quarkus en %test worden eigenschappen gebruikt tijdens continue tests.

    Verwijder de bestaande inhoud in application.properties en vervang deze door het volgende om de database te configureren voor ontwikkel-, test- en productiemodi:

    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=${CURRENT_USERNAME}
    %dev.quarkus.datasource.jdbc.url=jdbc:postgresql://${AZURE_POSTGRESQL_HOST}:${AZURE_POSTGRESQL_PORT}/${AZURE_POSTGRESQL_DATABASE}?\
    authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin\
    &sslmode=require
    
    %prod.quarkus.datasource.username=${AZURE_POSTGRESQL_USERNAME}
    %prod.quarkus.datasource.jdbc.url=jdbc:postgresql://${AZURE_POSTGRESQL_HOST}:${AZURE_POSTGRESQL_PORT}/${AZURE_POSTGRESQL_DATABASE}?\
    authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin\
    &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-extensions::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,\
    net.java.dev.jna:jna::jar
    

Een Docker-installatiekopieën bouwen en pushen naar het containerregister

  1. Bouw de containerinstallatiekopieën.

    Voer de volgende opdracht uit om de quarkus-app-installatiekopieën te bouwen. U moet deze taggen met de volledig gekwalificeerde naam van uw registeraanmeldingsserver.

    CONTAINER_IMAGE=${REGISTRY_SERVER}/quarkus-postgres-passwordless-app:v1
    
    mvn quarkus:add-extension -Dextensions="container-image-jib"
    mvn clean package -Dquarkus.container-image.build=true -Dquarkus.container-image.image=${CONTAINER_IMAGE}
    
  2. Meld u aan bij het register.

    Voordat u containerinstallatiekopieën pusht, moet u zich aanmelden bij het register. Gebruik hiervoor de opdracht [az acr login][az-acr-login].

    az acr login --name $REGISTRY_NAME
    

    Met de opdracht wordt een Login Succeeded-bericht geretourneerd nadat deze is voltooid.

  3. Push de -installatiekopie naar het register.

    Gebruik [docker push][docker-push] om de installatiekopieën naar het registerexemplaren te pushen. In dit voorbeeld wordt de quarkus-postgres-passwordless-app opslagplaats gemaakt die de quarkus-postgres-passwordless-app:v1 installatiekopie bevat.

    docker push $CONTAINER_IMAGE
    

4. Een container-app maken in Azure

  1. Maak een Container Apps-exemplaar door de volgende opdracht uit te voeren. Zorg ervoor dat u de waarde van de omgevingsvariabelen vervangt door de werkelijke naam en locatie die u wilt gebruiken.

    CONTAINERAPPS_ENVIRONMENT="my-environment"
    
    az containerapp env create \
        --resource-group $RESOURCE_GROUP \
        --name $CONTAINERAPPS_ENVIRONMENT \
        --location $LOCATION
    
  2. Maak een container-app met uw app-installatiekopieën door de volgende opdracht uit te voeren:

    APP_NAME=my-container-app
    az containerapp create \
        --resource-group $RESOURCE_GROUP \
        --name $APP_NAME \
        --image $CONTAINER_IMAGE \
        --environment $CONTAINERAPPS_ENVIRONMENT \
        --registry-server $REGISTRY_SERVER \
        --registry-identity system \
        --ingress 'external' \
        --target-port 8080 \
        --min-replicas 1
    

    Notitie

    De opties --registry-username en --registry-password worden nog steeds ondersteund, maar worden niet aanbevolen omdat het gebruik van het identiteitssysteem veiliger is.

5. Een PostgreSQL-database maken en verbinden met identiteitsconnectiviteit

Maak vervolgens een PostgreSQL-database en configureer uw container-app om verbinding te maken met een PostgreSQL-database met een door het systeem toegewezen beheerde identiteit. De Quarkus-app maakt verbinding met deze database en slaat de bijbehorende gegevens op wanneer deze wordt uitgevoerd, waarbij de toepassingsstatus behouden blijft, ongeacht waar u de toepassing uitvoert.

  1. Maak de databaseservice.

    DB_SERVER_NAME='msdocs-quarkus-postgres-webapp-db'
    
    az postgres flexible-server create \
        --resource-group $RESOURCE_GROUP \
        --name $DB_SERVER_NAME \
        --location $LOCATION \
        --public-access None \
        --sku-name Standard_B1ms \
        --tier Burstable \
        --active-directory-auth Enabled
    

    Notitie

    De opties --admin-user en --admin-password worden nog steeds ondersteund, maar worden niet aanbevolen omdat het gebruik van het identiteitssysteem veiliger is.

    De volgende parameters worden gebruikt in de bovenstaande Azure CLI-opdracht:

    • resourcegroep → Gebruik dezelfde naam van de resourcegroep waarin u de web-app hebt gemaakt, msdocs-quarkus-postgres-webapp-rgbijvoorbeeld.
    • naam → de naam van de PostgreSQL-databaseserver. Deze naam moet uniek zijn in alle Azure (het servereindpunt wordt https://<name>.postgres.database.azure.com). Toegestane tekens zijn A-Z,-09 en .- Een goed patroon is het gebruik van een combinatie van de bedrijfsnaam en server-id. (msdocs-quarkus-postgres-webapp-db)
    • locatie → Gebruik dezelfde locatie die wordt gebruikt voor de web-app. Ga naar een andere locatie als deze niet werkt.
    • openbare toegangNone waarmee de server wordt ingesteld in de modus openbare toegang zonder firewallregels. Regels worden in een latere stap gemaakt.
    • sKU-naam → De naam van de prijscategorie en rekenconfiguratie, Standard_B1msbijvoorbeeld. Zie Prijzen voor Azure Database for PostgreSQL voor meer informatie.
    • laag → De rekenlaag van de server. Zie Prijzen voor Azure Database for PostgreSQL voor meer informatie.
    • active-directory-authEnabled om Microsoft Entra-verificatie in te schakelen.
  2. Maak een database met de naam fruits in de PostgreSQL-service met deze opdracht:

    DB_NAME=fruits
    az postgres flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $DB_SERVER_NAME \
        --database-name $DB_NAME
    
  3. Installeer de serviceconnector-extensie zonder wachtwoord voor de Azure CLI:

    az extension add --name serviceconnector-passwordless --upgrade --allow-preview true
    
  4. Verbind de database met de container-app met een door het systeem toegewezen beheerde identiteit met behulp van de verbindingsopdracht.

    az containerapp connection create postgres-flexible \
        --resource-group $RESOURCE_GROUP \
        --name $APP_NAME \
        --target-resource-group $RESOURCE_GROUP \
        --server $DB_SERVER_NAME \
        --database $DB_NAME \
        --system-identity \
        --container $APP_NAME
    

6. Controleer uw wijzigingen

U vindt de toepassings-URL (FQDN) met behulp van de volgende opdracht:

echo https://$(az containerapp show \
    --name $APP_NAME \
    --resource-group $RESOURCE_GROUP \
    --query properties.configuration.ingress.fqdn \
    --output tsv)

Wanneer op de nieuwe webpagina uw lijst met vruchten wordt weergegeven, maakt uw app verbinding met de database met behulp van de beheerde identiteit. U moet nu de fruitlijst kunnen bewerken zoals voorheen.

Resources opschonen

In de voorgaande stappen hebt u Azure-resources in een resourcegroep gemaakt. Als u deze resources niet meer nodig denkt te hebben, verwijdert u de resourcegroep door de volgende opdracht in Cloud Shell uit te voeren:

az group delete --name myResourceGroup

Het kan een minuut duren voordat deze opdracht is uitgevoerd.

Volgende stappen

Meer informatie over het uitvoeren van Java-apps in Azure in de ontwikkelaarshandleiding.

Azure for Java Developers (Azure voor Java-ontwikkelaars)