Samouczek: łączenie aplikacji internetowej Django z usługą Azure PostgreSQL przy użyciu łącznika usługi

Z tego samouczka dowiesz się, jak wdrożyć aplikację internetową Python Django opartą na danych do usługi Azure App Service oraz jak użyć Service Connector do połączenia z innymi usługami Azure. Przykładowa aplikacja internetowa przechowuje informacje o restauracjach i recenzjach w bazie danych Azure Database for PostgreSQL oraz przechowuje zdjęcia w kontenerze Azure Storage.

Aby wykonać następujące zadania, należy użyć Azure CLI:

  • Utwórz aplikację internetową Python Django i wdróż ją w Azure App Service.
  • Utwórz Azure Database for PostgreSQL serwer elastyczny i bazę danych.
  • Utwórz konto i kontener Azure Storage.
  • Podłącz aplikację webową do bazy danych i kontenera pamięci masowej przy użyciu łącznika usługi z uwierzytelnianiem przy użyciu tożsamości zarządzanej.
  • Interakcja z aplikacją internetową.

Uwaga / Notatka

Ten samouczek jest podobny do samouczka Deploy a Python Django web app with PostgreSQL in Azure usługi aplikacyjnej, ale korzysta z tożsamości zarządzanej bez hasła przypisanej przez system z kontrolą dostępu opartą na rolach Azure, aby uzyskać dostęp do innych zasobów Azure. W sekcji Tworzenie połączenia z usługą bez hasła w tym artykule pokazano, jak łącznik usługi upraszcza proces nawiązywania połączenia.

Aplikacja internetowa używa klasy DefaultAzureCredential klasy Python Azure Identity client library aby automatycznie wykrywać, kiedy istnieje tożsamość zarządzana i używa jej do uzyskiwania dostępu do innych zasobów.

Wymagania wstępne

  • Subskrypcja Azure z uprawnieniami do zapisu i przypisywania ról dla zasobów samouczka w regionie Azure, który obsługuje Łącznik Usługi i ma wystarczające wsparcie App Service i limitem przydziału.

  • Azure Cloud Shell aby uruchomić kroki samouczka lub jeśli wolisz uruchomić lokalnie:

    1. Zainstaluj Azure CLI 2.30.0 lub nowszy. Aby sprawdzić wersję, uruchom polecenie az --version. Aby uaktualnić, uruchom polecenie az upgrade.
    2. Zaloguj się do Azure przy użyciu az login i postępując zgodnie z monitami.

Konfigurowanie środowiska

  1. Upewnij się, że subskrypcja jest zarejestrowana w celu korzystania z Microsoft.ServiceLinker i Microsoft.DBforPostgreSQL dostawców usług. Jeśli nie, uruchom az provider register -n Microsoft.[name of service], aby zarejestrować dostawców.

  2. Zainstaluj następujące rozszerzenia Azure CLI:

    az extension add --name serviceconnector-passwordless --upgrade
    az extension add --name rdbms-connect
    

Klonowanie przykładowej aplikacji

  1. Sklonuj przykładowe repozytorium aplikacji.

    git clone https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless.git
    

    Alternatywnie możesz pobrać aplikację z https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless i rozpakuj ją do folderu o nazwie serviceconnector-webapp-postgresql-django-passwordless.

  2. Zmień katalogi w folderze repozytorium przy użyciu polecenia cd serviceconnector-webapp-postgresql-django-passwordless i uruchom wszystkie pozostałe polecenia z tego folderu.

W przykładowej aplikacji ustawienia produkcyjne aplikacji internetowej znajdują się w pliku azuresite/production.py . Ustawienia rozwojowe znajdują się w pliku azuresite/settings.py. Ustawienia produkcyjne konfigurują platformę Django do uruchamiania w dowolnym środowisku produkcyjnym i nie są specyficzne dla usługi App Service.

Aplikacja używa ustawień produkcyjnych, gdy zmienna środowiskowa jest ustawiona WEBSITE_HOSTNAME . W przypadku parametrów połączenia Azure Postgres usługa App Service automatycznie ustawia tę zmienną na adres URL aplikacji internetowej, na przykład https://msdocs-django.azurewebsites.net.

Aby uzyskać więcej informacji, zobacz listę kontrolną wdrażania Django. Zobacz również ustawienia Production dla platformy Django w Azure.

