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
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>
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
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}
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.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 dequarkus-postgres-passwordless-app:v1
installatiekopie bevat.docker push $CONTAINER_IMAGE
4. Een container-app maken in Azure
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
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.
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-rg
bijvoorbeeld. - 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 zijnA
-Z
,-0
9
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 toegang →
None
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_B1ms
bijvoorbeeld. 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-auth →
Enabled
om Microsoft Entra-verificatie in te schakelen.
- resourcegroep → Gebruik dezelfde naam van de resourcegroep waarin u de web-app hebt gemaakt,
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
Installeer de serviceconnector-extensie zonder wachtwoord voor de Azure CLI:
az extension add --name serviceconnector-passwordless --upgrade --allow-preview true
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)