Tworzenie i wdrażanie aplikacji internetowej w języku Python przy użyciu usług Azure Container Apps i PostgreSQL

Ten artykuł jest częścią samouczka dotyczącego konteneryzowania i wdrażania aplikacji internetowej w języku Python w usłudze Azure Container Apps. Usługa Container Apps umożliwia wdrażanie konteneryzowanych aplikacji bez zarządzania złożoną infrastrukturą.

W tej części samouczka dowiesz się, jak konteneryzować i wdrażać przykładową aplikację internetową w języku Python (Django lub Flask). W szczególności tworzysz obraz kontenera w chmurze i wdrażasz go w usłudze Azure Container Apps. Definiujesz zmienne środowiskowe, które umożliwiają aplikacji kontenera nawiązywanie połączenia z wystąpieniem usługi Azure Database for PostgreSQL — serwer elastyczny , w którym przykładowa aplikacja przechowuje dane.

Ten diagram usługi przedstawia składniki opisane w tym artykule: kompilowanie i wdrażanie obrazu kontenera.

A screenshot of the services in the Tutorial - Deploy a Python App on Azure Container Apps. Section highlighted is what is covered in this article.

Pobieranie przykładowej aplikacji

Rozwidlenie i sklonowanie przykładowego kodu do środowiska deweloperskiego.

Krok 1. Przejdź do repozytorium GitHub przykładowej aplikacji (Django lub Flask) i wybierz pozycję Rozwidlenie.

Wykonaj kroki, aby rozwidlić katalog na koncie usługi GitHub. Możesz również pobrać repozytorium kodu bezpośrednio na komputer lokalny bez rozwidlenia lub konta usługi GitHub, jednak nie będzie można skonfigurować ciągłej integracji/ciągłego wdrażania omówionych w dalszej części tego samouczka.

Krok 2. Użyj polecenia git clone, aby sklonować rozwidlenie repozytorium do folderu python-container:

# Django
git clone https://github.com/$USERNAME/msdocs-python-django-azure-container-apps.git python-container

# Flask
# git clone https://github.com/$USERNAME/msdocs-python-flask-azure-container-apps.git python-container

Krok 3. Zmień katalog.

cd python-container

Tworzenie obrazu kontenera na podstawie kodu aplikacji internetowej

Po wykonaniu tych kroków będziesz mieć usługę Azure Container Registry zawierającą obraz kontenera platformy Docker utworzony na podstawie przykładowego kodu.

Polecenia interfejsu wiersza polecenia platformy Azure można uruchamiać w usłudze Azure Cloud Shell lub na stacji roboczej z zainstalowanym interfejsem wiersza polecenia platformy Azure.

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

az group create \
--name pythoncontainer-rg \
--location <location>

<location> jest jedną z wartości nazwa lokalizacji platformy Azure z danych wyjściowych polecenia az account list-locations -o table.

Krok 2. Utwórz rejestr kontenerów za pomocą polecenia az acr create .

az acr create \
--resource-group pythoncontainer-rg \
--name <registry-name> \
--sku Basic \
--admin-enabled

<Nazwa> rejestru musi być unikatowa na platformie Azure i zawierać od 5 do 50 znaków alfanumerycznych.

Możesz wyświetlić poświadczenia utworzone dla administratora za pomocą następujących funkcji:

az acr credential show \
--name <registry-name> \
--resource-group pythoncontainer-rg

Krok 3. Zaloguj się do rejestru przy użyciu polecenia az acr login .

az acr login --name <registry-name>

Polecenie dodaje "azurecr.io" do nazwy, aby utworzyć w pełni kwalifikowaną nazwę rejestru. W przypadku powodzenia zostanie wyświetlony komunikat "Logowanie powiodło się". Jeśli uzyskujesz dostęp do rejestru z subskrypcji innej niż ta, w której utworzono rejestr, użyj przełącznika --suffix .

Krok 4. Skompiluj obraz za pomocą polecenia az acr build .

az acr build \
--registry <registry-name> \
--resource-group pythoncontainer-rg \
--image pythoncontainer:latest .

Należy pamiętać, że:

  • Kropka (".") na końcu polecenia wskazuje lokalizację kodu źródłowego do skompilowania. Jeśli nie uruchamiasz tego polecenia w przykładowym katalogu głównym aplikacji, określ ścieżkę do kodu.

  • Jeśli uruchamiasz polecenie w usłudze Azure Cloud Shell, użyj polecenia git clone , aby najpierw ściągnąć repozytorium do środowiska usługi Cloud Shell i zmienić katalog na katalog główny projektu, aby kropka (".") została prawidłowo zinterpretowana.

  • Jeśli pominiesz -t opcję (taką samą jak --image), polecenie spowoduje kolejkowanie kompilacji kontekstu lokalnego bez wypychania jej do rejestru. Kompilowanie bez wypychania może być przydatne, aby sprawdzić, czy kompilacje obrazu.

