練習 - 設定 Azure 容器應用程式

已完成

在此單元中,您會建立包含應用程式資源的 Azure 資源群組。 接著,您可以使用 Azure CLI 來設定 PostgreSQL 資料庫。 最後,您會將 Quarkus 應用程式設定為存取遠端 PostgreSQL 資料庫。 在先決條件中設定的本地 Bash 環境中執行指令。 在 Windows 上,使用你設定的 WSL 2 發行版。

準備工作環境

回到你之前用來處理 Maven 指令的 Bash shell,在產生 todo 的專案目錄裡。 如果 Quarkus 開發模式仍在運行,請先按 Ctrl+C 再繼續。 使用此殼層進行下列匯出,並在應用程式啟動、封裝及部署過程中保持開啟。

使用 Azure CLI 2.87.0 或更新版本。 您需要具備建立資源群組和資源,以及註冊其資源提供者的權限,例如訂用帳戶範圍內的參與者或擁有者。 訂閱政策和配額可能會帶來額外限制。

透過互動式 Azure CLI 登入流程(包括任何必要的多重要素驗證),在這個本機 Bash 環境中登入 Azure。 請替換 <subscription-id> 成你預期的訂閱 ID,然後選擇並顯示該訂閱:

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

在建立可收費資源前,請確認顯示的訂閱是你打算使用的訂閱。 登入 Cloud Shell 並不會登入一個獨立的本地 CLI 介面。 在繼續之前,請先成功完成每個 Azure 指令。

您必須設定一些環境變數。 以下是您將建立之變數的一些注意事項:

變數 說明
AZ_PROJECT 一個簡短、小寫的專案值,並帶有唯一性後綴。 保持變數名稱不變;後綴應該反映在它的值上。
AZ_RESOURCE_GROUP 保留資源的資源群組名稱。
AZ_LOCATION Azure 區域。 建議您使用靠近您居住位置的區域。 若要查看可用的區域清單,請在命令提示字元中輸入 az account list-locations。
AZ_CONTAINERAPP 保存容器的 Azure 容器應用程式 實例名稱。
AZ_CONTAINERAPP_ENV Azure 容器應用程式環境的名稱。
AZ_POSTGRES_SERVER_NAME PostgreSQL 彈性伺服器的全球唯一名稱。 使用3至63個字元,包含小寫字母、數字和連字號。 產生 psql${AZ_PROJECT} 的值遵循以下規則;若該名稱不可用,請選擇其他後綴。
AZ_POSTGRES_DB_NAME 應用程式資料庫名稱。 您是在建立伺服器後明確建立這個資料庫。
AZ_POSTGRES_USERNAME 你 PostgreSQL 資料庫伺服器的管理員使用者名稱。
AZ_POSTGRES_PASSWORD 你 PostgreSQL 資料庫伺服器的管理員密碼。 在不顯示輸入內容的提示下輸入安全密碼。

備註

您可以以任何方式命名 Azure 資源,但建議您檢閱 Azure 資源的縮寫範例,。 本文提供許多 Azure 資源的範例縮寫(例如,資源群組的 rg,以及容器應用程式的 ca)。

執行以下區塊一次以設定變數。 請選擇適合您訂閱的地區,並輸入符合 PostgreSQL 服務要求的密碼。 密碼提示框不會顯示你輸入的內容。

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

隨機後綴減少資源名稱的衝突;它並不保證全域可用性。 如果 PostgreSQL 伺服器名稱無法使用,請先為 AZ_POSTGRES_SERVER_NAME 選擇其他後綴,再建立伺服器。 其他資源識別碼保持不變。

此課程模組的其餘部分會使用這些環境變數。 把它們留在此 Bash 殼層中,不要在各單元之間重新執行隨機名稱和密碼區塊。 用於 HTTP 請求的獨立終端機不需要資料庫密碼。

接著,建立資源群組:

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

建立適用於 PostgreSQL 的 Azure 資料庫實例

你現在會建立一台普通的託管 PostgreSQL 16 伺服器,使用 Burstable B1ms 的 SKU 和 32 GiB 的高級 SSD 儲存空間。 所選地區必須支援此版本及 SKU,並具備可用的訂閱容量。 在繼續之前,先解決任何配額或原則錯誤。

