Tworzenie i wdrażanie aplikacji internetowej platformy Flask Python na platformie Azure przy użyciu tożsamości zarządzanej przypisanej przez system
W tym samouczku wdrożysz kod platformy Python Flask, aby utworzyć i wdrożyć aplikację internetową działającą w usłudze aplikacja systemu Azure Service. Aplikacja internetowa używa przypisanej przez system tożsamości zarządzanej (połączeń bez hasła) z kontrolą dostępu opartą na rolach platformy Azure w celu uzyskiwania 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.
Możesz skonfigurować połączenia bez hasła z usługami platformy Azure przy użyciu łącznika usługi lub skonfigurować je ręcznie. W tym samouczku pokazano, jak używać łącznika usługi. Aby uzyskać więcej informacji na temat połączeń bez hasła, zobacz Połączenia bez hasła dla usług platformy Azure. Aby uzyskać informacje o łączniku usługi, zobacz dokumentację łącznika usługi.
W tym samouczku pokazano, jak utworzyć i wdrożyć aplikację internetową w języku Python 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. Aby zapoznać się z przykładami używania tożsamości zarządzanej przypisanej przez użytkownika, zobacz Tworzenie i wdrażanie aplikacji internetowej Django na platformie Azure przy użyciu tożsamości zarządzanej przypisanej przez użytkownika.
Pobieranie przykładowej aplikacji
Przykładowa aplikacja w języku Python korzystająca z platformy Flask jest dostępna, aby ułatwić wykonanie kroków tego samouczka. Pobierz lub sklonuj jedną z przykładowych aplikacji na lokalną stację roboczą.
Sklonuj przykład w sesji usługi Azure Cloud Shell.
git clone https://github.com/Azure-Samples/msdocs-flask-web-app-managed-identity.git
Przejdź do folderu aplikacji.
cd msdocs-flask-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 przypisanej przez system tożsamości zarządzanej.
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 łączników usługi, aby automatycznie włączyć tożsamość zarządzaną przypisaną przez system na platformie Azure i przypisać odpowiednią tożsamość na koncie usługi Azure Storage i serwerze usługi Azure Database for PostgreSQL.
Po włączeniu tożsamości zarządzanej przypisanej przez system 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 app.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 zamiast hasła w identyfikatorze URI połączenia PostgreSQL zwróconym do obiektu wywołującego.
azure_credential = DefaultAzureCredential()
token = azure_credential.get_token("https://ossrdbms-aad.database.windows.net")
conn = str(current_app.config.get('DATABASE_URI')).replace('PASSWORDORTOKEN', 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 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"
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 PostgreSQL za pomocą polecenia az postgres flexible-server create . (To i kolejne polecenia używają znaku kontynuacji wiersza dla powłoki Bash ('\'). W razie potrzeby zmień znak kontynuacji wiersza dla powłoki.
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
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
.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
Utwórz usługę app service przy użyciu polecenia az webapp up .
az webapp up \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --runtime PYTHON:3.9 \ --sku B1
Jednostka SKU definiuje rozmiar (procesor CPU, 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, aby używała start.sh w repozytorium 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 łączników bez hasła do zasobów platformy Azure
Polecenia łącznika usług konfigurują zasoby usługi Azure Storage i Azure Database for PostgreSQL w celu używania tożsamości zarządzanej i kontroli dostępu opartej na rolach platformy Azure. Polecenia tworzą ustawienia aplikacji w usłudze App Service, które łączą aplikację internetową z tymi zasobami. Dane wyjściowe z poleceń zawierają listę akcji łącznika usługi podjętych w celu włączenia funkcji bez hasła.
Dodaj łącznik usługi PostgreSQL za pomocą polecenia az webapp connection create postgres-flexible . Tożsamość zarządzana przypisana przez system jest używana do uwierzytelniania aplikacji internetowej w zasobie docelowym, w tym przypadku bazy danych PostgreSQL.
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
Dodaj łącznik usługi storage za pomocą polecenia az webapp connection create storage-blob .
To polecenie dodaje również konto magazynu i dodaje aplikację internetową z rolą Współautor danych obiektu blob usługi Storage do konta magazynu.
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))
Tworzenie kontenera na koncie magazynu
Przykładowa aplikacja w języku Python przechowuje zdjęcia przesyłane przez recenzentów jako obiekty blob w kontenerze na koncie magazynu.
Gdy użytkownik przesyła zdjęcie ze swoim przeglądem, przykładowa aplikacja zapisuje obraz w kontenerze przy użyciu przypisanej przez system tożsamości zarządzanej na potrzeby uwierzytelniania i autoryzacji. Ta funkcja została skonfigurowana w ostatniej sekcji.
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).
Aby zwiększyć bezpieczeństwo, konta magazynu są domyślnie tworzone przy użyciu anonimowego dostępu do danych obiektów blob. W tej sekcji włączysz anonimowy dostęp do odczytu na koncie magazynu, a następnie utworzysz kontener o nazwie photos , który zapewnia publiczny (anonimowy) dostęp do jego obiektów blob.
Zaktualizuj konto magazynu, aby zezwolić na anonimowy dostęp do odczytu do obiektów blob za pomocą polecenia az storage account update .
az storage account update \ --name $STORAGE_ACCOUNT_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --allow-blob-public-access true
Włączenie dostępu anonimowego na koncie magazynu nie ma wpływu na dostęp do poszczególnych obiektów blob. Należy jawnie włączyć publiczny dostęp do obiektów blob na poziomie kontenera.
Utwórz kontener o nazwie photos na koncie magazynu za pomocą polecenia az storage container create . Zezwalaj na dostęp anonimowego odczytu (publicznego) do obiektów blob w nowo utworzonym kontenerze.
az storage container create \ --account-name $STORAGE_ACCOUNT_NAME \ --name photos \ --public-access blob \ --account-key $(az storage account keys list --account-name $STORAGE_ACCOUNT_NAME \ --query [0].value --output tsv)
Uwaga
W przypadku zwięzłości to polecenie używa klucza konta magazynu do autoryzowania przy użyciu konta magazynu. W większości scenariuszy zalecaną metodą firmy Microsoft jest użycie ról Microsoft Entra ID i Azure (RBAC). Aby uzyskać szybki zestaw instrukcji, 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".
Aby dowiedzieć się więcej o anonimowym dostępie do odczytu do danych obiektów blob, zobacz Konfigurowanie anonimowego dostępu do odczytu dla kontenerów i obiektów blob.
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.