分享方式:


教學課程:使用 Service Connector 在 Azure App 服務上使用 Postgres 建置 Django 應用程式

注意

在本教學課程中,您會使用服務連接器將 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 資料庫

  1. 設定教學課程所需的環境變數。

    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 容器內具有特定意義。

  2. (建立資源群組,您可以視需要變更名稱)。 系統會快取資源群組名稱,並自動套用至後續命令。

    az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
    
  3. 建立資料庫伺服器。 如果系統提示您啟用對目前用戶端 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 參數指定名稱的資料庫。
  4. 使用 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? 網站。

  5. 使用 az postgres flexible-server execute (部分機器翻譯) 命令建立名為 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 應用程式

  1. 在終端機中,確定您位於包含應用程式程式碼的「serviceconnector-webapp-postgresql-django-passwordless」存放庫資料夾。

  2. 執行下列 az webapp up 命令來建立應用程式的 App Service 主機:

    az webapp up \
      --resource-group $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --name $APP_SERVICE_NAME \
      --runtime PYTHON:3.9 \
      --sku B1
    

    sku 會定義 App Service 方案的大小 (CPU、記憶體) 和成本。 B1 (基本) 服務方案會在 Azure 訂閱帳戶中產生少量成本。 如需 App Service 方案的完整清單,請檢視 App Service 定價頁面。

    此命令會執行下列動作,這可能需要幾分鐘的時間,使用從前 az group create 個命令快取的資源群組和位置 (此範例中 eastus 區域的 $RESOURCE_GROUP_NAME 群組)。

    • 在基本定價層 (B1) 中建立 App Service 方案。 您可以省略 --sku 以使用預設值。
    • 建立 App Service 應用程式。
    • 啟用應用程式的預設記錄。
    • 使用已啟用建置自動化的 ZIP 部署來上傳存放庫。
  3. 將 App Service 設定為搭配使用存放庫中的 start.shaz 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 的環境變數 (若為 PostgresSQL 彈性伺服器) 中和名為 AZURE_STORAGEBLOB_RESOURCEENDPOINT 的環境變數 (若為 Azure 儲存體帳戶) 中尋找資料庫資訊。

服務連接器命令會設定 Azure 儲存體和適用於 PostgreSQL 的 Azure 資料庫資源,以使用受控識別和 Azure 角色型存取控制。 這些命令會在 App Service 中建立應用程式設定,以將 Web 應用程式連線到這些資源。 命令的輸出會列出用來啟用無密碼功能的服務連接器動作。

  1. 使用 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') 之類的陳述式,存取這些設定作為環境變數。 如需詳細資訊,請參閱存取環境變數

有問題嗎? 請先參閱疑難排解指南,或者,請告訴我們

建立儲存體帳戶並與其連線

  1. 使用 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))
    
  1. 更新儲存體帳戶來允許 Blob 公用存取權,讓「餐廳應用程式」使用者能夠存取影像。

     az storage account update  \
       --name $STORAGE_ACCOUNT_NAME \
       --allow-blob-public-access 
    
  2. 使用 az storage container create (部分機器翻譯) 命令,在儲存體帳戶中建立名為 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,即可存取這些資源。

  1. 瀏覽至位於 URL http://$APP_SERVICE_NAME.azurewebsites.net 的已部署應用程式。

    應用程式可能需要一兩分鐘的時間才能啟動。 如果您看到的預設應用程式頁面不是預設範例應用程式頁面,請等候一分鐘再重新整理瀏覽器。

  2. 藉由新增餐廳以及一些具有餐廳相片的評論,來測試範例應用程式的功能。 餐廳與評論資訊會儲存在適用於 PostgreSQL 的 Azure 資料庫中,相片則會儲存在 Azure 儲存體中。 以下是範例螢幕擷取畫面:

    範例應用程式的螢幕擷取畫面,其中顯示使用 Azure App Service、Azure PostgreSQL Database 和 Azure 儲存體的餐廳評論功能。

清除資源

如果您想要保留應用程式或繼續進行更多教學課程,請直接跳至後續步驟。 否則,若要避免產生持續費用,請刪除針對此教學課程建立的資源群組:

az group delete --name $RESOURCE_GROUP_NAME --no-wait

藉由刪除資源群組,您也會解除配置並刪除其中包含的所有資源。 使用此命令之前,請確定您不再需要群組中的資源。

刪除所有資源可能需要一些時間。 --no-wait 引數可讓命令立即傳回。

有問題嗎? 請告訴我們

後續步驟