Oefening: Azure Container Apps instellen

Voltooid

In deze eenheid maakt u een Azure-resourcegroep die de resources voor de toepassing bevat. Vervolgens stelt u de PostgreSQL-database in met behulp van de Azure CLI. Ten slotte configureert u de Quarkus-toepassing voor toegang tot de externe PostgreSQL-database. Voer de opdrachten uit in de lokale Bash-omgeving die is geconfigureerd in de vereisten. Gebruik in Windows de geconfigureerde WSL 2-distributie.

De werkomgeving voorbereiden

Ga terug naar de Bash-shell die u hebt gebruikt voor de eerdere Maven-opdrachten, in de gegenereerde todo projectmap. Als de ontwikkelingsmodus van Quarkus nog steeds actief is, drukt u op Ctrl+C voordat u doorgaat. Gebruik deze shell voor de volgende exports en houd deze open tijdens het opstarten, verpakken en implementeren van de toepassing.

Gebruik Azure CLI 2.87.0 of hoger. U hebt toestemming nodig om de resourcegroep en resources te maken en hun resourceproviders te registreren, bijvoorbeeld als Medewerker of Eigenaar binnen het abonnementsbereik. Abonnementsbeleid en quotum kunnen extra beperkingen opleggen.

Meld u aan bij Azure in deze lokale Bash-omgeving met behulp van de interactieve Azure CLI-aanmeldingsprocedure, inclusief eventuele vereiste meervoudige authenticatie. Vervang <subscription-id> door uw beoogde abonnements-id en selecteer en geef dat abonnement weer:

az login
az account set --subscription "<subscription-id>"
az account show --query "{name:name,id:id}" --output table

Controleer of het weergegeven abonnement het abonnement is dat u wilt gebruiken voordat u kostenbare resources maakt. Als u zich aanmeldt bij Cloud Shell, meldt u zich niet aan bij een afzonderlijke lokale CLI. Voltooi elk Azure-commando succesvol voordat u doorgaat.

U moet enkele omgevingsvariabelen instellen. Hier volgen enkele opmerkingen over de variabelen die u gaat maken:

Veranderlijk Beschrijving
AZ_PROJECT Een korte, in kleine letters geschreven projectwaarde met een uniek achtervoegsel. Behoud de naam van de variabele ongewijzigd; het achtervoegsel behoort tot de waarde.
AZ_RESOURCE_GROUP De naam van de resourcegroep die de resources bevat.
AZ_LOCATION De Azure-regio. U wordt aangeraden een regio te gebruiken die zich dicht bij de locatie bevindt. Als u de lijst met beschikbare regio's wilt zien, voert u az account list-locations in bij een opdrachtprompt.
AZ_CONTAINERAPP De naam van het Azure Container Apps-exemplaar dat de containers bevat.
AZ_CONTAINERAPP_ENV De naam van de Azure Container Apps-omgeving.
AZ_POSTGRES_SERVER_NAME De wereldwijd unieke naam van de flexibele PostgreSQL-server. Gebruik 3-63 tekens die bestaan uit kleine letters, cijfers en afbreekstreepjes. De gegenereerde psql${AZ_PROJECT} waarde volgt deze regels. Kies een ander achtervoegsel als die naam niet beschikbaar is.
AZ_POSTGRES_DB_NAME De naam van de toepassingsdatabase. U maakt deze database expliciet nadat u de server hebt gemaakt.
AZ_POSTGRES_USERNAME De gebruikersnaam van de beheerder voor uw PostgreSQL-databaseserver.
AZ_POSTGRES_PASSWORD Het beheerderswachtwoord voor uw PostgreSQL-databaseserver. Voer een beveiligd wachtwoord in bij de verborgen prompt.

Notitie

U kunt uw Azure-resources op elke gewenste manier een naam geven, maar we raden u aan afkortingsvoorbeelden voor Azure-resources te bekijken. Dit artikel bevat voorbeelden van afkortingen voor veel Azure-resources (bijvoorbeeld rg voor resourcegroepen en ca voor container-apps).

Voer het volgende blok eenmaal uit om de variabelen in te stellen. Selecteer een regio die geschikt is voor uw abonnement en voer een wachtwoord in dat voldoet aan de Vereisten van de PostgreSQL-service. In de wachtwoordprompt wordt niet weergegeven wat u typt.

export AZ_PROJECT="quarkus-${RANDOM}${RANDOM}"
export AZ_RESOURCE_GROUP="rg${AZ_PROJECT}"
export AZ_LOCATION="eastus"
export AZ_CONTAINERAPP="ca${AZ_PROJECT}"
export AZ_CONTAINERAPP_ENV="cae${AZ_PROJECT}"
export AZ_POSTGRES_DB_NAME="postgres${AZ_PROJECT}"
export AZ_POSTGRES_SERVER_NAME="psql${AZ_PROJECT}"
export AZ_POSTGRES_USERNAME="pgadmin"

