Создание и развертывание веб-приложения Python с помощью приложений контейнеров Azure и PostgreSQL

Эта статья является частью руководства по контейнеризации и развертыванию веб-приложения Python в приложениях контейнеров Azure. Контейнерные приложения позволяют развертывать контейнерные приложения без управления сложной инфраструктурой.

В этой части руководства вы узнаете, как контейнеризировать и развернуть пример веб-приложения Python (Django или Flask). В частности, вы создаете образ контейнера в облаке и развертываете его в приложениях контейнеров Azure. Вы определяете переменные среды, позволяющие приложению-контейнеру подключаться к База данных Azure для PostgreSQL — гибкому экземпляру сервера, где пример приложения хранит данные.

На этой схеме службы выделены компоненты, описанные в этой статье: создание и развертывание образа контейнера.

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.

Получение примера приложения

Вилку и клонируйте пример кода в среду разработчика.

Шаг 1. Перейдите в репозиторий GitHub примера приложения (Django или Flask) и выберите "Форк".

Выполните действия, чтобы вставить каталог в учетную запись GitHub. Вы также можете скачать репозиторий кода непосредственно на локальный компьютер без вилки или учетной записи GitHub, однако вы не сможете настроить CI/CD, рассмотренный далее в руководстве.

Шаг 2. Используйте команду клонирования Git, чтобы клонировать вилку репозитория в папку 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

Шаг 3. Изменить каталог.

cd python-container

Создание образа контейнера из кода веб-приложения

После выполнения этих действий у вас будет Реестр контейнеров Azure, содержащий образ контейнера Docker, созданный из примера кода.

Команды Azure CLI могут выполняться в Azure Cloud Shell или на рабочей станции с установленным интерфейсом Azure CLI.

Шаг 1. Создайте группу ресурсов с помощью команды az group create.

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

<расположение> — это одно из значений имени расположения Azure из выходных данных командыaz account list-locations -o table.

Шаг 2. Создайте реестр контейнеров с помощью команды az acr create .

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

<Имя> реестра должно быть уникальным в Azure и содержать 5–50 буквенно-цифровых символов.

Учетные данные, созданные для администратора, можно просмотреть следующими способами:

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

Шаг 3. Войдите в реестр с помощью команды az acr login .

az acr login --name <registry-name>

Команда добавляет "azurecr.io" в имя, чтобы создать полное имя реестра. В случае успешного выполнения появится сообщение "Имя входа выполнено". Если вы обращаетесь к реестру из подписки, отличной от подписки, в которой был создан реестр, используйте --suffix этот параметр.

Шаг 4. Создайте образ с помощью команды az acr build .

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

Обратите внимание на следующие условия.

  • Точка (".") в конце команды указывает расположение исходного кода для сборки. Если эта команда не выполняется в корневом каталоге примера приложения, укажите путь к коду.

  • Если вы выполняете команду в Azure Cloud Shell, используйте git clone для первого извлечения репозитория в среду Cloud Shell и сначала измените каталог в корневой каталог проекта, чтобы точка (".") была интерпретирована правильно.

  • Если вы оставьте -t параметр (так же, как --image) команде выполняется сборка локального контекста без отправки в реестр. Создание без отправки может оказаться полезным для проверка сборки образа.

Шаг 5. Убедитесь, что образ контейнера создан с помощью команды az acr repository list .

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

Создание экземпляра гибкого сервера PostgreSQL

Пример приложения (Django или Flask) хранит данные о проверке ресторанов в базе данных PostgreSQL. На этих шагах вы создадите сервер, который будет содержать базу данных.

Команды Azure CLI могут выполняться в Azure Cloud Shell или на рабочей станции с установленным интерфейсом Azure CLI.

