Ćwiczenie — konfigurowanie usługi Azure Container Apps

Ukończone

W tej lekcji utworzysz grupę zasobów platformy Azure zawierającą zasoby dla aplikacji. Następnie skonfigurujesz bazę danych PostgreSQL przy użyciu interfejsu wiersza polecenia platformy Azure. Na koniec skonfigurujesz aplikację Quarkus w celu uzyskania dostępu do zdalnej bazy danych PostgreSQL. Uruchom polecenia w lokalnym środowisku powłoki Bash skonfigurowanym w wymaganiach wstępnych. W Windows użyj skonfigurowanej dystrybucji WSL 2.

Przygotowywanie środowiska roboczego

Wróć do powłoki Bash użytej we wcześniejszych poleceniach narzędzia Maven, w wygenerowanym todo katalogu projektu. Jeśli tryb programowania Quarkus jest nadal uruchomiony, naciśnij klawisze Ctrl+C przed kontynuowaniem. Użyj tej powłoki dla następujących eksportów i pozostaw ją otwartą podczas uruchamiania aplikacji, tworzenia pakietów i wdrażania.

Użyj Azure CLI 2.87.0 lub nowszej. Musisz mieć uprawnienia do tworzenia grupy zasobów i zasobów oraz rejestrowania dostawców zasobów, takich jak Współautor lub Właściciel w zakresie subskrypcji. Zasady subskrypcji i limit przydziału mogą nakładać dodatkowe ograniczenia.

Zaloguj się do platformy Azure w tym lokalnym środowisku powłoki Bash przy użyciu interaktywnego przepływu logowania Azure CLI, w tym dowolnego wymaganego uwierzytelniania wieloskładnikowego. Zastąp <subscription-id> identyfikatorem zamierzonej subskrypcji, a następnie wybierz i wyświetl tę subskrypcję:

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

Upewnij się, że wyświetlana subskrypcja jest subskrypcją, której zamierzasz użyć przed utworzeniem zasobów podlegających naliczaniu opłat. Logowanie do Cloud Shell nie powoduje zalogowania się do oddzielnego lokalnego interfejsu wiersza polecenia. Przed kontynuowaniem pomyślnie ukończ każde polecenie platformy Azure.

Należy skonfigurować niektóre zmienne środowiskowe. Oto kilka uwag dotyczących zmiennych, które utworzysz:

Zmienna Opis
AZ_PROJECT Krótka wartość projektu pisana małymi literami z sufiksem unikatowości. Zachowaj nazwę zmiennej bez zmian; sufiks należy do jej wartości.
AZ_RESOURCE_GROUP Nazwa grupy zasobów, która zawiera zasoby.
AZ_LOCATION Region świadczenia usługi Azure. Zalecamy użycie regionu, który znajduje się blisko miejsca zamieszkania. Aby wyświetlić listę dostępnych regionów, wprowadź az account list-locations w wierszu polecenia.
AZ_CONTAINERAPP Nazwa wystąpienia usługi Azure Container Apps, które przechowuje kontenery.
AZ_CONTAINERAPP_ENV Nazwa środowiska usługi Azure Container Apps.
AZ_POSTGRES_SERVER_NAME Globalnie unikatowa nazwa serwera elastycznego PostgreSQL. Użyj 3–63 znaków składających się z małych liter, cyfr i łączników. Wygenerowana wartość psql${AZ_PROJECT} ma następującą postać zgodnie z tymi regułami; wybierz inny sufiks, jeśli ta wartość jest niedostępna.
AZ_POSTGRES_DB_NAME Nazwa bazy danych aplikacji. Tę bazę danych tworzysz jawnie po utworzeniu serwera.
AZ_POSTGRES_USERNAME Nazwa użytkownika administratora serwera bazy danych PostgreSQL.
AZ_POSTGRES_PASSWORD Hasło administratora serwera bazy danych PostgreSQL. Wprowadź bezpieczne hasło w niewidocznym monicie.

