Esercizio - Configurare App contenitore di Azure

Completato

In questa unità viene creato un gruppo di risorse di Azure che contiene le risorse per l'applicazione. Quindi si configura il database PostgreSQL usando l'interfaccia della riga di comando di Azure. Infine, si configurerà quindi l'applicazione Quarkus per accedere al database PostgreSQL remoto. Eseguire i comandi nell'ambiente Bash locale configurato nei prerequisiti. In Windows usare la distribuzione di WSL 2 configurata.

Preparare l'ambiente di lavoro

Tornare alla shell Bash usata per i comandi Maven precedenti, nella directory todo del progetto generato. Se la modalità di sviluppo Quarkus è ancora in esecuzione, premere CTRL+C prima di continuare. Usare questa shell per le esportazioni seguenti e mantenerla aperta tramite l'avvio, la creazione di pacchetti e la distribuzione dell'applicazione.

Usare interfaccia della riga di comando di Azure 2.87.0 o versione successiva. È necessaria l'autorizzazione per creare il gruppo di risorse e le risorse e registrare i relativi provider di risorse, ad esempio Collaboratore o Proprietario nell'ambito della sottoscrizione. La politica di sottoscrizione e la quota possono imporre restrizioni aggiuntive.

Accedere a Azure in questo ambiente Bash locale usando il flusso di accesso interattivo interfaccia della riga di comando di Azure, inclusa qualsiasi autenticazione a più fattori richiesta. Sostituire <subscription-id> con l'ID sottoscrizione desiderato, quindi selezionare e visualizzare la sottoscrizione:

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

Verificare che la sottoscrizione visualizzata sia quella che si intende usare prima di creare risorse addebitabili. L'accesso a Cloud Shell non esegue l'accesso a un'interfaccia della riga di comando locale separata. Completare ogni comando Azure correttamente prima di continuare.

È necessario configurare alcune variabili di ambiente. Di seguito sono riportate alcune note sulle variabili che verranno create:

Variable Descrizione
AZ_PROJECT Valore di progetto breve, in lettere minuscole, con un suffisso di univocità. Mantenere invariato il nome della variabile; il suffisso appartiene al relativo valore.
AZ_RESOURCE_GROUP Nome del gruppo di risorse che contiene le risorse.
AZ_LOCATION Area di Azure. È consigliabile usare un'area vicina al luogo in cui si vive. Per vedere l'elenco delle aree disponibili, immettere az account list-locations al prompt dei comandi.
AZ_CONTAINERAPP Nome dell’istanza di App contenitore di Azure che contiene i contenitori.
AZ_CONTAINERAPP_ENV Nome dell'ambiente App contenitore di Azure.
AZ_POSTGRES_SERVER_NAME Nome univoco globale del server flessibile PostgreSQL. Usare 3-63 caratteri costituiti da lettere minuscole, numeri e trattini. Il valore generato psql${AZ_PROJECT} segue queste regole. Scegliere un suffisso diverso se tale nome non è disponibile.
AZ_POSTGRES_DB_NAME Nome del database dell'applicazione. Si crea questo database in modo esplicito dopo la creazione del server.
AZ_POSTGRES_USERNAME Nome utente amministratore per il server di database PostgreSQL.
AZ_POSTGRES_PASSWORD Password di amministratore per il server di database PostgreSQL. Immettere una password sicura al prompt silenzioso.

Nota

È possibile assegnare un nome alle risorse di Azure in qualsiasi modo desiderato, ma è consigliabile esaminare esempi di abbreviazione per le risorse di Azure. Questo articolo fornisce abbreviazioni di esempio per molte risorse di Azure, ad esempio rg per i gruppi di risorse e ca per le app contenitore.

Eseguire il blocco seguente una volta per configurare le variabili. Selezionare un'area appropriata per la sottoscrizione e immettere una password che soddisfi i requisiti del servizio PostgreSQL. Il prompt della password non visualizza ciò che digiti.

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

Il suffisso casuale riduce i conflitti tra nomi di risorsa; non garantisce la disponibilità globale. Se il nome del server PostgreSQL non è disponibile, scegliere un altro suffisso per AZ_POSTGRES_SERVER_NAME prima di creare il server. Mantenere invariati gli altri identificatori di risorsa.

Queste variabili di ambiente vengono nel resto del modulo. Conservarli in questa shell Bash e non rieseguire il blocco del nome casuale e della password tra le unità. Il terminale separato usato per le richieste HTTP non richiede la password del database.

Successivamente, creare un gruppo di risorse:

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

Creare un'istanza di Database di Azure per PostgreSQL

A questo punto si creerà un server PostgreSQL 16 gestito normalmente con lo SKU B1ms burstable e 32 GiB di archiviazione SSD Premium. L'area selezionata deve supportare questa versione e lo SKU e disporre di capacità di sottoscrizione disponibile. Risolvere eventuali errori di quota o problemi relativi ai criteri prima di continuare.