Definiowanie początkowych zmiennych środowiskowych

Poniższy kod definiuje niezbędne zmienne środowiskowe na potrzeby tego samouczka.

  • LOCATION musi być regionem Azure, w którym subskrypcja ma wystarczający limit, aby utworzyć zasoby, i nie ogranicza usługi Azure Database for PostgreSQL dla tej subskrypcji.
  • Musi ADMIN_PW zawierać od 8 do 128 znaków w co najmniej trzech z czterech kategorii wielkich liter, małych liter, cyfr i znaków nieliczbowych, z wyłączeniem $.
  1. Skonfiguruj następujące zmienne środowiskowe, zastępując symbole zastępcze <region> i <database password> prawidłowymi wartościami.

    LOCATION="<region>"
    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="<database password>"
    
  2. Utwórz grupę zasobów zawierającą wszystkie zasoby projektu. Nazwa grupy zasobów jest buforowana i automatycznie stosowana do kolejnych poleceń.

    az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
    

Wdrażanie kodu aplikacji w usłudze App Service

Utwórz hosta aplikacji w usłudze App Service i wdróż przykładowy kod aplikacji na tym hoście. Polecenie az webapp up wykonuje następujące akcje:

  • Tworzy plan usługi App Service w warstwie cenowej Basic (B1).
  • Tworzy aplikację App Service.
  • Włącza domyślne rejestrowanie dla aplikacji.
  • Przekazuje repozytorium przy użyciu wdrożenia ZIP z włączoną automatyzacją kompilacji.
  • Kompiluje aplikację.

W kodzie sku definiuje procesor, pamięć i koszt planu usługi App Service. Plan usługi Podstawowa (B1) wiąże się z niewielkim kosztem w ramach subskrypcji Azure. Można pominąć parametr, --sku aby użyć domyślnej jednostki SKU, zwykle P1v3 (Premium v3). Aby uzyskać pełną listę planów usługi App Service, zobacz Cennik usługi App Service.

  1. W folderze repozytorium serviceconnector-webapp-postgresql-django-passwordless uruchom następujące az webapp up polecenie:

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

    Uwaga / Notatka

    Wdrożenie trwa kilka minut, a polecenie może zawiesić się lub przekroczyć limit czasu, zwłaszcza w przypadku SKU w warstwie Podstawowa. Po pomyślnym skompilowaniu aplikacji i pokazaniu danych wyjściowych Starting the sitemożesz wyjść z polecenia, wybierając klawisze Ctrl+C.

  2. Skonfiguruj aplikację do korzystania z pliku start.sh w repozytorium, uruchamiając polecenie az webapp config set.

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

Tworzenie bazy danych Postgres w Azure

Utwórz bazę danych Azure Database for PostgreSQL do przechowywania informacji o aplikacji. Polecenie az postgres flexible-server create tworzy serwer elastyczny Azure Database for PostgreSQL w określonej grupie zasobów, która ma:

  • Nazwa serwera określona w parametrze --name . Nazwa musi być unikalna w całym Azure.
  • Jednostka SKU określona w parametrze --sku-name .
  • Nazwa użytkownika i hasło konta administratora określone w parametrach --admin-user i --admin-password .
  1. Utwórz serwer Azure Database for PostgreSQL. Jeśli zostanie wyświetlony monit o włączenie dostępu do obecnego adresu IP klienta, wprowadź y dla tak.

    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 \
      --microsoft-entra-auth Enabled
    
  2. Jeśli nie zostanie wyświetlony monit o włączenie dostępu do bieżącego adresu IP klienta, skonfiguruj regułę zapory na serwerze za pomocą polecenia az postgres flexible-server firewall-rule create . Ta reguła umożliwia dostęp środowiska lokalnego do serwera.

    IP_ADDRESS=<your IP address>
    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
    

    Wskazówka

    Użyj dowolnego narzędzia lub witryny internetowej, które wyświetla twój adres IP, aby zastąpić <your IP address> w poleceniu. Na przykład możesz użyć opcji Co to jest mój adres IP?.

  3. Utwórz bazę danych o nazwie restaurant na serwerze 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 połączenia usługi bez hasła