read -r -s -p "PostgreSQL administrator password: " AZ_POSTGRES_PASSWORD
printf '\n'
export AZ_POSTGRES_PASSWORD

Het willekeurige achtervoegsel vermindert conflicten tussen resourcenamen; het garandeert geen wereldwijde beschikbaarheid. Als de naam van de PostgreSQL-server niet beschikbaar is, kiest u een ander achtervoegsel voor AZ_POSTGRES_SERVER_NAME voordat u de server maakt. Houd de andere resource-id's ongewijzigd.

Deze omgevingsvariabelen worden in de rest van deze module gebruikt. Bewaar ze in deze Bash-shell en voer het willekeurige naam- en wachtwoordblok tussen de units door niet opnieuw uit. De afzonderlijke terminal die wordt gebruikt voor HTTP-aanvragen heeft het databasewachtwoord niet nodig.

Maak vervolgens een resourcegroep:

az group create \
    --name "$AZ_RESOURCE_GROUP" \
    --location "$AZ_LOCATION"

Een exemplaar van Azure Database for PostgreSQL maken

U maakt nu een gewone beheerde PostgreSQL 16-server met de Burstable B1ms SKU en 32 GiB van Premium SSD-opslag. De geselecteerde regio moet deze versie en SKU ondersteunen en over de beschikbare abonnementscapaciteit beschikken. Los eventuele quotum- of beleidsfouten op voordat u doorgaat.

Registreer de PostgreSQL-provider en wacht tot de registratie is voltooid:

az provider register --namespace Microsoft.DBforPostgreSQL --wait

Important

In deze oefening zijn pogingen tot databaseverbindingen van alle openbare IPv4-adressen tijdelijk toegestaan. Verificatie is nog steeds vereist. Gebruik een nieuwe server en resourcegroep die speciaal voor de oefening is bedoeld, voltooi de latere firewallbeperking en verwijder de oefeningsresources wanneer u klaar bent. Deze initiële netwerkinstelling is geen aanbeveling voor productie.

Maak de PostgreSQL-server:

az postgres flexible-server create \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --location "$AZ_LOCATION" \
    --name "$AZ_POSTGRES_SERVER_NAME" \
    --admin-user "$AZ_POSTGRES_USERNAME" \
    --admin-password="$AZ_POSTGRES_PASSWORD" \
    --public-access All \
    --tier Burstable \
    --sku-name Standard_B1ms \
    --storage-type Premium_LRS \
    --storage-size 32 \
    --version 16 \
    --yes \
    --output none

Met de --public-access All optie wordt het openbare eindpunt ingeschakeld en wordt de firewallregel voor alle adressen gemaakt die verderop in deze module wordt gebruikt. De latere Azure-services-uitzondering maakt nog steeds gebruik van dat openbare eindpunt en staat verbindingspogingen toe vanuit Azure resources, waaronder abonnementen van andere klanten. Het is geen privétoegang of toegang alleen voor toepassingen.

Nadat het maken van de server is geslaagd, maakt u expliciet de toepassingsdatabase aan:

az postgres flexible-server db create \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --server-name "$AZ_POSTGRES_SERVER_NAME" \
    --name "$AZ_POSTGRES_DB_NAME" \
    --output none

Controleer of de database bestaat voordat u de toepassing start:

az postgres flexible-server db show \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --server-name "$AZ_POSTGRES_SERVER_NAME" \
    --name "$AZ_POSTGRES_DB_NAME" \
    --query name \
    --output tsv

De geretourneerde naam moet overeenkomen met de waarde van AZ_POSTGRES_DB_NAME. Deze databaseopdrachten gebruiken --server-name voor de server en --name voor de database.

Quarkus configureren voor toegang tot de PostgreSQL-database

Haal de FQDN (Fully Qualified Domain Name) van de server op en bouw een JDBC-URL zonder inloggegevens:

export AZ_POSTGRES_HOST=$(
    az postgres flexible-server show \
        --resource-group "$AZ_RESOURCE_GROUP" \
        --name "$AZ_POSTGRES_SERVER_NAME" \
        --query fullyQualifiedDomainName \
        --output tsv
)
export AZ_POSTGRES_JDBC_URL="jdbc:postgresql://${AZ_POSTGRES_HOST}:5432/${AZ_POSTGRES_DB_NAME}?sslmode=require"

Deze URL gebruikt sslmode=require om versleuteld transport te vereisen. Gebruikersnaam en wachtwoord worden afzonderlijk opgegeven via de eigenschappen van de gegevensbron, zodat tekens zoals & in een wachtwoord niet worden geparseerd als URL-parameters. Geen inloggegevens afdrukken of traceren.

Versleuteling is niet hetzelfde als verificatie van de certificaatidentiteit. sslmode=require controleert het servercertificaat en de hostnaam niet. Als u deze verificatie nodig hebt, volgt u de pgJDBC-richtlijnen verify-full en Azure-instructies voor certificaatvertrouwen, inclusief de configuratie van vertrouwde basiscertificaten. Alleen het wijzigen van de modus zonder vertrouwen te configureren, is geen volledige procedure voor certificaatvalidatie.

