Tworzenie i wdrażanie aplikacji internetowej Django na platformie Azure przy użyciu tożsamości zarządzanej przypisanej przez użytkownika

W tym samouczku wdrożysz aplikację internetową Django w usłudze aplikacja systemu Azure Service. Aplikacja internetowa używa przypisanej przez użytkownika tożsamości zarządzanej (połączeń bez hasła) z kontrolą dostępu opartą na rolach platformy Azure w celu uzyskania dostępu do zasobów usług Azure Storage i Azure Database for PostgreSQL — serwer elastyczny . Kod używa klasy DefaultAzureCredential biblioteki klienta tożsamości platformy Azure dla języka Python. Klasa DefaultAzureCredential automatycznie wykrywa, że istnieje tożsamość zarządzana dla usługi App Service i używa jej do uzyskiwania dostępu do innych zasobów platformy Azure.

W tym samouczku utworzysz tożsamość zarządzaną przypisaną przez użytkownika i przypiszesz ją do usługi App Service, aby mogła uzyskiwać dostęp do zasobów bazy danych i konta magazynu. Aby zapoznać się z przykładem użycia tożsamości zarządzanej przypisanej przez system, zobacz Tworzenie i wdrażanie aplikacji internetowej platformy Flask Python na platformie Azure przy użyciu tożsamości zarządzanej przypisanej przez system. Zalecane są tożsamości zarządzane przypisane przez użytkownika, ponieważ mogą być używane przez wiele zasobów, a ich cykle życia są oddzielone od cykli życia zasobów, z którymi są skojarzone. Aby uzyskać więcej informacji na temat najlepszych rozwiązań dotyczących używania tożsamości zarządzanych, zobacz Zalecenia dotyczące najlepszych rozwiązań dotyczących tożsamości zarządzanych.

W tym samouczku pokazano, jak wdrożyć aplikację internetową w języku Python i utworzyć zasoby platformy Azure przy użyciu interfejsu wiersza polecenia platformy Azure. Polecenia w tym samouczku są zapisywane do uruchamiania w powłoce powłoki Bash. Możesz uruchomić polecenia samouczka w dowolnym środowisku powłoki Bash z zainstalowanym interfejsem wiersza polecenia, takim jak środowisko lokalne lub usługa Azure Cloud Shell. W przypadku niektórych modyfikacji — na przykład ustawiania i używania zmiennych środowiskowych — można uruchamiać te polecenia w innych środowiskach, takich jak powłoka poleceń systemu Windows.

Pobieranie przykładowej aplikacji

Skorzystaj z przykładowej przykładowej aplikacji Django, aby wykonać czynności opisane w tym samouczku. Pobierz lub sklonuj przykładową aplikację do środowiska deweloperskiego.

  1. Sklonuj przykład.

    git clone https://github.com/Azure-Samples/msdocs-django-web-app-managed-identity.git
    
  2. Przejdź do folderu aplikacji.

    cd msdocs-django-web-app-managed-identity
    