Шаг 1. Используйте команду az postgres flexible-server create, чтобы создать сервер PostgreSQL в Azure. Это не редкость для выполнения этой команды в течение нескольких минут.

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 → имя группы ресурсов, используемое в этом руководстве. Если вы использовали другое имя, измените это значение.

  • <postgres-server-name> → имя сервера базы данных PostgreSQL. Это имя должно быть уникальным во всех Azure. Конечная точка сервера — "https://< postgres-server-name.postgres.database.azure.com>". Допустимые символы: "A"-"Z", "0"-"9" и "-".

  • <Расположение> → используйте то же расположение, которое использовалось для веб-приложения. <расположение> — это одно из значений имени расположения Azure из выходных данных командыaz account list-locations -o table.

  • <имя администратора → имя пользователя> для учетной записи администратора. Он не может быть "azure_superuser", "admin", "admin", "root", "guest" или "public". Используйте demoadmin для этого руководства.

  • <admin-password> Пароль администратора. Он должен содержать от 8 до 128 символов из трех следующих категорий: английские прописные буквы, строчные буквы, цифры и не буквенно-цифровые символы.

    Важно!

    При создании имен пользователей или паролей не используйте символ $. Позже вы создадите переменные среды с этими значениями, где символ "$" имеет особое значение в контейнере Linux, используемом для запуска приложений Python.

  • <sku-name> → Имя ценовой категории и конфигурации вычислений, например "Standard_D2s_v3". Дополнительные сведения см. на странице цен на Базу данных Azure для PostgreSQL. Чтобы получить список доступных номеров SKU, используйте az postgres flexible-server list-skus --location <location>.

  • <public-access> → использовать "0.0.0.0.0", что позволяет общедоступному доступу к серверу из любой службы Azure, например приложений контейнеров.

Примечание.

Если вы планируете работать с сервером PostgreSQL на локальной рабочей станции с инструментами, отличными от Azure CLI, необходимо добавить правило брандмауэра с помощью команды az postgres flexible-server firewall-rule create .

Создание базы данных на сервере

На этом этапе у вас есть сервер PostgreSQL. В этом разделе описано, как создать базу данных на сервере.

Вы можете использовать интерактивный psql терминала PostgreSQL в локальной среде или в Azure Cloud Shell, который также доступен в портал Azure. При работе с psql часто проще использовать Cloud Shell , так как все зависимости включены в оболочку.

Шаг 1. Подключение в базу данных с помощью psql.

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

Где <postgres-server-name> — это имя сервера PostgreSQL. Команда предложит вам пароль администратора.

Если возникают проблемы с подключением, перезапустите базу данных и повторите попытку. При подключении из локальной среды IP-адрес необходимо добавить в список правил брандмауэра для службы базы данных.

Шаг 2. Создайте базу данных.

В типе postgres=> запроса:

CREATE DATABASE restaurants_reviews;

Точка с запятой (";") в конце команды необходима. Чтобы убедиться, что база данных была успешно создана, используйте команду \c restaurants_reviews. Введите \?, чтобы отобразить справку или \q, чтобы выйти.

Вы также можете подключиться к гибкому серверу Azure PostgreSQL и создать базу данных с помощью Azure Data Studio или любой другой интегрированной среды разработки, поддерживающей PostgreSQL.

Развертывание веб-приложения в приложениях-контейнерах

Приложения-контейнеры развертываются в средах контейнерных приложений, которые действуют в качестве безопасной границы. В следующих шагах вы создадите среду, контейнер внутри среды и настройте контейнер, чтобы веб-сайт был видимым внешне.

Шаг 1. При необходимости войдите в Azure и выполните проверку подлинности.

az login

Шаг 2. Установите или обновите расширение для приложений контейнеров Azure с помощью команды az extension add .

az extension add --name containerapp --upgrade

Шаг 3. Создайте среду container Apps с помощью команды az containerapp env create .

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

<расположение> — это одно из значений имени расположения Azure из выходных данных командыaz account list-locations -o table.

Шаг 4. Получите учетные данные входа для Реестр контейнеров Azure.

az acr credential show -n <registry-name>

Используйте имя пользователя и один из паролей, возвращенных из выходных данных команды.

Шаг 5. Создайте приложение-контейнер в среде с помощью команды 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 — это строка> , состоящая из разделенных пробелами значений в формате key="value" со следующими значениями.

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

Создайте AZURE_SECRET_KEY значение с помощью выходных python -c 'import secrets; print(secrets.token_hex())'данных .

Вот пример: --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.

Шаг 7. Только для Django перенос и создание схемы базы данных. (В примере приложения Flask оно выполняется автоматически, и вы можете пропустить этот шаг.)

Подключение с помощью команды az containerapp exec:

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

Затем в командной строке оболочки введите python manage.py migrate.