Użyj az webapp connection create postgres-flexible, aby dodać łącznik usługi, który łączy aplikację internetową Azure z bazą danych Postgres, wykorzystując uwierzytelnianie tożsamości zarządzanej bez użycia hasła. Następujące polecenie konfiguruje Azure Database for PostgreSQL do używania tożsamości zarządzanej i Azure kontroli dostępu opartej na rolach. Dane wyjściowe polecenia zawierają listę akcji, które wykonuje łącznik usługi.

Polecenie tworzy zmienną środowiskową o nazwie AZURE_POSTGRESQL_CONNECTIONSTRING , która udostępnia informacje o połączeniu z bazą danych dla aplikacji. Kod aplikacji uzyskuje dostęp do zmiennych środowiskowych aplikacji za pomocą instrukcji, takich jak os.environ.get('AZURE_POSTGRESQL_HOST'). Aby uzyskać więcej informacji, zobacz Access environment variables (Uzyskiwanie dostępu do zmiennych środowiskowych).

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

Tworzenie konta magazynowego i nawiązywanie z nim połączenia

Użyj az webapp connection create storage-blob, aby utworzyć konto magazynu Azure i konektor usługi. Polecenie wykonuje następujące akcje:

  • Włącza tożsamość zarządzaną przypisaną przez system w aplikacji internetowej.
  • Dodaje aplikację internetową z rolą Kontrybutor danych blob w usłudze magazynowania do nowego konta magazynu.
  • Konfiguruje sieć konta magazynowania tak, aby akceptowała dostęp z aplikacji webowej.
  • Tworzy zmienną środowiskową o nazwie AZURE_STORAGEBLOB_RESOURCEENDPOINT dla konta Azure Storage.
  1. Uruchom następujące polecenie, aby utworzyć konto magazynu i połączenie:

    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))
    
  2. Zaktualizuj konto magazynowe, aby umożliwić publiczny dostęp do obiektów blob dla użytkowników aplikacji w celu uzyskania dostępu do zdjęć.

     az storage account update  \
       --name $STORAGE_ACCOUNT_NAME \
       --allow-blob-public-access 
    
  3. Użyj polecenia az storage container create, aby utworzyć kontener o nazwie photos na koncie magazynowym i zezwolić na anonimowy dostęp publiczny do odczytu obiektów blob w nowym kontenerze.

    # 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
    

Testowanie aplikacji internetowej Python w Azure

Otwórz i przetestuj aplikację internetową Azure Restaurant Review. Aplikacja używa pakietu azure.identity i jej DefaultAzureCredential klasy. Gdy aplikacja jest uruchomiona w Azure, DefaultAzureCredential automatycznie wykrywa, kiedy istnieje tożsamość zarządzana dla usługi App Service i używa jej do uzyskiwania dostępu do zasobów Azure Storage i Azure Database for PostgreSQL. Aplikacja nie musi dostarczać kluczy magazynu, certyfikatów ani poświadczeń w celu uzyskania dostępu do tych zasobów.

  • W przypadku instalacji lokalnej Azure CLI możesz użyć az webapp browse, aby otworzyć aplikację w przeglądarce domyślnej:

    az webapp browse --name $APP_SERVICE_NAME.azurewebsites.net --resource-group $RESOURCE_GROUP_NAME
    
  • Azure Cloud Shell nie może otworzyć przeglądarki lokalnej, więc nie obsługuje polecenia az webapp browse. W Cloud Shell najłatwiejszym sposobem uruchomienia aplikacji internetowej jest wybranie łącza Domyślna domena w prawym górnym rogu strony w portalu Azure aplikacji.

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

Przetestuj funkcjonalność przykładowej aplikacji, dodając restaurację i kilka recenzji ze zdjęciami. Aplikacja powinna przypominać następujący zrzut ekranu:

Ochwyt ekranu przedstawiający przykładową aplikację z funkcją przeglądania restauracji przy użyciu usługi App Service, Azure Database for PostgreSQL i Azure Storage.

Uprzątnij zasoby

Aby uniknąć bieżących opłat, możesz usunąć zasoby utworzone na potrzeby tego samouczka, usuwając grupę zasobów, która je zawiera. Przed uruchomieniem polecenia upewnij się, że nie potrzebujesz już aplikacji ani zasobów.

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

Usunięcie wszystkich zasobów może zająć trochę czasu. Argument --no-wait umożliwia natychmiastowe zwrócenie polecenia.

Troubleshooting

Jeśli masz problemy z uruchomieniem tego samouczka, zapoznaj się z następującymi zasobami: