教學課程:使用受控識別,在無祕密的情況下,從 JAVA Tomcat App Service 連線至 PostgreSQL 資料庫
Azure App Service可在 Azure 中提供可高度擴充、自我修復的 Web 主控服務。 它也為您的應用程式提供受控識別,這是用於保護適用於 PostgreSQL 的 Azure 資料庫和其他 Azure 服務存取權的周全解決方案。 App Service 中的受控識別可藉由從應用程式刪除祕密 (例如環境變數中的認證),讓應用程式更加安全。 在本教學課程中,您會了解如何:
- 建立 PostgreSQL 資料庫。
- 使用 WAR 封裝,將範例應用程式部署至 Tomcat 上的Azure App Service。
- 設定 TomcatWeb 應用程式,以將 Microsoft Entra 驗證與 PostgreSQL 資料庫搭配使用。
- 使用服務連接器,透過受控識別連線至 PostgreSQL 資料庫。
如果您沒有 Azure 訂閱,請在開始之前,先建立 Azure 免費帳戶。
必要條件
複製應用程式範例,並準備存放庫
在您的終端機中執行下列命令,即可複製範例存放庫並設定範例應用程式環境。
git clone https://github.com/Azure-Samples/Passwordless-Connections-for-Java-Apps
cd Passwordless-Connections-for-Java-Apps/Tomcat/
建立適用於 PostgreSQL 的 Azure 資料庫
請遵循下列步驟,在訂用帳戶中建立適用於 Postgres 的 Azure 資料庫。 Tomcat 清單應用程式會連線到此資料庫,並在執行時儲存其資料,讓您無論在哪執行應用程式,皆可保存應用程式狀態。
登入 Azure CLI,並選擇性地設定您的訂用帳戶 (如果您有多個與登入認證連線的訂用帳戶)。
az login az account set --subscription <subscription-ID>
建立 Azure 資源群組,並記下 Azure 資源群組名稱。
export RESOURCE_GROUP=<resource-group-name> export LOCATION=eastus az group create --name $RESOURCE_GROUP --location $LOCATION
建立適用於 PostgreSQL 的 Azure 資料庫伺服器。 建立伺服器時有一個系統管理員帳戶,但未使用,因為我們將使用 Microsoft Entra 系統管理員帳戶來執行管理工作。
export POSTGRESQL_ADMIN_USER=azureuser # PostgreSQL admin access rights won't be used because Azure AD authentication is leveraged to administer the database. export POSTGRESQL_ADMIN_PASSWORD=<admin-password> export POSTGRESQL_HOST=<postgresql-host-name> # Create a PostgreSQL server. az postgres flexible-server create \ --resource-group $RESOURCE_GROUP \ --name $POSTGRESQL_HOST \ --location $LOCATION \ --admin-user $POSTGRESQL_ADMIN_USER \ --admin-password $POSTGRESQL_ADMIN_PASSWORD \ --public-access 0.0.0.0 \ --sku-name Standard_D2s_v3
為應用程式建立資料庫。
export DATABASE_NAME=checklist az postgres flexible-server db create \ --resource-group $RESOURCE_GROUP \ --server-name $POSTGRESQL_HOST \ --database-name $DATABASE_NAME
將應用程式部署至 App Service
請遵循下列步驟來建置 WAR 檔案,並使用 WAR 封裝,部署至 Tomcat 上的 Azure App Service。
範例應用程式包含可產生 WAR 檔案的 pom.xml 檔案。 執行下列命令以建置應用程式。
mvn clean package -f pom.xml
使用 Tomcat 9.0 在 Linux 上建立 Azure App Service 資源。
export APPSERVICE_PLAN=<app-service-plan> export APPSERVICE_NAME=<app-service-name> # Create an App Service plan az appservice plan create \ --resource-group $RESOURCE_GROUP \ --name $APPSERVICE_PLAN \ --location $LOCATION \ --sku B1 \ --is-linux # Create an App Service resource. az webapp create \ --resource-group $RESOURCE_GROUP \ --name $APPSERVICE_NAME \ --plan $APPSERVICE_PLAN \ --runtime "TOMCAT:10.0-java11"
將 WAR 套件部署至 App Service。
az webapp deploy \ --resource-group $RESOURCE_GROUP \ --name $APPSERVICE_NAME \ --src-path target/app.war \ --type war
使用身分識別連線來連線 Postgres 資料庫
接下來,使用服務連接器連接資料庫。
安裝 Azure CLI 的服務連接器 無密碼擴充功能:
az extension add --name serviceconnector-passwordless --upgrade
然後,使用服務連接器,將您的應用程式連線到具有系統指派受控識別的 Postgres 資料庫。
若要建立此連線,請執行 az webapp connection create 命令。
az webapp connection create postgres-flexible \
--resource-group $RESOURCE_GROUP \
--name $APPSERVICE_NAME \
--target-resource-group $RESOURCE_GROUP \
--server $POSTGRESQL_HOST \
--database $DATABASE_NAME \
--system-identity \
--client-type java
此命令會建立 Web 應用程式和 PostgreSQL 伺服器之間的連線,並透過系統指派的受控識別來管理驗證。
接下來,更新應用程式設定並在連接字串中新增外掛程式
export AZURE_POSTGRESQL_CONNECTIONSTRING=$(\
az webapp config appsettings list \
--resource-group $RESOURCE_GROUP \
--name $APPSERVICE_NAME \
| jq -c -r '.[] \
| select ( .name == "AZURE_POSTGRESQL_CONNECTIONSTRING" ) \
| .value')
az webapp config appsettings set \
--resource-group $RESOURCE_GROUP \
--name $APPSERVICE_NAME \
--settings 'CATALINA_OPTS=-DdbUrl="'"${AZURE_POSTGRESQL_CONNECTIONSTRING}"'&authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin"'
測試範例 Web 應用程式
執行下列命令測試應用程式。
export WEBAPP_URL=$(az webapp show \
--resource-group $RESOURCE_GROUP \
--name $APPSERVICE_NAME \
--query defaultHostName \
--output tsv)
# Create a list
curl -X POST -H "Content-Type: application/json" -d '{"name": "list1","date": "2022-03-21T00:00:00","description": "Sample checklist"}' https://${WEBAPP_URL}/checklist
# Create few items on the list 1
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 1"}' https://${WEBAPP_URL}/checklist/1/item
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 2"}' https://${WEBAPP_URL}/checklist/1/item
curl -X POST -H "Content-Type: application/json" -d '{"description": "item 3"}' https://${WEBAPP_URL}/checklist/1/item
# Get all lists
curl https://${WEBAPP_URL}/checklist
# Get list 1
curl https://${WEBAPP_URL}/checklist/1
清除資源
在上述步驟中,您已建立資源群組中的 Azure 資源。 如果您在未來不需要這些資源,請在 Cloud Shell 中執行下列命令,刪除資源群組:
az group delete --name myResourceGroup
此命令可能會花一分鐘執行。
下一步
在開發人員指南中深入了解如何在 Linux 中的 App Service 上執行 Java 應用程式。
了解如何使用自訂網域和憑證保障您的應用程式。