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.

Połączenia bez hasła z usługami platformy Azure można skonfigurować przy użyciu usługi Service Połączenie or lub skonfigurować je ręcznie. W tym samouczku pokazano, jak używać Połączenie or 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 Połączenie or usługi, zobacz dokumentację usługi Połączenie or.

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ą.

  1. Sklonuj przykład w sesji usługi Azure Cloud Shell.

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

    cd msdocs-flask-web-app-managed-identity
    

Tworzenie serwera 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"
    

    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 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.

  4. 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

  1. 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.

  2. 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 usługi Połączenie or 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.

  1. 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
    
  2. 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.

  1. 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.

  2. 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.

  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