Registrare il provider PostgreSQL e attendere il completamento della registrazione:

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

Importante

Questo esercizio consente temporaneamente i tentativi di connessione al database da tutti gli indirizzi IPv4 pubblici. L'autenticazione è ancora necessaria. Usare un nuovo server e un nuovo gruppo di risorse dedicato all'esercizio, completare la restrizione del firewall successiva ed eliminare le risorse dell'esercizio al termine. Questa impostazione di rete iniziale non è una raccomandazione per l'ambiente di produzione.

Creare il server PostgreSQL:

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

L'opzione --public-access All abilita l'endpoint pubblico e crea la singola regola del firewall all-addresses usata più avanti in questo modulo. L'eccezione Azure-services successiva usa ancora l'endpoint pubblico e consente i tentativi di connessione da Azure risorse, incluse le sottoscrizioni di altri clienti. Non è un accesso privato né un accesso solo applicazione.

Al termine della creazione del server, creare in modo esplicito il database dell'applicazione:

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

Verificare che il database esista prima di avviare l'applicazione:

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

Il nome restituito deve corrispondere al valore di AZ_POSTGRES_DB_NAME. Questi comandi di database usano --server-name per il server e --name per il database.

Configurare Quarkus per accedere al database PostgreSQL

Ottenere il nome di dominio completo (FQDN) del server e compilare un URL JDBC senza credenziali:

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"

Questo URL usa sslmode=require per richiedere il trasporto crittografato. Il nome utente e la password vengono forniti separatamente tramite le proprietà dell'origine dati, quindi i caratteri come & in una password non vengono analizzati come parametri URL. Non stampare o tracciare i valori delle credenziali.

La crittografia non è la verifica dell'identità del certificato. sslmode=require non verifica il certificato del server e il nome host. Se è necessaria tale verifica, seguire le istruzioni pgJDBC verify-full e Azure istruzioni sull'attendibilità del certificato, inclusa la configurazione della radice attendibile. La semplice modifica della modalità senza configurare l'attendibilità non è una procedura completa di convalida del certificato.

Configurare l'applicazione Quarkus per la connessione al database PostgreSQL

In src/main/resources/application.propertiessostituire l'URL dell'origine dati nonprofiled esistente e le voci di generazione dello schema con le quattro righe seguenti. Rimuovere anche eventuali voci di nome utente o password dell'origine dati senza profilo. Mantieni le espressioni ${...} letterali nel file e non sostituirle con i valori delle credenziali. Lasciare invariate le impostazioni non correlate.

%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}

Queste impostazioni si applicano ai profili prod e dev, non ai test automatizzati. La modalità di sviluppo usa il database Azure per questa unità e l'applicazione distribuita la usa in modalità di produzione. I test usano un PostgreSQL Dev Service separato. Mantenere Docker in esecuzione durante il test o la creazione di pacchetti dell'applicazione. Il ciclo di vita di Maven package esegue i test; non deve aggiungere record di test al database Azure.

Non esportare override senza profilo QUARKUS_DATASOURCE_*. Se in precedenza ne hai impostati alcuni in questa shell, rimuovili prima di testare o creare pacchetti perché sovrascrivono questa separazione. Le AZ_ variabili vengono risolte solo dalle espressioni con ambito profilo. Per altre informazioni, vedere le informazioni di riferimento sulla configurazione di Quarkus 3.18.4.

Eseguire l'applicazione Quarkus in locale per testare la connessione dati remota

Un processo eredita le variabili di ambiente all'avvio. Esportare AZ_POSTGRES_* in un altro terminale non aggiorna un processo Quarkus già in esecuzione e la modifica di application.properties da sola non è sufficiente per questa transizione.

Verificare che il processo di sviluppo precedente sia stato arrestato premendo CTRL+C nel terminale, se necessario. todo Dalla directory nella shell Bash contenente le risorse esportate e le variabili del database avviare l'applicazione:

./mvnw clean quarkus:dev

Quando Quarkus è in esecuzione, creare alcune attività usando i comandi cURL seguenti in un secondo terminale Bash locale. Lasciare la shell che possiede la variabile d'ambiente in esecuzione con Quarkus:

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

Verificare quindi che le attività siano presenti nel database accedendo all'endpoint GET definito nell'app attività:

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

La risposta deve contenere le descrizioni inviate, analogamente all'output seguente. Gli identificatori, i timestamp e l'ordine possono variare e ripetere un POST crea un altro elemento.

[
  {
    "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"
  }
]

Se la risposta contiene gli elementi che hai creato, hai eseguito correttamente l'applicazione Quarkus e ti sei connesso al database PostgreSQL remoto.

Prima di continuare a creare pacchetti nell'unità successiva, tornare al terminale che esegue Quarkus e premere CTRL+C. Mantenere aperta la shell Bash nella todo directory con tutte le variabili esportate intatte. Non rieseguire il blocco del nome casuale e della password; usare questa stessa shell per la creazione di pacchetti e la distribuzione.