De Quarkus-toepassing configureren om verbinding te maken met de PostgreSQL-database

Vervang in src/main/resources/application.properties de bestaande niet-geprofilede gegevensbron-URL en vermeldingen voor het genereren van schema's door de volgende vier regels. Verwijder ook niet-geprofilede gebruikersnamen van gegevensbronnen of wachtwoordvermeldingen. Behoud de ${...} letterlijke expressies in het bestand. Vervang ze niet door aanmeldingsgegevens. Laat niet-gerelateerde instellingen ongewijzigd.

%dev,prod.quarkus.hibernate-orm.database.generation=update
%dev,prod.quarkus.datasource.jdbc.url=${AZ_POSTGRES_JDBC_URL}
%dev,prod.quarkus.datasource.username=${AZ_POSTGRES_USERNAME}
%dev,prod.quarkus.datasource.password=${AZ_POSTGRES_PASSWORD}

Deze instellingen zijn van toepassing op de dev en prod profielen, niet op geautomatiseerde tests. De ontwikkelingsmodus maakt gebruik van de Azure-database voor deze eenheid en de geïmplementeerde toepassing gebruikt deze in de productiemodus. Tests maken gebruik van een afzonderlijke PostgreSQL Dev Service. Houd Docker actief bij het testen of verpakken van de toepassing. De maven-levenscyclus package voert de tests uit. Het mag geen testrecords toevoegen aan de Azure-database.

Exporteer niet-geprofileerde QUARKUS_DATASOURCE_* overschrijvingen. Als u eerder eventuele items in deze shell hebt ingesteld, verwijdert u deze vóór het testen of verpakken, omdat ze deze scheiding overschrijven. De AZ_ variabelen worden alleen opgelost door de profielgebonden expressies. Zie de configuratiereferentie quarkus 3.18.4 voor meer informatie.

De Quarkus-toepassing lokaal uitvoeren om de externe databaseverbinding te testen

Een proces neemt omgevingsvariabelen over wanneer het wordt gestart. Het exporteren van AZ_POSTGRES_* in een andere terminal werkt een al actief Quarkus-proces niet bij, en het alleen bewerken van application.properties is niet voldoende voor deze overgang.

Zorg ervoor dat het eerder gestarte ontwikkelproces is gestopt door zo nodig op Ctrl+C in de terminal te drukken. Start de toepassing vanuit de todo map in de Bash-shell met de geëxporteerde resource- en databasevariabelen:

./mvnw clean quarkus:dev

Wanneer Quarkus wordt uitgevoerd, maakt u een paar to-do's met behulp van de volgende cURL-opdrachten in een tweede lokale Bash-terminal. Laat de shell die eigenaar is van de variabele waarin Quarkus actief blijft:

curl --header "Content-Type: application/json" \
    --request POST \
    --data '{"description":"Take Quarkus MS Learn","details":"Take the MS Learn on deploying Quarkus to Azure Container Apps","done": "true"}' \
    http://127.0.0.1:8080/api/todos

curl --header "Content-Type: application/json" \
    --request POST \
    --data '{"description":"Take Azure Container Apps MS Learn","details":"Take the ACA Learn module","done": "false"}' \
    http://127.0.0.1:8080/api/todos

Controleer vervolgens of de taken zich in de database bevinden door toegang te krijgen tot het GET-eindpunt dat is gedefinieerd in de to-do-app:

curl http://127.0.0.1:8080/api/todos

Het antwoord moet de beschrijvingen bevatten die u hebt verzonden, vergelijkbaar met de volgende uitvoer. Id's, tijdstempels en volgorde kunnen variëren en het herhalen van een POST maakt een ander item.

[
  {
    "id": 1,
    "description": "Take Quarkus MS Learn",
    "details": "Take the MS Learn on deploying Quarkus to Azure Container Apps",
    "done": true,
    "createdAt": "2025-02-26T08:03:28.390854Z"
  },
  {
    "id": 2,
    "description": "Take Azure Container Apps MS Learn",
    "details": "Take the ACA Learn module",
    "done": false,
    "createdAt": "2025-02-26T08:03:34.142249Z"
  }
]

Als het antwoord de items bevat die u hebt gemaakt, hebt u de Quarkus-toepassing met succes uitgevoerd en bent u verbonden met de externe PostgreSQL-database.

Voordat u verdergaat met verpakken in de volgende eenheid, gaat u terug naar de terminal waarin Quarkus draait en drukt u op Ctrl+C. Houd deze Bash-shell geopend in de todo map met alle geëxporteerde variabelen intact. Voer het blok met een willekeurige naam en wachtwoord niet opnieuw uit; gebruik dezelfde shell voor het verpakken en implementeren.