Nota

Zasoby Azure można nazwać w dowolny sposób, ale zalecamy przejrzenie przykładów skrótów dla zasobów Azure. Ten artykuł zawiera przykładowe skróty dla wielu zasobów platformy Azure (na przykład rg dla grup zasobów i ca dla aplikacji kontenerów).

Uruchom następujący blok raz, aby skonfigurować zmienne. Wybierz region odpowiedni dla subskrypcji i wprowadź hasło spełniające wymagania usługi PostgreSQL. Monit hasła nie wyświetla wpisywanych danych.

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

Sufiks losowy zmniejsza kolizje nazw zasobów; nie gwarantuje dostępności globalnej. Jeśli nazwa serwera PostgreSQL jest niedostępna, przed utworzeniem serwera wybierz inny sufiks dla AZ_POSTGRES_SERVER_NAME. Zachowaj pozostałe identyfikatory zasobów bez zmian.

Te zmienne środowiskowe są używane w pozostałej części tego modułu. Zachowaj je w tej powłoce Bash i nie uruchamiaj ponownie bloku losowej nazwy i hasła pomiędzy kolejnymi jednostkami. Oddzielny terminal używany dla żądań HTTP nie wymaga hasła bazy danych.

Następnie utwórz grupę zasobów:

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

Utwórz instancję Azure Database for PostgreSQL

Teraz utworzysz zwykły zarządzany serwer PostgreSQL 16 z SKU Burstable B1ms i 32 GiB magazynu SSD w warstwie Premium. Wybrany region musi obsługiwać tę wersję i SKU oraz mieć dostępny limit zasobów subskrypcji. Przed kontynuowaniem rozwiąż problemy z limitem przydziału lub zasadami.

Zarejestruj dostawcę PostgreSQL i poczekaj na ukończenie rejestracji:

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

Important

To ćwiczenie tymczasowo zezwala na próby nawiązania połączenia z bazą danych ze wszystkich publicznych adresów IPv4. Uwierzytelnianie jest nadal wymagane. Użyj nowego serwera i grupy zasobów dedykowanej do ćwiczenia, później skonfiguruj ograniczenie zapory i usuń zasoby ćwiczenia po zakończeniu. To początkowe ustawienie sieci nie jest zalecanym ustawieniem dla środowiska produkcyjnego.

Utwórz serwer 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

Opcja --public-access All włącza publiczny punkt końcowy i tworzy pojedynczą regułę zapory dla wszystkich adresów używaną w dalszej części tego modułu. Późniejszy wyjątek Azure-services nadal używa tego publicznego punktu końcowego i zezwala na próby połączenia z zasobów platformy Azure, w tym z subskrypcji innych klientów. Nie jest to dostęp prywatny ani tylko aplikacyjny.

Po pomyślnym utworzeniu serwera jawnie utwórz bazę danych aplikacji:

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

Przed uruchomieniem aplikacji sprawdź, czy baza danych istnieje:

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

Zwrócona nazwa musi być zgodna z wartością AZ_POSTGRES_DB_NAME. Te polecenia bazy danych używają --server-name dla serwera i --name dla bazy danych.

Konfigurowanie aplikacji Quarkus w celu uzyskania dostępu do bazy danych PostgreSQL

Pobierz w pełni kwalifikowaną nazwę domeny serwera (FQDN) i skompiluj adres URL JDBC bez poświadczeń:

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"

Ten adres URL używa sslmode=require, aby wymagać szyfrowanego transportu. Nazwa użytkownika i hasło są dostarczane oddzielnie za pośrednictwem właściwości źródła danych, więc znaki, takie jak & w haśle, nie są analizowane jako parametry adresu URL. Nie drukuj ani nie rejestruj wartości poświadczeń.

