Создание и развертывание веб-приложения Python с помощью приложений контейнеров Azure и PostgreSQL
Эта статья является частью руководства по контейнеризации и развертыванию веб-приложения Python в приложениях контейнеров Azure. Контейнерные приложения позволяют развертывать контейнерные приложения без управления сложной инфраструктурой.
В этой части руководства вы узнаете, как контейнеризировать и развернуть пример веб-приложения Python (Django или Flask). В частности, вы создаете образ контейнера в облаке и развертываете его в приложениях контейнеров Azure. Вы определяете переменные среды, позволяющие приложению-контейнеру подключаться к База данных Azure для PostgreSQL — гибкому экземпляру сервера, где пример приложения хранит данные.
На этой схеме службы выделены компоненты, описанные в этой статье: создание и развертывание образа контейнера.
Получение примера приложения
Вилку и клонируйте пример кода в среду разработчика.
Шаг 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 .
Ниже приведен пример примера веб-сайта после добавления ресторана и двух отзывов.
Устранение неполадок с развертыванием
Вы забыли 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 .
- В портал Azure перейдите к ресурсу управления редакцией приложения-контейнера и проверка состояние подготовки контейнера.
- Если используется платформа Django, проверка, чтобы узнать, существуют ли в базе данных таблицы restaurants_reviews. В противном случае используйте консоль для доступа к контейнеру и запуска
python manage.py migrate
.
- Проверьте журналы.
Следующий шаг
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по