Руководство. Создание и развертывание веб-приложения Python с помощью приложений контейнеров Azure и PostgreSQL
Эта статья является частью серии руководств по контейнеризации и развертыванию веб-приложения Python для приложений контейнеров Azure. Контейнерные приложения позволяют развертывать контейнерные приложения без управления сложной инфраструктурой.
В этом руководстве вы:
- Контейнеризируйте пример веб-приложения Python (Django или Flask), создав образ контейнера в облаке.
- Разверните образ контейнера в приложениях контейнеров Azure.
- Определите переменные среды, позволяющие приложению-контейнеру подключаться к Базе данных Azure для PostgreSQL — экземпляр гибкого сервера, где пример приложения хранит данные.
На следующей схеме рассматриваются задачи, описанные в этом руководстве: создание и развертывание образа контейнера.
Необходимые условия
Если у вас нет подписки Azure, создайте бесплатную учетную запись перед началом работы.
Команды Azure CLI можно запускать в Azure Cloud Shell или на рабочей станции с установленным Azure CLI.
Если вы работаете локально, выполните следующие действия, чтобы войти и установить необходимые модули для этого руководства:
Войдите в Azure и выполните проверку подлинности при необходимости:
az login
Убедитесь, что вы используете последнюю версию Azure CLI:
az upgrade
Установите или обновите расширения containerapp и rdbms-connect Azure CLI с помощью команды az extension add:
az extension add --name containerapp --upgrade az extension add --name rdbms-connect --upgrade
Примечание.
Чтобы получить список расширений, установленных в системе, можно использовать команду az extension list. Например:
az extension list --query [].name --output tsv
Получение примера приложения
Форкните и клонируйте пример кода в среду разработки.
Перейдите в репозиторий GitHub примера приложения (Django или Flask) и выберите "Форк".
Выполните действия, чтобы сделать форк репозитория в свою учетную запись GitHub. Вы также можете скачать репозиторий кода непосредственно на локальный компьютер без форка или учетной записи на GitHub. Но если вы используете метод скачивания, вы не сможете настроить непрерывную интеграцию и непрерывную доставку (CI/CD) в следующем руководстве в этом серии.
Используйте команду клонирования 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
Измените каталог:
cd python-container
Создание образа контейнера из кода веб-приложения
После выполнения этих действий у вас будет экземпляр реестра контейнеров Azure, содержащий образ контейнера Docker, созданный из примера кода.
Создайте группу ресурсов, используя команду az group create:
az group create \ --name pythoncontainer-rg \ --location <location>
Замените <расположение> одним из значений расположения Azure
Name
из выходных данных командыaz account list-locations -o table
.Создайте реестр контейнеров, используя команду az acr create:
az acr create \ --resource-group pythoncontainer-rg \ --name <registry-name> \ --sku Basic \ --admin-enabled
Имя, используемое для <имен реестра,> должно быть уникальным в Azure, и оно должно содержать от 5 до 50 буквенно-цифровых символов.
Войдите в реестр, используя команду az acr login:
az acr login --name <registry-name>
Команда добавляет "azurecr.io" в имя, чтобы создать полное имя реестра. Если вход выполнен успешно, появится сообщение "Login Succeeded". Если вы обращаетесь к реестру из подписки, отличной от той, в которой вы создали реестр, используйте параметр
--suffix
.Если вход завершается ошибкой, убедитесь, что управляющая программа Docker запущена в вашей системе.
Создайте образ с помощью команды 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
) команде выполняется сборка локального контекста без отправки в реестр. Сборка без отправки может оказаться полезной для проверки того, что образ строится.
Убедитесь, что образ контейнера был создан с помощью команды az acr repository list:
az acr repository list --name <registry-name>
Примечание.
В этом разделе описано, как создать реестр контейнеров на уровне служб "Базовый". Этот уровень с оптимизированными затратами, с набором функций и пропускной способностью, предназначенной для сценариев разработчиков, и подходит для требований этого руководства. В рабочих сценариях вы, скорее всего, будете использовать уровень служб "Стандартный" или "Премиум". Эти уровни обеспечивают расширенный уровень хранилища и пропускной способности.
Дополнительные сведения см. в уровнях служб реестра контейнеров Azure. Сведения о ценах см. в цены на реестр контейнеров Azure.
Создание экземпляра гибкого сервера PostgreSQL
Пример приложения (Django или Flask) хранит данные о проверке ресторанов в базе данных PostgreSQL. На этих шагах вы создадите сервер, который будет содержать базу данных.
Используйте команду az postgres flexible-server create, чтобы создать сервер PostgreSQL в Azure. Команда часто выполняется несколько минут, прежде чем завершится.
az postgres flexible-server create \ --resource-group pythoncontainer-rg \ --name <postgres-server-name> \ --location <location> \ --admin-user demoadmin \ --admin-password <admin-password> \ --active-directory-auth Enabled \ --tier burstable \ --sku-name standard_b1ms \ --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
и дефис (-
).<расположение>. Используйте то же расположение, которое использовалось для веб-приложения. <местоопределение> — это одно из значений
Name
для Azure, полученных из выходных данных командыaz account list-locations -o table
.<имя пользователя администратора>: имя пользователя для учетной записи администратора. Нельзя использовать
azure_superuser
,admin
,administrator
,root
,guest
илиpublic
. Используйтеdemoadmin
для этого руководства.<пароль администратора>: пароль пользователя администратора. Он должен содержать от 8 до 128 символов из трех следующих категорий: английские прописные буквы, строчные буквы, цифры и не буквенно-цифровые символы.
Внимание
При создании имен пользователей или паролей не использовать знак доллара ($). Позже при создании переменных среды с этими значениями этот символ имеет особое значение в контейнере Linux, используемом для запуска приложений Python.
--active-directory-auth
. Это значение указывает, включена ли проверка подлинности Microsoft Entra на сервере PostgreSQL. Задайте для него значениеEnabled
.--sku-name
: имя ценовой категории и конфигурации вычислений; например,Standard_B1ms
. Дополнительные сведения см. на странице цен на Базу данных Azure для PostgreSQL. Чтобы получить список доступных уровней, используйтеaz postgres flexible-server list-skus --location <location>
.--public-access
: используйте0.0.0.0
. Он разрешает общедоступный доступ к серверу из любой службы Azure, например приложений контейнеров.
Примечание.
Если вы планируете работать с сервером PostgreSQL с локальной рабочей станции, используя инструменты, необходимо добавить правило брандмауэра для IP-адреса вашей рабочей станции с помощью команды az postgres гибкий сервер firewall-rule create.
Используйте команду az ad signed-in-user show, чтобы получить идентификатор объекта вашего учётной записи. Этот идентификатор используется в следующей команде.
az ad signed-in-user show --query id --output tsv
Используйте команду az postgres flexible-server ad-admin create, чтобы добавить учетную запись пользователя в качестве администратора Microsoft Entra на сервере PostgreSQL:
az postgres flexible-server ad-admin create \ --resource-group pythoncontainer-rg \ --server-name <postgres-server-name> \ --display-name <your-email-address> \ --object-id <your-account-object-id>
Для идентификатора объекта учетной записи используйте значение, которое вы получили на предыдущем шаге.
Примечание.
В разделе описываются действия, в результате которых создается сервер PostgreSQL с одним виртуальным ядром и ограниченным объемом памяти в тарифной категории с поддержкой увеличения производительности. Уровень "Динамический" является более экономичным вариантом для рабочих нагрузок, которые не требуют постоянного полного использования ЦП и подходит для требований данного руководства. Для рабочих нагрузок можно перейти на ценовую категорию "Общего назначения" или "Оптимизированная для памяти". Эти уровни обеспечивают более высокую производительность, но повышают затраты.
Дополнительные сведения см. в статье Параметры вычислений в Базе данных Azure для PostgreSQL — гибкий сервер. Сведения о ценах см. цены на базу данных Azure для PostgreSQL.
Создание базы данных на сервере
На этом этапе у вас есть сервер PostgreSQL. В этом разделе описано, как создать базу данных на сервере.
Используйте команду az postgres flexible-server db create, чтобы создать базу данных с именем restaurants_reviews:
az postgres flexible-server db create \
--resource-group pythoncontainer-rg \
--server-name <postgres-server-name> \
--database-name restaurants_reviews
Используйте следующие значения:
-
pythoncontainer-rg
. Имя группы ресурсов, которое используется в этом руководстве. Если вы использовали другое имя, измените это значение. -
<postgres-server-name>
: имя сервера PostgreSQL.
Вы также можете использовать команду az postgres flexible-server connect для подключения к базе данных, а затем работать с командами psql . При работе с psql часто проще использовать Azure Cloud Shell, так как оболочка включает все зависимости.
Вы также можете подключиться к гибкому серверу Базы данных Azure для PostgreSQL и создать базу данных с помощью psql или интегрированной среды разработки, которая поддерживает PostgreSQL, например Azure Data Studio. Инструкции по использованию psql см. в статье Настройка управляемого удостоверения в базе данных PostgreSQL, далее в этой статье.
Создайте управляемое удостоверение, назначенное пользователем
Создайте управляемое удостоверение, назначаемое пользователем, для использования в качестве удостоверения для приложения-контейнера при запуске в Azure.
Примечание.
Чтобы создать управляемую идентичность, назначаемую пользователем, ваша учетная запись должна иметь назначение роли Участник Managed Identity.
Используйте команду az identity create, чтобы создать управляемое удостоверение, назначаемое пользователем:
az identity create --name my-ua-managed-id --resource-group pythoncontainer-rg
Настройка управляемого удостоверения в базе данных PostgreSQL
Настройте управляемое удостоверение в качестве роли на сервере PostgreSQL, а затем предоставьте необходимые разрешения для базы данных restaurants_reviews. Будь то использование Azure CLI или psql, необходимо подключиться к серверу Azure PostgreSQL, используя пользователя, назначенного администратором Microsoft Entra на вашем экземпляре сервера. Только учетные записи Microsoft Entra, настроенные в качестве администратора PostgreSQL, могут настраивать управляемые удостоверения и административные роли Microsoft на вашем сервере.
Получите токен доступа для учетной записи Azure с помощью команды az account get-access-token. Вы используете маркер доступа на следующих шагах.
az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken
Возвращенный маркер длинен. Задайте его значение в переменной среды для использования в командах на следующем шаге:
MY_ACCESS_TOKEN=<your-access-token>
Добавьте управляемое удостоверение, назначенное пользователем, как роль базы данных на вашем сервере PostgreSQL, используя команду az postgres flexible-server execute.
az postgres flexible-server execute \ --name <postgres-server-name> \ --database-name postgres \ --querytext "select * from pgaadauth_create_principal('"my-ua-managed-id"', false, false);select * from pgaadauth_list_principals(false);" \ --admin-user <your-Azure-account-email> \ --admin-password $MY_ACCESS_TOKEN
Используйте следующие значения:
Если вы использовали другое имя для вашего управляемого удостоверения, замените
my-ua-managed-id
в командеpgaadauth_create_principal
на имя вашего управляемого удостоверения.Для значения
--admin-user
используйте адрес электронной почты для учетной записи Azure.Для значения
--admin-password
используйте маркер доступа из выходных данных предыдущей команды без кавычки.Убедитесь, что имя базы данных
postgres
.
Примечание.
Если вы выполняете команду
az postgres flexible-server execute
на локальной рабочей станции, убедитесь, что вы добавили правило брандмауэра для IP-адреса рабочей станции. Правило можно добавить с помощью команды az postgres flexible-server firewall-rule create. То же требование также существует для команды на следующем шаге.Предоставьте управляемому удостоверению, назначенному пользователем, необходимые разрешения для базы данных restaurants_reviews с помощью следующей команды az postgres flexible-server execute.
az postgres flexible-server execute \ --name <postgres-server-name> \ --database-name restaurants_reviews \ --querytext "GRANT CONNECT ON DATABASE restaurants_reviews TO \"my-ua-managed-id\";GRANT USAGE ON SCHEMA public TO \"my-ua-managed-id\";GRANT CREATE ON SCHEMA public TO \"my-ua-managed-id\";GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"my-ua-managed-id\";ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO \"my-ua-managed-id\";" \ --admin-user <your-Azure-account-email> \ --admin-password $MY_ACCESS_TOKEN
Используйте следующие значения:
Если вы использовали другое имя управляемого удостоверения, замените все экземпляры
my-ua-managed-id
в команде именем управляемого удостоверения. В строке запроса есть пять случаев.Для значения
--admin-user
используйте адрес электронной почты учетной записи Azure.Для значения
--admin-password
используйте маркер доступа из предыдущих выходных данных без кавычки.Убедитесь, что имя базы данных
restaurants_reviews
.
Эта команда Azure CLI подключается к базе данных restaurants_reviews на сервере и выдает следующие команды SQL:
GRANT CONNECT ON DATABASE restaurants_reviews TO "my-ua-managed-id"; GRANT USAGE ON SCHEMA public TO "my-ua-managed-id"; GRANT CREATE ON SCHEMA public TO "my-ua-managed-id"; GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO "my-ua-managed-id"; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO "my-ua-managed-id";
Развертывание веб-приложения в приложениях-контейнерах
Контейнерные приложения развертываются в Azure Container Apps средах, которые служат безопасной границей. В следующих шагах вы создадите среду и контейнер внутри нее. Затем вы настроите контейнер таким образом, чтобы веб-сайт был виден внешне.
Для выполнения этих шагов требуется расширение Azure Container Apps, containerapp.
Создайте среду для контейнерных приложений с помощью команды az containerapp env create.
az containerapp env create \ --name python-container-env \ --resource-group pythoncontainer-rg \ --location <location>
<локация> — это одно из значений локации
Name
из выходных данных командыaz account list-locations -o table
.Получите учетные данные входа для экземпляра реестра контейнеров Azure с помощью команды az acr credential show:
az acr credential show -n <registry-name>
Вы используете имя пользователя и один из паролей, возвращаемых из выходных данных команды при создании приложения контейнера на шаге 5.
Используйте команду az identity show, чтобы получить идентификатор клиента и идентификатор ресурса пользовательской управляемой учётной записи.
az identity show --name my-ua-managed-id --resource-group pythoncontainer-rg --query "[clientId, id]" --output tsv
Вы используете значение идентификатора клиента (GUID) и идентификатор ресурса из выходных данных команды при создании приложения-контейнера на шаге 5. Идентификатор ресурса имеет следующую форму:
/subscriptions/<subscription-id>/resourcegroups/pythoncontainer-rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-ua-managed-id
.Выполните следующую команду, чтобы создать значение секретного ключа:
python -c 'import secrets; print(secrets.token_hex())'
Значение секретного ключа используется для задания переменной среды при создании приложения-контейнера на шаге 5.
Примечание.
Команда, показанная на этом шаге, предназначена для оболочки Bash. В зависимости от среды может потребоваться вызвать Python с помощью
python3
. В Windows необходимо заключить команду для параметра-c
в двойные кавычки вместо одинарных кавычек. Также может потребоваться вызвать Python с помощьюpy
илиpy -3
в зависимости от среды.Создайте приложение-контейнер в среде с помощью команды 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 <5000 for Flask or 8000 for Django> \ --registry-server <registry-name>.azurecr.io \ --registry-username <registry-username> \ --registry-password <registry-password> \ --user-assigned <managed-identity-resource-id> \ --query properties.configuration.ingress.fqdn \ --env-vars DBHOST="<postgres-server-name>" \ DBNAME="restaurants_reviews" \ DBUSER="my-ua-managed-id" \ RUNNING_IN_PRODUCTION="1" \ AZURE_CLIENT_ID="<managed-identity-client-id>" \ AZURE_SECRET_KEY="<your-secret-key>"
Обязательно замените все значения в угловых скобках значениями, которые вы используете в этом руководстве. Помните, что имя приложения-контейнера должно быть уникальным в Azure.
Значение параметра
--env-vars
— это строка, состоящая из разделенных пробелами значений в формате key="value" со следующими значениями:DBHOST="\<postgres-server-name>"
DBNAME="restaurants_reviews"
DBUSER="my-ua-managed-id"
RUNNING_IN_PRODUCTION="1"
AZURE_CLIENT_ID="\<managed-identity-client-id>"
AZURE_SECRET_KEY="\<your-secret-key>"
Значением для
DBUSER
является имя вашей управляемой идентичности, назначаемой пользователем.Значением
AZURE_CLIENT_ID
является идентификатор клиента вашей пользовательской управляемой идентичности. Это значение вы получили на предыдущем шаге.Значение
AZURE_SECRET_KEY
— это значение ключа секрета, созданное на предыдущем шаге.Выполните миграцию и создание схемы базы данных только для Django. (В примере приложения Flask оно выполняется автоматически, и вы можете пропустить этот шаг.)
Подключитесь с помощью команды az containerapp exec:
az containerapp exec \ --name python-container-app \ --resource-group pythoncontainer-rg
Затем в командной строке оболочки введите
python manage.py migrate
.Вам не нужно выполнять миграцию для редакций контейнера.
Проверьте веб-сайт.
Команда
az containerapp create
, введенная ранее, выводит URL-адрес приложения, который можно использовать для перехода к приложению. URL-адрес заканчиваетсяazurecontainerapps.io
. Перейдите по URL-адресу в браузере. Кроме того, можно использовать команду az containerapp browse .
Ниже приведен пример веб-сайта после добавления ресторана и двух отзывов.
Устранение неполадок с развертыванием
Вы забыли URL-адрес приложения для доступа к веб-сайту
На портале Azure:
- Перейдите на страницу обзора контейнерного приложения и найдите Url-адрес приложения .
В Visual Studio Code:
- Перейдите к представлению Azure (Ctrl+Shift+A) и разверните подписку, с которой вы работаете.
- Разверните узел контейнерных приложений , разверните управляемую среду, щелкните правой кнопкой мыши приложение python-container-app, а затем выберите Обзор. VS Code открывает браузер с URL-адресом приложения.
В 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"<имени>.azurecr.io", возникает при отключении учетных данных администратора в экземпляре реестра контейнеров Azure.
Чтобы проверить статус администратора на портале, перейдите к экземпляру реестра контейнеров Azure, выберите ресурс ключи доступа и убедитесь, что Администратор включен.
Образ контейнера не отображается в реестре контейнеров Azure
- Проверьте выходные данные команды Azure CLI или выходных данных VS Code и найдите сообщения, чтобы подтвердить успешность.
- Убедитесь, что имя реестра было указано правильно в команде сборки с помощью Azure CLI или в запросах задач VS Code.
- Убедитесь, что срок действия учетных данных не истек. Например, в VS Code найдите целевой реестр в расширении Docker и обновите его. В Azure CLI запустите
az login
.
Веб-сайт возвращает "Недопустимый запрос (400)"
Если вы получаете ошибку "Неправильный запрос (400)", проверьте переменные среды PostgreSQL, передаваемые в контейнер. Ошибка 400 часто указывает, что код Python не может подключиться к экземпляру PostgreSQL.
Пример кода, используемый в этом руководстве, проверяет наличие переменной среды контейнера RUNNING_IN_PRODUCTION
, которая может быть задана для любого значения (например, 1
).
Веб-сайт возвращает значение "Не найдено ( 404)"
- Проверьте значение URL приложения на странице "Обзор" контейнера. Если URL-адрес приложения содержит слово "internal", вход не настроен правильно.
- Проверьте входящий трафик контейнера. Например, на портале Azure перейдите к ресурсу Ingress контейнера. Убедитесь, что HTTP-вход включен и выбрана опция "Принимать трафик из любого места".
Веб-сайт не начинается, вы получаете "время ожидания потока", или ничего не возвращается
- Проверьте журналы:
- На портале Azure перейдите к ресурсу управления версиями приложения контейнера и проверьте состояние подготовки для контейнера:
- Если состояние — подготовка, дождитесь завершения подготовки.
- Если состояние ошибка, выберите версию и просмотрите журналы консоли. Выберите порядок столбцов для отображения времени создания, Stream_sи Log_s. Сортируйте журналы по самым последним записям и найдите сообщения Python
stderr
иstdout
в столбце Stream_s. Выходные данные Pythonprint
— это сообщенияstdout
.
- В Azure CLI используйте команду az containerapp logs show.
- На портале Azure перейдите к ресурсу управления версиями приложения контейнера и проверьте состояние подготовки для контейнера:
- Если вы используете платформу Django, проверьте, существуют ли в базе данных таблицы restaurants_reviews. В противном случае используйте консоль для доступа к контейнеру и запуска
python manage.py migrate
.