Вам не нужно выполнять миграцию для редакций контейнера.

Шаг 8. Проверьте веб-сайт.

Команда, введенная az containerapp create ранее, выводит URL-адрес приложения, который можно использовать для перехода к приложению. URL-адрес заканчивается на "azurecontainerapps.io". Перейдите по URL-адресу в браузере. Кроме того, можно использовать команду az containerapp browse .

Ниже приведен пример примера веб-сайта после добавления ресторана и двух отзывов.

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

Устранение неполадок с развертыванием

  • Вы забыли URL-адрес приложения для доступа к веб-сайту.

    • В портал Azure перейдите на страницу обзора приложения-контейнера и найдите URL-адрес приложения.
    • В VS Code перейдите к расширению Azure и выберите раздел "Приложения контейнеров". Разверните подписку, разверните среду контейнера и при поиске приложения контейнера щелкните правой кнопкой мыши приложение python-container-app и нажмите кнопку "Обзор".
    • В Azure CLI используйте команду az containerapp show -g pythoncontainer-rg -n python-container-app --query properties.configuration.ingress.fqdn.
  • В VS Code задача сборки в Azure возвращает ошибку.

    • Если появится сообщение "Ошибка: не удалось скачать контекст. Проверка, если URL-адрес неверный". В окне вывода VS Code обновите реестр в расширении Docker. Чтобы обновить расширение Docker, перейдите в раздел "Реестры", найдите реестр и выберите его.
    • Если вы снова запустите образ сборки в задаче Azure, проверка, чтобы узнать, существует ли реестр из предыдущего запуска и если да, используйте его.
  • В портал Azure во время создания приложения-контейнера появится ошибка доступа, содержащая сообщение "Не удается получить доступ к ACR "<name.azurecr.io>".

    • Эта ошибка возникает при отключении учетных данных администратора в ACR. Чтобы проверка состояние администратора на портале, перейдите к Реестр контейнеров Azure, выберите ресурс ключей доступа и убедитесь, что Администратор пользователь включен.
  • Образ контейнера не отображается в Реестр контейнеров Azure.

    • Проверьте выходные данные команды Azure CLI или выходных данных VS Code и найдите сообщения, чтобы подтвердить успешность.
    • Убедитесь, что имя реестра было указано правильно в команде сборки с помощью Azure CLI или в запросах задач VS Code.
    • Убедитесь, что срок действия учетных данных не истек. Например, в VS Code найдите целевой реестр в расширении Docker и обновите его. В Azure CLI выполните команду az login.
  • Веб-сайт возвращает "Недопустимый запрос (400)".

    • Проверьте переменные среды PostgreSQL, передаваемые в контейнер. Ошибка 400 часто указывает, что код Python не может подключиться к экземпляру PostgreSQL.
    • Пример кода, используемый в этом руководстве, проверка для существования переменной RUNNING_IN_PRODUCTIONсреды контейнера, которая может быть задана для любого значения, например "1".
  • Веб-сайт возвращает значение "Not Found (404)".

    • Проверьте URL-адрес приложения на странице обзора контейнера. Если URL-адрес приложения содержит слово "internal", то входящий трафик не задан правильно.
    • Проверьте входящий трафик контейнера. Например, в портал Azure перейдите к ресурсу входящего трафика контейнера и убедитесь, что http Ingress включен и выбран трафик из любого места.
  • Веб-сайт не начинается, вы видите "время ожидания потока" или ничего не возвращается.

    • Проверьте журналы.
      • В портал Azure перейдите к ресурсу управления редакцией приложения-контейнера и проверка состояние подготовки контейнера.
        • Если "Подготовка", дождитесь завершения подготовки.
        • Если "Не удалось", выберите редакцию и просмотрите журналы консоли. Выберите порядок столбцов для отображения "Время создания", "Stream_s" и "Log_s". Сортируйте журналы по последнему первому и найдите сообщения stderr и stdout в столбце "Stream_s". Выходные данные Python "print" будут сообщения stdout .
      • С помощью Azure CLI используйте команду az containerapp logs show .
    • Если используется платформа Django, проверка, чтобы узнать, существуют ли в базе данных таблицы restaurants_reviews. В противном случае используйте консоль для доступа к контейнеру и запуска python manage.py migrate.

Следующий шаг