Krok 5. Upewnij się, że obraz kontenera został utworzony za pomocą polecenia az acr repository list .

az acr repository list --name <registry-name>

Tworzenie wystąpienia serwera elastycznego PostgreSQL

Przykładowa aplikacja (Django lub Flask) przechowuje dane przeglądu restauracji w bazie danych PostgreSQL. W tych krokach utworzysz serwer, który będzie zawierać bazę danych.

Polecenia interfejsu wiersza polecenia platformy Azure można uruchamiać w usłudze Azure Cloud Shell lub na stacji roboczej z zainstalowanym interfejsem wiersza polecenia platformy Azure.

Krok 1. Użyj polecenia az postgres flexible-server create, aby utworzyć serwer PostgreSQL na platformie Azure. Wykonanie tego polecenia przez kilka minut nie jest niczym niezwykłym.

az postgres flexible-server create \
   --resource-group pythoncontainer-rg \
   --name <postgres-server-name>  \
   --location <location> \
   --admin-user <admin-username> \
   --admin-password <admin-password> \
   --sku-name Standard_D2s_v3 \
   --public-access 0.0.0.0 
  • "pythoncontainer-rg" → Nazwa grupy zasobów używana w tym samouczku. Jeśli użyto innej nazwy, zmień tę wartość.

  • <postgres-server-name> → nazwa serwera bazy danych PostgreSQL. Ta nazwa musi być unikatowa na całej platformie Azure. Punkt końcowy serwera to "https://< postgres-server-name.postgres.database.azure.com>". Dozwolone znaki to "A"-"Z", "0"-"9" i "-".

  • <location> → Użyj tej samej lokalizacji używanej dla aplikacji internetowej. <location> jest jedną z wartości nazwa lokalizacji platformy Azure z danych wyjściowych polecenia az account list-locations -o table.

  • <admin-username → Nazwa użytkownika> konta administratora. Nie może to być "azure_superuser", "admin", "administrator", "root", "guest" lub "public". W tym samouczku użyj polecenia "demoadmin".

  • <hasło> administratora hasła użytkownika administratora. Musi zawierać od 8 do 128 znaków z trzech z następujących kategorii: wielkie litery angielskie, małe litery angielskie, cyfry i znaki inne niż alfanumeryczne.

    Ważne

    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.

  • <sku-name> → Nazwa warstwy cenowej i konfiguracji obliczeniowej, na przykład "Standard_D2s_v3". 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>.

  • <public-access> → Użyj polecenia "0.0.0.0", co umożliwia publiczny dostęp do serwera z dowolnej usługi platformy Azure, takiej jak Container Apps.

Uwaga

Jeśli planujesz pracę serwera PostgreSQL z lokalnej stacji roboczej przy użyciu narzędzi innych niż interfejs wiersza polecenia platformy Azure, musisz dodać regułę zapory za pomocą polecenia az postgres flexible-server firewall-rule create .

Tworzenie bazy danych na serwerze

Na tym etapie masz serwer PostgreSQL. W tej sekcji utworzysz bazę danych na serwerze.

Możesz użyć interaktywnego narzędzia psql terminalu PostgreSQL w środowisku lokalnym lub w usłudze Azure Cloud Shell, która jest również dostępna w witrynie Azure Portal. Podczas pracy z narzędziem psql często łatwiej jest używać usługi Cloud Shell , ponieważ wszystkie zależności są uwzględniane w powłoce.

Krok 1. Połączenie do bazy danych za pomocą narzędzia psql.

psql --host=<postgres-server-name>.postgres.database.azure.com \
     --port=5432 \
     --username=demoadmin@<postgres-server-name> \
     --dbname=postgres

Gdzie <postgres-server-name> jest nazwą serwera PostgreSQL. Polecenie wyświetli monit o podanie hasła administratora.

Jeśli masz problemy z nawiązaniem połączenia, uruchom ponownie bazę danych i spróbuj ponownie. Jeśli łączysz się ze środowiska lokalnego, adres IP musi zostać dodany do listy reguł zapory dla usługi bazy danych.

Krok 2. Utwórz bazę danych.

postgres=> W wierszu polecenia wpisz:

CREATE DATABASE restaurants_reviews;

Średnik (";") na końcu polecenia jest niezbędny. Aby sprawdzić, czy baza danych została pomyślnie utworzona, użyj polecenia \c restaurants_reviews. Wpisz \? polecenie , aby wyświetlić pomoc lub \q zakończyć pracę.