註冊 PostgreSQL 提供者並等待註冊完成:

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

Important

此操作暫時允許所有公共 IPv4 位址嘗試資料庫連線。 仍需要驗證。 使用一台專門用於該練習的新伺服器和資源群組,完成後續防火牆限制,完成後刪除練習資源。 這個初始網路設定並非正式執行環境的建議設定。

建立 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

此 --public-access All 選項啟用公共端點,並建立本模組後續使用的單一所有位址防火牆規則。 後者的 Azure 服務例外仍使用該公開端點,並允許來自 Azure 資源 (包括其他客戶的訂用帳戶) 的連線嘗試。 這不是私有存取或僅限應用程式的存取。

伺服器建立成功後,明確地建立應用程式資料庫:

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

在啟動應用程式前,請確認資料庫是否存在:

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

回傳的名稱必須與 AZ_POSTGRES_DB_NAME 的值相符。 這些資料庫命令對伺服器使用--server-name,對資料庫使用--name。

設定 Quarkus 以存取 PostgreSQL 資料庫

取得伺服器的完整限定網域名稱(FQDN),並建立一個不含認證資訊的 JDBC URL:

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"

此網址使用 sslmode=require 來要求加密傳輸。 使用者名稱和密碼會透過資料來源屬性分別提供,因此像密碼中的字元 & 不會被解析為網址參數。 不要列印或追蹤憑證值。

加密不是憑證身份驗證。 sslmode=require 不驗證伺服器憑證和主機名稱。 如果你需要該驗證,請遵循 pgJDBC verify-full 指引和 Azure 憑證信任指示,包括受信任根設定。 僅僅改變模式而不設定信任,並不是一個完整的憑證驗證程序。

設定 Quarkus 應用程式以連線到 PostgreSQL 資料庫

在 src/main/resources/application.properties中,將現有未設定檔的資料來源 URL 與結構產生條目替換為以下四行。 也要移除所有未設定設定檔的資料來源用戶名或密碼條目。 在檔案中保持 ${...} 表達式的字面內容;不要用憑證值取代它們。 保持不相關設定不變。

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

這些設定適用於 dev 和 prod 設定檔,不適用於自動化測試。 開發模式會為此單元使用 Azure 資料庫,部署的應用程式則在生產模式中使用 Azure 資料庫。 測試則使用獨立的 PostgreSQL 開發服務。 測試或打包應用程式時,請保持 Docker 運行。 Maven package 生命週期執行測試;它不得將測試記錄加入 Azure 資料庫。

請勿匯出未套用設定檔的QUARKUS_DATASOURCE_*覆寫。 如果你之前在這個 shell 裡設定過任何相關變數,請在測試或封裝前移除它們,因為它們會使這種區隔失效。 AZ_變數僅由設定檔範圍運算式解析。 欲了解更多資訊,請參閱 Quarkus 3.18.4 配置參考。

在本機執行 Quarkus 應用程式以測試遠端資料庫連線

程序在 啟動時會繼承環境變數。 匯出 AZ_POSTGRES_* 到另一個終端機並不會更新已執行的 Quarkus 程序,單靠編輯 application.properties 也不足以完成這個轉換。

如有需要,請在其終端機中按下 Ctrl+C 以停止先前的開發程序。 在 Bash shell 中,從包含已匯出資源與資料庫變數的 todo 目錄啟動應用程式:

./mvnw clean quarkus:dev

當 Quarkus 正在運行時,請在第二個本地 Bash 終端機中使用以下 cURL 指令建立幾個待辦事項。 讓擁有變數的 Shell 繼續執行 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

接下來,藉由存取 to-do 應用程式中定義的 GET 端點,檢查 to-dos 是否位於資料庫中:

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

回應應該包含你提交的描述,類似以下輸出。 識別碼、時間戳和順序可能有所不同,重複 POST 會產生另一個項目。

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

如果回應包含你所建立的項目,表示你已成功執行 Quarkus 應用程式並連接到遠端的 PostgreSQL 資料庫。

在繼續進行下一單元的封裝前,回到執行 Quarkus 的終端機,按下 Ctrl+C。 在 todo 目錄中保持 Bash shell 開啟,所有已匯出的變數都保持完整。 不要重跑隨機名稱和密碼區塊;用這個 shell 來打包和部署。