Tworzenie serwera elastycznego usługi Azure PostgreSQL

  1. Skonfiguruj zmienne środowiskowe potrzebne do tego samouczka.

    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="ChAnG33#ThsPssWD$RAND_ID"
    UA_NAME="UAManagedIdentityPythonTest$RAND_ID"
    

    Ważne

    Musi ADMIN_PW zawierać od 8 do 128 znaków z trzech z następujących kategorii: wielkie litery angielskie, małe litery angielskie, cyfry i znaki niefanumeryczne. Podczas tworzenia nazw użytkowników lub haseł nie należy używać $ znaku . Później utworzysz zmienne środowiskowe z tymi wartościami, w których $ znak ma specjalne znaczenie w kontenerze systemu Linux używanym do uruchamiania aplikacji języka Python.

  2. Utwórz grupę zasobów za pomocą polecenia az group create.

    az group create --location $LOCATION --name $RESOURCE_GROUP_NAME
    
  3. Utwórz serwer elastyczny PostgreSQL za pomocą polecenia az postgres flexible-server create . (To i kolejne polecenia używają znaku kontynuacji wiersza dla powłoki Bash ('\'). Zmień znak kontynuacji wiersza dla innych powłok).

    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 \
      --public-access 0.0.0.0
    

    Nazwa sku to nazwa warstwy cenowej i konfiguracji obliczeniowej. Aby uzyskać więcej informacji, zobacz Cennik usługi Azure Database for PostgreSQL. Aby wyświetlić listę dostępnych jednostek SKU, użyj polecenia az postgres flexible-server list-skus --location $LOCATION.

  4. Dodaj konto platformy Azure jako administrator usługi Microsoft Entra dla serwera za pomocą polecenia az postgres flexible-server ad-admin create .

    ACCOUNT_EMAIL=$(az ad signed-in-user show --query userPrincipalName --output tsv)
    ACCOUNT_ID=$(az ad signed-in-user show --query id --output tsv)
    echo $ACCOUNT_EMAIL, $ACCOUNT_ID
    az postgres flexible-server ad-admin create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server-name $DB_SERVER_NAME \
      --display-name $ACCOUNT_EMAIL \
      --object-id $ACCOUNT_ID \
      --type User
    
  5. Skonfiguruj regułę zapory na serwerze za pomocą polecenia az postgres flexible-server firewall-rule create . Ta reguła umożliwia dostęp do środowiska lokalnego w celu nawiązania połączenia z serwerem. (Jeśli używasz usługi Azure Cloud Shell, możesz pominąć ten krok).

    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
    

    Użyj dowolnego narzędzia lub witryny internetowej, które wyświetla adres IP, aby zastąpić <your IP> polecenie . Na przykład możesz użyć witryny internetowej What's My IP Address? (Co to jest mój adres IP? ).

  6. Utwórz bazę danych o nazwie restaurant przy użyciu polecenia az postgres flexible-server execute .

    az postgres flexible-server execute \
      --name $DB_SERVER_NAME \
      --admin-user $ADMIN_USER \
      --admin-password $ADMIN_PW \
      --database-name postgres \
      --querytext 'create database restaurant;'
    

Tworzenie usługi aplikacja systemu Azure i wdrażanie kodu

Uruchom te polecenia w folderze głównym przykładowej aplikacji, aby utworzyć usługę App Service i wdrożyć w niej kod.

  1. Utwórz usługę app service przy użyciu polecenia az webapp up .

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

    Jednostka SKU definiuje rozmiar (procesor, pamięć) i koszt planu usługi App Service. Plan usługi B1 (wersja podstawowa) wiąże się z niewielkim kosztem w ramach subskrypcji platformy Azure. Aby uzyskać pełną listę planów usługi App Service, wyświetl stronę cennika usługi App Service.

  2. Skonfiguruj usługę App Service do używania start.sh w repozytorium przykładowym za pomocą polecenia az webapp config set .

    az webapp config set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --startup-file "start.sh"
    

Tworzenie konta magazynu i kontenera

Przykładowa aplikacja przechowuje zdjęcia przesłane przez recenzentów jako obiekty blob w usłudze Azure Storage.

  • Gdy użytkownik prześle zdjęcie ze swoim przeglądem, przykładowa aplikacja zapisuje obraz w kontenerze przy użyciu tożsamości zarządzanej i DefaultAzureCredential uzyskuje dostęp do konta magazynu.

  • Gdy użytkownik wyświetla recenzje restauracji, aplikacja zwraca link do zdjęcia w magazynie obiektów blob dla każdej recenzji, która ma ją skojarzona. Aby przeglądarka wyświetlała zdjęcie, musi mieć dostęp do niego na koncie magazynu. Dane obiektu blob muszą być dostępne do odczytu publicznie za pośrednictwem dostępu anonimowego (nieuwierzytelnionego).

W tej sekcji utworzysz konto magazynu i kontener, które zezwala na publiczny dostęp do odczytu do obiektów blob w kontenerze. W kolejnych sekcjach utworzysz tożsamość zarządzaną przypisaną przez użytkownika i skonfigurujesz ją do zapisywania obiektów blob na koncie magazynu.

  1. Użyj polecenia az storage create, aby utworzyć konto magazynu.

    STORAGE_ACCOUNT_NAME="msdocsstorage$RAND_ID"
    az storage account create \
      --name $STORAGE_ACCOUNT_NAME \
      --resource-group $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --sku Standard_LRS \
      --allow-blob-public-access true
    
  2. Utwórz kontener o nazwie photos na koncie magazynu za pomocą polecenia az storage container create .

    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --auth-mode login
    

    Uwaga

    Jeśli na przykład polecenie zakończy się niepowodzeniem, jeśli zostanie wyświetlony błąd wskazujący, że żądanie może zostać zablokowane przez reguły sieciowe konta magazynu, wprowadź następujące polecenie, aby upewnić się, że twoje konto użytkownika platformy Azure ma przypisaną rolę platformy Azure z uprawnieniami do tworzenia kontenera.

    az role assignment create --role "Storage Blob Data Contributor" --assignee $ACCOUNT_EMAIL --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Storage/storageAccounts/$STORAGE_ACCOUNT_NAME"
    

    Aby uzyskać więcej informacji, zobacz Szybki start: tworzenie, pobieranie i wyświetlanie listy obiektów blob za pomocą interfejsu wiersza polecenia platformy Azure. Należy pamiętać, że kilka ról platformy Azure umożliwia tworzenie kontenerów na koncie magazynu, w tym "Właściciel", "Współautor", "Właściciel danych obiektu blob usługi Storage" i "Współautor danych obiektu blob usługi Storage".

Tworzenie tożsamości zarządzanej przypisanej przez użytkownika

Utwórz tożsamość zarządzaną przypisaną przez użytkownika i przypisz ją do usługi App Service. Tożsamość zarządzana służy do uzyskiwania dostępu do bazy danych i konta magazynu.

  1. Użyj polecenia az identity create, aby utworzyć tożsamość zarządzaną przypisaną przez użytkownika i wyprowadź identyfikator klienta do zmiennej do późniejszego użycia.

    UA_CLIENT_ID=$(az identity create --name $UA_NAME --resource-group $RESOURCE_GROUP_NAME --query clientId --output tsv)
    echo $UA_CLIENT_ID
    
  2. Użyj polecenia az account show, aby uzyskać identyfikator subskrypcji i wyświetlić go w zmiennej, która może służyć do konstruowania identyfikatora zasobu tożsamości zarządzanej.

    SUBSCRIPTION_ID=$(az account show --query id --output tsv)
    RESOURCE_ID="/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$UA_NAME"
    echo $RESOURCE_ID
    
  3. Przypisz tożsamość zarządzaną do usługi App Service za pomocą polecenia az webapp identity assign .

    export MSYS_NO_PATHCONV=1
    az webapp identity assign \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $APP_SERVICE_NAME \
        --identities $RESOURCE_ID
    
  4. Utwórz ustawienia aplikacji usługi App Service zawierające identyfikator klienta tożsamości zarządzanej i inne informacje o konfiguracji za pomocą polecenia az webapp config appsettings set .

    az webapp config appsettings set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --settings AZURE_CLIENT_ID=$UA_CLIENT_ID \
        STORAGE_ACCOUNT_NAME=$STORAGE_ACCOUNT_NAME \
        STORAGE_CONTAINER_NAME=photos \
        DBHOST=$DB_SERVER_NAME \
        DBNAME=restaurant \
        DBUSER=$UA_NAME
    

Przykładowa aplikacja używa zmiennych środowiskowych (ustawień aplikacji) do definiowania informacji o połączeniu dla bazy danych i konta magazynu, ale te zmienne nie zawierają haseł. Zamiast tego uwierzytelnianie odbywa się bez hasła za pomocą polecenia DefaultAzureCredential.

Przykładowy kod aplikacji używa konstruktora DefaultAzureCredential klasy bez przekazywania identyfikatora klienta tożsamości zarządzanej przypisanej przez użytkownika do konstruktora. W tym scenariuszu rezerwowym jest sprawdzenie zmiennej środowiskowej AZURE_CLIENT_ID ustawionej jako ustawienie aplikacji.

Jeśli zmienna środowiskowa AZURE_CLIENT_ID nie istnieje, tożsamość zarządzana przypisana przez system zostanie użyta, jeśli została skonfigurowana. Aby uzyskać więcej informacji, zobacz Wprowadzenie do ustawień domyślnychAzureCredential.

Tworzenie ról dla tożsamości zarządzanej

W tej sekcji utworzysz przypisania ról dla tożsamości zarządzanej, aby umożliwić dostęp do konta magazynu i bazy danych.

  1. Utwórz przypisanie roli dla tożsamości zarządzanej, aby umożliwić dostęp do konta magazynu za pomocą polecenia az role assignment create .

    export MSYS_NO_PATHCONV=1
    az role assignment create \
    --assignee $UA_CLIENT_ID \
    --role "Storage Blob Data Contributor" \
    --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCE_GROUP_NAME"
    

    Polecenie określa zakres przypisania roli do grupy zasobów. Aby uzyskać więcej informacji, zobacz Omówienie przypisań ról.

  2. Użyj polecenia az postgres flexible-server execute, aby nawiązać połączenie z bazą danych Postgres i uruchomić te same polecenia, aby przypisać role do tożsamości zarządzanej.

    ACCOUNT_EMAIL_TOKEN=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken)
    az postgres flexible-server execute \
      --name $DB_SERVER_NAME \
      --admin-user $ACCOUNT_EMAIL \
      --admin-password $ACCOUNT_EMAIL_TOKEN \
      --database-name postgres \
      --querytext "select * from pgaadauth_create_principal('"$UA_NAME"', false, false);select * from pgaadauth_list_principals(false);"
    

    Jeśli masz problemy z uruchomieniem polecenia, upewnij się, że dodano konto użytkownika jako administrator firmy Microsoft dla serwera PosgreSQL i że masz dozwolony dostęp do adresu IP w regułach zapory. Aby uzyskać więcej informacji, zobacz sekcję Tworzenie serwera elastycznego usługi Azure PostgreSQL.

Testowanie aplikacji internetowej w języku Python na platformie Azure

Przykładowa aplikacja w języku Python używa pakietu azure.identity i jej DefaultAzureCredential klasy. Gdy aplikacja jest uruchomiona na platformie Azure, automatycznie wykrywa, DefaultAzureCredential czy istnieje tożsamość zarządzana dla usługi App Service, a jeśli tak, używa jej do uzyskiwania dostępu do innych zasobów platformy Azure (w tym przypadku magazynu i bazy danych PostgreSQL). Nie ma potrzeby udostępniania kluczy magazynu, certyfikatów ani poświadczeń usłudze App Service w celu uzyskania dostępu do tych zasobów.

  1. Przejdź do wdrożonej aplikacji pod adresem URL http://$APP_SERVICE_NAME.azurewebsites.net.

    Uruchomienie aplikacji może potrwać minutę lub dwie. Jeśli zostanie wyświetlona domyślna strona aplikacji, która nie jest domyślną stroną przykładowej aplikacji, zaczekaj minutę i odśwież przeglądarkę.

  2. Przetestuj funkcjonalność przykładowej aplikacji, dodając restaurację i kilka recenzji ze zdjęciami dla restauracji.

    Restauracja i przegląd informacji są przechowywane w usłudze Azure Database for PostgreSQL, a zdjęcia są przechowywane w usłudze Azure Storage. Oto przykładowy zrzut ekranu:

    Zrzut ekranu przedstawiający przykładową aplikację z funkcją przeglądania restauracji przy użyciu usługi aplikacja systemu Azure, bazy danych Azure PostgreSQL Database i usługi Azure Storage.

Czyszczenie

W tym samouczku wszystkie zasoby platformy Azure zostały utworzone w tej samej grupie zasobów. Usunięcie grupy zasobów powoduje usunięcie za pomocą polecenia az group delete usuwa wszystkie zasoby w grupie zasobów i jest najszybszym sposobem usunięcia wszystkich zasobów platformy Azure używanych dla aplikacji.

az group delete  --name $RESOURCE_GROUP_NAME 

Opcjonalnie możesz dodać --no-wait argument, aby zezwolić na powrót polecenia przed ukończeniem operacji.

Następne kroki