Możesz również nawiązać połączenie z serwerem elastycznym usługi Azure PostgreSQL i utworzyć bazę danych przy użyciu narzędzia Azure Data Studio lub dowolnego innego środowiska IDE obsługującego usługę PostgreSQL.

Wdrażanie aplikacji internetowej w usłudze Container Apps

Aplikacje kontenerów są wdrażane w środowiskach usługi Container Apps, które działają jako bezpieczna granica. W poniższych krokach utworzysz środowisko, kontener wewnątrz środowiska i skonfigurujesz kontener tak, aby witryna internetowa był widoczna zewnętrznie.

Krok 1. W razie potrzeby zaloguj się na platformie Azure i uwierzytelnij się.

az login

Krok 2. Zainstaluj lub uaktualnij rozszerzenie dla usługi Azure Container Apps za pomocą polecenia az extension add .

az extension add --name containerapp --upgrade

Krok 3. Utwórz środowisko usługi Container Apps za pomocą polecenia az containerapp env create .

az containerapp env create \
--name python-container-env \
--resource-group pythoncontainer-rg \
--location <location>

<location> jest jedną z wartości nazwa lokalizacji platformy Azure z danych wyjściowych polecenia az account list-locations -o table.

Krok 4. Pobierz poświadczenia logowania dla usługi Azure Container Registry.

az acr credential show -n <registry-name>

Użyj nazwy użytkownika i jednego z haseł zwróconych z danych wyjściowych polecenia .

Krok 5. Utwórz aplikację kontenera w środowisku za pomocą polecenia az containerapp create .

az containerapp create \
--name python-container-app \
--resource-group pythoncontainer-rg \
--image <registry-name>.azurecr.io/pythoncontainer:latest \
--environment python-container-env \
--ingress external \
--target-port 8000 \
--registry-server <registry-name>.azurecr.io \
--registry-username <registry-username> \
--registry-password <registry-password> \
--env-vars <env-variable-string>
--query properties.configuration.ingress.fqdn

<env-variable-string to ciąg> składający się z wartości rozdzielanych spacjami w formacie key="value" z następującymi wartościami.

  • AZURE_POSTGRESQL_HOST=<postgres-server-name.postgres.database.azure.com>
  • AZURE_POSTGRESQL_DATABASE=restaurants_reviews
  • AZURE_POSTGRESQL_USERNAME=demoadmin
  • AZURE_POSTGRESQL_PASSWORD=<db-password>
  • RUNNING_IN_PRODUCTION=1
  • AZURE_SECRET_KEY=<YOUR-SECRET-KEY>

Wygeneruj AZURE_SECRET_KEY wartość przy użyciu danych wyjściowych .python -c 'import secrets; print(secrets.token_hex())'

Oto przykład: --env-vars AZURE_POSTGRESQL_HOST="my-postgres-server.postgres.database.azure.com" AZURE_POSTGRESQL_DATABASE="restaurants_reviews" AZURE_POSTGRESQL_USERNAME="demoadmin" AZURE_POSTGRESQL_PASSWORD="somepassword" RUNNING_IN_PRODUCTION="1" AZURE_SECRET_KEY=asdfasdfasdf.

Krok 7. Tylko w przypadku platformy Django należy przeprowadzić migrację i utworzyć schemat bazy danych. (W przykładowej aplikacji Platformy Flask jest ona wykonywana automatycznie i można pominąć ten krok).

Połączenie za pomocą polecenia az containerapp exec:

az containerapp exec \
--name python-container-app \
--resource-group pythoncontainer-rg

Następnie w wierszu polecenia powłoki wpisz python manage.py migrate.

Nie musisz migrować wersji kontenera.

Krok 8. Przetestuj witrynę internetową.

Wprowadzone az containerapp create wcześniej polecenie zwraca adres URL aplikacji, którego można użyć do przeglądania aplikacji. Adres URL kończy się na "azurecontainerapps.io". Przejdź do adresu URL w przeglądarce. Alternatywnie możesz użyć polecenia az containerapp browse .

Oto przykład przykładowej witryny internetowej po dodaniu restauracji i dwóch recenzji.

Screenshot showing an example of the sample website built in this tutorial.

