注意
在本教學課程中,您會使用服務連接器將 Web 應用程式連線到資料庫服務。 本教學課程修改自 App Service 教學課程 (部分機器翻譯),因此您可能會發現一些相似之處。 請查看建立 Postgres 資料庫的無密碼連接器一節,以了解服務連接器能在什麼地方派上用場,並簡化 App Service 教學課程中提供的連線流程。
本教學課程說明如何將資料驅動的 Python Django Web 應用程式部署至 Azure App Service,並連線到適用於 PostgreSQL 的 Azure 資料庫彈性伺服器資料庫。
在此教學課程中,您會使用 Azure CLI 來完成下列工作:
- 使用 Python 和 Azure CLI 來設定初始環境
- 建立適用於 PostgreSQL 的 Azure 資料庫彈性伺服器資料庫
- 將程式碼部署至 Azure App Service 並連線至 PostgreSQL 彈性伺服器
- 更新您的程式碼並重新部署
- 檢視診斷記錄
- 在 Azure 入口網站中管理 Web 應用程式
設定初始環境
從 Azure 入口網站中的 Azure Cloud Shell (部分機器翻譯) 啟動,並安裝適用於 Azure CLI 的服務連接器無密碼延伸模組。
az extension add --name serviceconnector-passwordless --upgrade
複製或下載範例應用程式
複製範例存放庫:
git clone https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless.git
瀏覽到下列資料夾:
cd serviceconnector-webapp-postgresql-django-passwordless
在本教學課程中,您會將 Django (英文) Web 應用程式部署至 Azure App Service。 Web 應用程式會搭配使用系統指派的受控識別 (無密碼連線) 與 Azure 角色型存取控制來存取 Azure 儲存體 (部分機器翻譯) 和適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器 (部分機器翻譯) 資源。 此程式碼會使用 DefaultAzureCredential (部分機器翻譯) 類別的適用於 Python 的 Azure 身分識別用戶端程式庫 (部分機器翻譯)。
DefaultAzureCredential 類別會自動偵測 App Service 的受控識別是否存在,並用它來存取其他 Azure 資源。
- 實際執行設定位於 azuresite/production.py 檔案中。 開發設定位於「azuresite/settings.py」中。
- 設定了
WEBSITE_HOSTNAME環境變數時,應用程式會使用生產設定。 Azure App Service 會自動將此變數設定為 Web 應用程式的 URL,例如msdocs-django.azurewebsites.net。
實際執行設定專門用來將 Django 設定為在任何實際執行環境中執行,而不是特別針對 App Service。 如需詳細資訊,請參閱 Django 部署檢查清單 \(英文\)。 另請參閱 Azure 上的 Django 適用的生產設定,以取得某些變更的詳細資料。
有問題嗎? 請告訴我們。
在 Azure 中建立 Postgres 資料庫
設定教學課程所需的環境變數。
LOCATION="eastus" RAND_ID=$RANDOM RESOURCE_GROUP_NAME="msdocs-mi-web-app" APP_SERVICE_NAME="msdocs-mi-web-$RAND_ID" DB_SERVER_NAME="msdocs-mi-postgres-$RAND_ID" ADMIN_USER="demoadmin" ADMIN_PW="{your database password}"重要
ADMIN_PW必須包含 8 到 128 個字元,且來自下列類別的其中三個類別:英文大寫字母、英文小寫字母、數字及非英數字元。 建立使用者名稱或密碼時不會使用$字元。 稍後您會使用這些值來建立環境變數,其中$字元在用來執行 Python 應用程式的 Linux 容器內具有特定意義。(建立資源群組,您可以視需要變更名稱)。 系統會快取資源群組名稱,並自動套用至後續命令。
az group create --name $RESOURCE_GROUP_NAME --location $LOCATION建立資料庫伺服器。 如果系統提示您啟用對目前用戶端 IP 位址的存取,請輸入
y來代表「是」。 此流程需要幾分鐘的時間:az postgres flexible-server create \ --resource-group $RESOURCE_GROUP_NAME \ --name $DB_SERVER_NAME \ --location $LOCATION \ --admin-user $ADMIN_USER \ --admin-password $ADMIN_PW \ --sku-name Standard_D2ds_v4 --active-directory-auth Enabled如果無法辨識
az命令,請確定您已安裝 Azure CLI,如設定初始環境所說明。az postgres flexible-server create 命令會執行下列動作,這需要幾分鐘的時間:
- 如果沒有快取的名稱,請建立預設資源群組。
- 建立 PostgreSQL 彈性伺服器:
- 使用以
--name參數指定的伺服器名稱。 此名稱在整個 Azure 中必須是唯一的。 - 使用以
--sku-name參數指定的 SKU。
- 使用以
- 使用以
--admin-user和--admin-password參數指定的使用者名稱和密碼,建立系統管理員帳戶。 - 建立以
--database-name參數指定名稱的資料庫。
使用 az postgres flexible-server firewall-rule create (部分機器翻譯) 命令,在您的伺服器上設定防火牆規則。 此規則可讓您的本機環境存取伺服器。 (如果在上一個步驟中,系統提示您啟用來自用戶端 IP 位址的存取,您可以略過此步驟。)
IP_ADDRESS=<your IP> az postgres flexible-server firewall-rule create \ --resource-group $RESOURCE_GROUP_NAME \ --name $DB_SERVER_NAME \ --rule-name AllowMyIP \ --start-ip-address $IP_ADDRESS \ --end-ip-address $IP_ADDRESS使用任何顯示 IP 位址的工具或網站,來取代命令中的
<your IP>。 例如,您可以使用 What's My IP Address? 網站。使用
restaurant(部分機器翻譯) 命令建立名為 的資料庫。az postgres flexible-server execute \ --name $DB_SERVER_NAME \ --admin-user $ADMIN_USER \ --admin-password $ADMIN_PW \ --database-name postgres \ --querytext 'create database restaurant;'
將程式碼部署到 Azure App Service
在此節中,您會在 App Service 應用程式中建立應用程式主機、將此應用程式連線到 Postgres 資料庫,然後將程式碼部署到該主機。
建立 App Service 應用程式
在終端機中,確定您位於包含應用程式程式碼的「serviceconnector-webapp-postgresql-django-passwordless」存放庫資料夾。
執行下列
az webapp up命令來建立應用程式的 App Service 主機:az webapp up \ --resource-group $RESOURCE_GROUP_NAME \ --location $LOCATION \ --name $APP_SERVICE_NAME \ --runtime PYTHON:3.9 \ --sku B1sku 會定義 App Service 方案的大小 (CPU、記憶體) 和成本。 B1 (基本) 服務方案會在 Azure 訂閱帳戶中產生少量成本。 如需 App Service 方案的完整清單,請檢視 App Service 定價頁面。
此命令會執行下列動作,這可能需要幾分鐘的時間,使用從前
az group create個命令快取的資源群組和位置 (此範例中$RESOURCE_GROUP_NAME區域的eastus群組)。- 在基本定價層 (B1) 中建立 App Service 方案。 您可以省略
--sku以使用預設值。 - 建立 App Service 應用程式。
- 啟用應用程式的預設記錄。
- 使用已啟用建置自動化的 ZIP 部署來上傳存放庫。
- 在基本定價層 (B1) 中建立 App Service 方案。 您可以省略
將 App Service 設定為搭配使用存放庫中的 start.sh 與 az webapp config set (部分機器翻譯) 命令。
az webapp config set \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --startup-file "start.sh"
建立 Postgres 資料庫的無密碼連接器
現在已將程式碼部署到 App Service,下一個步驟是將應用程式連線到 Azure 中的 Postgres 資料庫。 應用程式程式代碼預期會在名為 AZURE_POSTGRESQL_CONNECTIONSTRING PostgreSQL 彈性伺服器的環境變數中尋找資料庫資訊,以及針對 Azure 記憶體帳戶命名的 AZURE_STORAGEBLOB_RESOURCEENDPOINT 環境變數。
服務連接器命令會設定 Azure 儲存體和適用於 PostgreSQL 的 Azure 資料庫資源,以使用受控識別和 Azure 角色型存取控制。 這些命令會在 App Service 中建立應用程式設定,以將 Web 應用程式連線到這些資源。 命令的輸出會列出用來啟用無密碼功能的服務連接器動作。
使用 az webapp connection create postgres-flexible (部分機器翻譯) 命令新增 PostgreSQL 服務連接器。 系統指派的受控識別可用來向目標資源 (在此案例中為 PostgreSQL) 驗證 Web 應用程式。
az webapp connection create postgres-flexible \
--resource-group $RESOURCE_GROUP_NAME \
--name $APP_SERVICE_NAME \
--target-resource-group $RESOURCE_GROUP_NAME \
--server $DB_SERVER_NAME \
--database restaurant \
--client-type python \
--system-identity
注意
如果您看到「未註冊訂用帳戶,無法使用 Microsoft.ServiceLinker」錯誤訊息,請執行 az provider register -n Microsoft.ServiceLinker 以註冊服務連接器資源提供者,然後再次執行連線命令。
在您的 Python 程式碼中,您可以使用 os.environ.get('AZURE_POSTGRESQL_HOST') 之類的陳述式,存取這些設定作為環境變數。 如需詳細資訊,請參閱存取環境變數。
建立儲存體帳戶並與其連線
- 使用 az webapp connection create storage-blob 命令來建立儲存體帳戶,並建立會執行下列設定的服務連接器:
在 Web 應用程式上啟用系統指派的受控識別
將具有「儲存體 Blob 資料參與者」角色的 Web 應用程式新增至新建立的儲存體帳戶。
設定儲存體帳戶網路以接受來自 Web 應用程式的存取。
STORAGE_ACCOUNT_URL=$(az webapp connection create storage-blob \ --new true \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --target-resource-group $RESOURCE_GROUP_NAME \ --client-type python \ --system-identity \ --query configurations[].value \ --output tsv) STORAGE_ACCOUNT_NAME=$(cut -d . -f1 <<< $(cut -d / -f3 <<< $STORAGE_ACCOUNT_URL))
更新儲存體帳戶來允許 Blob 公用存取權,讓「餐廳應用程式」使用者能夠存取影像。
az storage account update \ --name $STORAGE_ACCOUNT_NAME \ --allow-blob-public-access使用
photos(部分機器翻譯) 命令,在儲存體帳戶中建立名為 的容器。 允許對新建容器中 Blob 的匿名讀取 (公用) 存取權。# Set the BLOB_ENDPOINT variable BLOB_ENDPOINT=$(az storage account show --name $STORAGE_ACCOUNT_NAME --query "primaryEndpoints.blob" | sed 's/"//g') echo $BLOB_ENDPOINT # Create the storage container using the BLOB_ENDPOINT variable az storage container create \ --account-name $STORAGE_ACCOUNT_NAME \ --name photos \ --public-access blob \ --auth-mode login \ --blob-endpoint $BLOB_ENDPOINT
在 Azure 中測試 Python Web 應用程式
範例 Python 應用程式會使用 azure.identity (英文) 套件及其 DefaultAzureCredential 類別。 當應用程式在 Azure 中執行時,DefaultAzureCredential 會自動偵測 App Service 的受控識別是否有存在,如果存在,則用它來存取其他 Azure 資源 (在此案例中為儲存體和 PostgreSQL)。 不需要提供儲存體金鑰、憑證或認證給 App Service,即可存取這些資源。
瀏覽至位於 URL
http://$APP_SERVICE_NAME.azurewebsites.net的已部署應用程式。應用程式可能需要一兩分鐘的時間才能啟動。 如果您看到的預設應用程式頁面不是預設範例應用程式頁面,請等候一分鐘再重新整理瀏覽器。
藉由新增餐廳以及一些具有餐廳相片的評論,來測試範例應用程式的功能。 餐廳與評論資訊會儲存在適用於 PostgreSQL 的 Azure 資料庫中,相片則會儲存在 Azure 儲存體中。 以下是範例螢幕擷取畫面:
清除資源
如果您想要保留應用程式或繼續進行更多教學課程,請直接跳至後續步驟。 否則,若要避免產生持續費用,請刪除針對此教學課程建立的資源群組:
az group delete --name $RESOURCE_GROUP_NAME --no-wait
藉由刪除資源群組,您也會解除配置並刪除其中包含的所有資源。 使用此命令之前,請確定您不再需要群組中的資源。
刪除所有資源可能需要一些時間。
--no-wait 引數可讓命令立即傳回。
有問題嗎? 請告訴我們。