Szyfrowanie nie jest weryfikacją tożsamości certyfikatu. sslmode=require program nie weryfikuje certyfikatu serwera i nazwy hosta. Jeśli potrzebujesz tej weryfikacji, postępuj zgodnie ze wskazówkami pgJDBC verify-full i instrukcjami platformy Azure dotyczącymi zaufania do certyfikatów, w tym konfiguracją zaufanego certyfikatu głównego. Jedynie zmiana trybu bez konfigurowania zaufania nie jest kompletną procedurą weryfikacji certyfikatów.

Konfigurowanie aplikacji Quarkus w celu nawiązania połączenia z bazą danych PostgreSQL

W src/main/resources/application.propertiespliku zastąp istniejący nieprofilowany adres URL źródła danych i wpisy generowania schematu następującymi czterema wierszami. Usuń również wszystkie nieprofilowane wpisy nazwy użytkownika lub hasła źródła danych. Zachowaj wyrażenia ${...} w formie dosłownej w pliku; nie zastąp ich wartościami poświadczeń. Pozostaw niepowiązane ustawienia bez zmian.

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

Te ustawienia dotyczą profili dev i prod, a nie testów automatycznych. Tryb deweloperski używa bazy danych Azure dla tej jednostki, a wdrożona aplikacja używa jej w trybie produkcyjnym. Testy korzystają z oddzielnej usługi Dev Service PostgreSQL. Pozostaw Dockera uruchomionego podczas testowania lub pakowania aplikacji. Cykl życia programu Maven package uruchamia testy; nie może dodawać rekordów testowych do bazy danych Azure.

Nie eksportuj nieprofilowanych QUARKUS_DATASOURCE_* nadpisań. Jeśli wcześniej ustawiono jakiekolwiek zmienne w tej powłoce, usuń je przed rozpoczęciem testowania lub pakowania, ponieważ przesłaniają one tę separację. Zmienne AZ_ są rozwiązywane tylko przez wyrażenia o zakresie profilu. Aby uzyskać więcej informacji, zobacz dokumentację konfiguracji quarkus 3.18.4.

Uruchamianie aplikacji Quarkus lokalnie w celu przetestowania połączenia zdalnej bazy danych

Proces dziedziczy zmienne środowiskowe podczas jego uruchamiania. Eksportowanie AZ_POSTGRES_* w innym terminalu nie powoduje zaktualizowania jeszcze uruchomionego procesu Quarkus, a samo edytowanie application.properties nie jest wystarczające dla tego przejścia.

Upewnij się, że wcześniejszy proces deweloperski został zatrzymany, naciskając klawisze Ctrl+C w jego terminalu w razie potrzeby. Z katalogu todo w powłoce Bash zawierającej wyeksportowane zmienne zasobu i bazy danych uruchom aplikację:

./mvnw clean quarkus:dev

Gdy aplikacja Quarkus jest uruchomiona, utwórz kilka zadań do wykonania, używając następujących poleceń cURL w drugim lokalnym terminalu powłoki Bash. Pozostaw powłokę, w której ustawiono zmienne, z uruchomionym Quarkusem:

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

Następnie sprawdź, czy zadania do wykonania znajdują się w bazie danych, korzystając z punktu końcowego GET zdefiniowanego w aplikacji to-do:

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

Odpowiedź powinna zawierać przesłane opisy podobne do poniższych danych wyjściowych. Identyfikatory, znaczniki czasu i kolejność mogą się różnić, a ponowienie żądania POST tworzy inny element.

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

Jeśli odpowiedź zawiera utworzone przez Ciebie elementy, pomyślnie uruchomiłeś aplikację Quarkus i połączyłeś się ze zdalną bazą danych PostgreSQL.

Przed kontynuowaniem pakowania w następnej lekcji wróć do terminalu z uruchomioną aplikacją Quarkus i naciśnij klawisze Ctrl+C. Pozostaw powłokę Bash otwartą w katalogu todo ze wszystkimi wyeksportowanymi zmiennymi bez zmian. Nie uruchamiaj ponownie bloku generowania losowej nazwy i hasła; użyj tej samej powłoki do tworzenia pakietów i wdrażania.