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.
Sklonuj przykład.
git clone https://github.com/Azure-Samples/msdocs-django-web-app-managed-identity.git
Przejdź do folderu aplikacji.
cd msdocs-django-web-app-managed-identity
Sprawdzanie kodu uwierzytelniania
Przykładowa aplikacja internetowa musi uwierzytelniać się w dwóch różnych magazynach danych:
- Serwer usługi Azure Blob Storage, na którym przechowuje i pobiera zdjęcia przesłane przez recenzentów.
- Baza danych usługi Azure Database for PostgreSQL — serwer elastyczny, w której przechowuje restauracje i recenzje.
Używa ona wartości DefaultAzureCredential do uwierzytelniania w obu magazynach danych. Za pomocą DefaultAzureCredential
polecenia aplikację można skonfigurować tak, aby była uruchamiana w ramach tożsamości różnych jednostek usługi, w zależności od środowiska, w którym działa, bez wprowadzania zmian w kodzie. Na przykład w lokalnym środowisku projektowym aplikacja może działać w ramach tożsamości dewelopera zalogowanego do interfejsu wiersza polecenia platformy Azure, podczas gdy na platformie Azure, podobnie jak w tym samouczku, może działać w ramach tożsamości zarządzanej przypisanej przez użytkownika.
W obu przypadkach podmiot zabezpieczeń, w ramach którego działa aplikacja, musi mieć rolę w każdym zasobie platformy Azure używanym przez aplikację, która umożliwia jej wykonywanie akcji na zasobie wymaganym przez aplikację. W tym samouczku użyjesz poleceń interfejsu wiersza polecenia platformy Azure, aby utworzyć tożsamość zarządzaną przypisaną przez użytkownika i przypisać ją do aplikacji na platformie Azure. Następnie ręcznie przypiszesz odpowiednie role tożsamości na koncie usługi Azure Storage i serwerze usługi Azure Database for PostgreSQL. Na koniec należy ustawić zmienną AZURE_CLIENT_ID
środowiskową dla aplikacji na platformie Azure, aby skonfigurować DefaultAzureCredential
używanie tożsamości zarządzanej.
Po skonfigurowaniu tożsamości zarządzanej przypisanej przez użytkownika w aplikacji i jej środowisku uruchomieniowym i przypisaniu odpowiednich ról w magazynach danych można użyć DefaultAzureCredential
do uwierzytelniania przy użyciu wymaganych zasobów platformy Azure.
Poniższy kod służy do tworzenia klienta magazynu obiektów blob w celu przekazania zdjęć w programie ./restaurant_review/views.py
. Wystąpienie DefaultAzureCredential
programu jest dostarczane do klienta, którego używa do uzyskiwania tokenów dostępu do wykonywania operacji w usłudze Azure Storage.
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
azure_credential = DefaultAzureCredential()
blob_service_client = BlobServiceClient(
account_url=account_url,
credential=azure_credential)
DefaultAzureCredential
Wystąpienie klasy jest również używane do uzyskiwania tokenu dostępu dla usługi Azure Database for PostgreSQL w systemie ./azureproject/get_conn.py
. W takim przypadku token jest uzyskiwany bezpośrednio przez wywołanie get_token w wystąpieniu poświadczeń i przekazanie jej odpowiedniej scope
wartości. Token jest następnie używany do ustawiania hasła w identyfikatorze URI połączenia PostgreSQL.
azure_credential = DefaultAzureCredential()
token = azure_credential.get_token("https://ossrdbms-aad.database.windows.net")
conf.settings.DATABASES['default']['PASSWORD'] = token.token
Aby dowiedzieć się więcej na temat uwierzytelniania aplikacji za pomocą usług platformy Azure, zobacz Uwierzytelnianie aplikacji języka Python w usługach platformy Azure przy użyciu zestawu Azure SDK dla języka Python. Aby dowiedzieć się więcej na temat DefaultAzureCredential
programu , w tym sposobu dostosowywania łańcucha poświadczeń, który ocenia dla danego środowiska, zobacz Omówienie domyślneAzureCredential.
Tworzenie serwera elastycznego usługi Azure PostgreSQL
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.Utwórz grupę zasobów za pomocą polecenia az group create.
az group create --location $LOCATION --name $RESOURCE_GROUP_NAME
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
.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
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? ).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.
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.
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.
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
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.
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
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
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
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 AZURE_CLIENT_ID
środowiskowej ustawionej jako ustawienie aplikacji.
Jeśli zmienna AZURE_CLIENT_ID
środowiskowa nie istnieje, tożsamość zarządzana przypisana przez system jest używana, jeśli jest 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.
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.
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 w regułach zapory zezwoliliśmy na dostęp do twojego adresu IP. 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.
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ę.
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:
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.