Rozwiązywanie problemów z wdrażaniem

  • Nie pamiętasz adresu URL aplikacji, aby uzyskać dostęp do witryny internetowej.

    • W witrynie Azure Portal przejdź do strony Przegląd aplikacji kontenera i wyszukaj adres URL aplikacji.
    • W programie VS Code przejdź do rozszerzenia platformy Azure i wybierz sekcję Container Apps . Rozwiń subskrypcję, rozwiń środowisko kontenera, a po znalezieniu aplikacji kontenera kliknij prawym przyciskiem myszy pozycję python-container-app i wybierz pozycję Przeglądaj.
    • W interfejsie wiersza polecenia platformy Azure użyj polecenia az containerapp show -g pythoncontainer-rg -n python-container-app --query properties.configuration.ingress.fqdn.
  • W programie VS Code zadanie Kompilowanie obrazu na platformie Azure zwraca błąd.

    • Jeśli zostanie wyświetlony komunikat "Błąd: nie można pobrać kontekstu. Sprawdź, czy adres URL jest niepoprawny" w oknie Dane wyjściowe programu VS Code, a następnie odśwież rejestr w rozszerzeniu platformy Docker. Aby odświeżyć, wybierz rozszerzenie platformy Docker, przejdź do sekcji Rejestry, znajdź rejestr i wybierz go.
    • Jeśli ponownie uruchomisz obraz kompilacji na platformie Azure , sprawdź, czy rejestr z poprzedniego uruchomienia istnieje, a jeśli tak, użyj go.
  • W witrynie Azure Portal podczas tworzenia aplikacji kontenera zostanie wyświetlony błąd dostępu zawierający komunikat "Nie można uzyskać dostępu do usługi ACR "<name.azurecr.io>".

    • Ten błąd występuje, gdy poświadczenia administratora w usłudze ACR są wyłączone. Aby sprawdzić stan administratora w portalu, przejdź do usługi Azure Container Registry, wybierz zasób Klucze dostępu i upewnij się, że Administracja użytkownik jest włączony.
  • Obraz kontenera nie jest wyświetlany w usłudze Azure Container Registry.

    • Sprawdź dane wyjściowe polecenia interfejsu wiersza polecenia platformy Azure lub dane wyjściowe programu VS Code i poszukaj komunikatów, aby potwierdzić powodzenie.
    • Sprawdź, czy nazwa rejestru została poprawnie określona w poleceniu kompilacji za pomocą interfejsu wiersza polecenia platformy Azure lub w wierszach zadań programu VS Code.
    • Upewnij się, że poświadczenia nie wygasły. Na przykład w programie VS Code znajdź rejestr docelowy w rozszerzeniu platformy Docker i odśwież. W interfejsie wiersza polecenia platformy Azure uruchom polecenie az login.
  • Witryna internetowa zwraca wartość "Nieprawidłowe żądanie (400)".

    • Sprawdź zmienne środowiskowe bazy danych PostgreSQL przekazane do kontenera. Błąd 400 często wskazuje, że kod języka Python nie może nawiązać połączenia z wystąpieniem bazy danych PostgreSQL.
    • Przykładowy kod używany w tym samouczku sprawdza istnienie zmiennej środowiskowej RUNNING_IN_PRODUCTIONkontenera , którą można ustawić na dowolną wartość, taką jak "1".
  • Witryna internetowa zwraca komunikat "Nie znaleziono (404)".

    • Sprawdź adres URL aplikacji na stronie Przegląd kontenera. Jeśli adres URL aplikacji zawiera słowo "internal", ruch przychodzący nie jest poprawnie ustawiony.
    • Sprawdź ruch przychodzący kontenera. Na przykład w witrynie Azure Portal przejdź do zasobu Ruchu przychodzącego kontenera i upewnij się, że ruch przychodzący HTTP jest włączony, a opcja Akceptowanie ruchu z dowolnego miejsca jest zaznaczona.
  • Witryna internetowa nie jest uruchamiana, widzisz komunikat "limit czasu strumienia" lub nie jest zwracany żaden komunikat.

    • Sprawdź dzienniki.
      • W witrynie Azure Portal przejdź do zasobu zarządzania poprawkami aplikacji kontenera i sprawdź stan aprowizacji kontenera.
        • Jeśli "Aprowizowanie", poczekaj na zakończenie aprowizacji.
        • Jeśli "Niepowodzenie", wybierz poprawkę i wyświetl dzienniki konsoli. Wybierz kolejność kolumn, aby wyświetlić wartości "Czas wygenerowany", "Stream_s" i "Log_s". Posortuj dzienniki według najnowszych elementów i poszukaj komunikatów stderr i stdout języka Python w kolumnie "Stream_s". Dane wyjściowe "print" języka Python będą komunikatami stdout .
      • Za pomocą interfejsu wiersza polecenia platformy Azure użyj polecenia az containerapp logs show .
    • Jeśli używasz struktury Django, sprawdź, czy tabele restaurants_reviews istnieją w bazie danych. Jeśli nie, użyj konsoli, aby uzyskać dostęp do kontenera i uruchomić polecenie python manage.py migrate.

Następny krok