Создание и развертывание веб-приложения Flask Python в Azure с управляемым удостоверением, назначаемое системой
В этом руководстве вы развернете код Python Flask для создания и развертывания веб-приложения, работающего в службе приложение Azure. Веб-приложение использует управляемое удостоверение, назначаемое системой (без пароля), с помощью управления доступом на основе ролей Azure для доступа к служба хранилища Azure и База данных Azure для PostgreSQL — гибким ресурсам сервера. В коде используется класс DefaultAzureCredential клиентской библиотеки удостоверений Azure для Python. Класс DefaultAzureCredential
автоматически обнаруживает, что управляемое удостоверение существует для Служба приложений и использует его для доступа к другим ресурсам Azure.
Вы можете настроить бессерверные подключения к службам Azure с помощью соединителя служб или настроить их вручную. В этом руководстве показано, как использовать соединитель служб. Дополнительные сведения о бессерверных подключениях см. в разделе "Без пароля" для служб Azure. Сведения о соединителе службы см. в документации по соединителю службы.
В этом руководстве показано, как создать и развернуть веб-приложение Python с помощью Azure CLI. Команды, приведенные в этом руководстве, записываются для выполнения в оболочке Bash. Команды руководства можно выполнять в любой среде Bash с установленным интерфейсом командной строки, например локальной средой или Azure Cloud Shell. При некоторых изменениях, например, настройке и использовании переменных среды можно выполнять эти команды в других средах, таких как командная оболочка Windows. Примеры использования управляемого удостоверения, назначаемого пользователем, см. в статье "Создание и развертывание веб-приложения Django в Azure с управляемым удостоверением, назначенным пользователем".
Получение примера приложения
Пример приложения Python с помощью платформы Flask доступен для выполнения работы с этим руководством. Скачайте или клонируйте один из примеров приложений на локальную рабочую станцию.
Клонируйте пример в сеансе Azure Cloud Shell.
git clone https://github.com/Azure-Samples/msdocs-flask-web-app-managed-identity.git
Перейдите в папку приложения.
cd msdocs-flask-web-app-managed-identity
Проверка кода проверки подлинности
Пример веб-приложения должен пройти проверку подлинности в двух разных хранилищах данных:
- Сервер хранилища BLOB-объектов Azure, где он хранит и извлекает фотографии, отправленные рецензентами.
- База данных Azure для PostgreSQL — гибкая база данных сервера, в которой хранятся рестораны и отзывы.
Он использует DefaultAzureCredential для проверки подлинности в обоих хранилищах данных. С DefaultAzureCredential
помощью приложения можно настроить запуск под удостоверением разных субъектов-служб в зависимости от среды, в которой она выполняется, без внесения изменений в код. Например, в локальной среде разработки приложение может работать под удостоверением разработчика, вошедшего в Azure CLI, в то время как в этом руководстве оно может выполняться под управляемым удостоверением, назначаемым системой.
В любом случае субъект безопасности, на котором выполняется приложение, должен иметь роль в каждом ресурсе Azure, который использует приложение, которое позволяет ему выполнять действия по ресурсу, который требуется приложению. В этом руководстве вы используете соединители служб для автоматического включения назначаемого системой управляемого удостоверения в приложении в Azure и назначения соответствующих ролей удостоверения в учетной записи хранения Azure и База данных Azure для PostgreSQL сервера.
После включения назначаемого системой управляемого удостоверения и назначения соответствующих ролей в хранилищах данных можно использовать DefaultAzureCredential
для проверки подлинности с помощью необходимых ресурсов Azure.
Следующий код используется для создания клиента хранилища BLOB-объектов для отправки фотографий в app.py
. Экземпляр DefaultAzureCredential
предоставляется клиенту, который используется для получения маркеров доступа для выполнения операций с хранилищем Azure.
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
azure_credential = DefaultAzureCredential()
blob_service_client = BlobServiceClient(
account_url=account_url,
credential=azure_credential)
Экземпляр DefaultAzureCredential
также используется для получения маркера доступа для База данных Azure для PostgreSQL../azureproject/get_conn.py
В этом случае маркер получается непосредственно путем вызова get_token в экземпляре учетных данных и передачи соответствующего scope
значения. Затем маркер используется вместо пароля в URI подключения PostgreSQL, возвращенном вызывающей объекту.
azure_credential = DefaultAzureCredential()
token = azure_credential.get_token("https://ossrdbms-aad.database.windows.net")
conn = str(current_app.config.get('DATABASE_URI')).replace('PASSWORDORTOKEN', token.token)
Дополнительные сведения о проверке подлинности приложений с помощью служб Azure см. в статье "Проверка подлинности приложений Python в службах Azure" с помощью azure SDK для Python. Дополнительные сведения о DefaultAzureCredential
настройке цепочки учетных данных для вашей среды см. в обзоре DefaultAzureCredential.
Создание сервера Azure PostgreSQL
Настройте переменные среды, необходимые для руководства.
LOCATION="eastus" 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="ChAnG33#ThsPssWD$RAND_ID"
Внимание
Должны
ADMIN_PW
содержать от 8 до 128 символов из трех из следующих категорий: английские прописные буквы, строчные буквы, цифры и нефазные цифры. При создании имен пользователей или паролей символ$
не используется. Позже вы создадите переменные среды с этими значениями, где символу$
отведена особая роль в контейнере Linux, используемом для запуска приложений Python.Создайте группу ресурсов с помощью команды az group create.
az group create --location $LOCATION --name $RESOURCE_GROUP_NAME
Создайте сервер PostgreSQL с помощью команды az postgres flexible-server create . (Эти и последующие команды используют символ продолжения строки для оболочки Bash ('\). При необходимости измените символ продолжения строки для оболочки.)
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
Имя SKU — это имя ценовой категории и конфигурации вычислений. Дополнительные сведения см. на странице цен на Базу данных Azure для PostgreSQL. Чтобы получить список доступных номеров SKU, используйте
az postgres flexible-server list-skus --location $LOCATION
.Создайте базу данных с именем
restaurant
с помощью команды 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;'
Создание службы приложение Azure и развертывание кода
Создайте службу приложений с помощью команды az webapp up .
az webapp up \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --runtime PYTHON:3.9 \ --sku B1
SKU определяет размер (ЦП, память) и стоимость плана службы приложений. План обслуживания B1 (базовый) несет небольшую стоимость в подписке Azure. Полный список планов службы приложений см. на странице цен на Службу приложений.
Настройте Служба приложений для использования start.sh в репозитории с помощью команды az webapp config set.
az webapp config set \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --startup-file "start.sh"
Создание соединителей без пароля для ресурсов Azure
Команды Соединителя служб настраивают служба хранилища Azure и База данных Azure для PostgreSQL ресурсы для использования управляемого удостоверения и управления доступом на основе ролей Azure. Команды создают параметры приложения в Служба приложений, которые подключают веб-приложение к этим ресурсам. Выходные данные из команд перечисляют действия соединителя службы, выполняемые для включения возможности без пароля.
Добавьте соединитель службы PostgreSQL с помощью команды az webapp connection create postgres-flexible command. Управляемое удостоверение, назначаемое системой, используется для проверки подлинности веб-приложения в целевом ресурсе PostgreSQL в этом случае.
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
Добавьте соединитель службы хранилища с помощью команды az webapp connection create storage-blob .
Эта команда также добавляет учетную запись хранения и добавляет веб-приложение с участником данных BLOB-объектов хранилища ролей в учетную запись хранения.
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))
Создание контейнера в учетной записи хранения
Пример приложения Python хранит фотографии, отправленные рецензентами в виде больших двоичных объектов в контейнере в учетной записи хранения.
Когда пользователь отправляет фотографию с проверкой, пример приложения записывает изображение в контейнер с помощью управляемого удостоверения, назначаемого системой, для проверки подлинности и авторизации. Вы настроили эту функцию в последнем разделе.
Когда пользователь просматривает отзывы о ресторане, приложение возвращает ссылку на фотографию в хранилище BLOB-объектов для каждой проверки, связанной с ней. Чтобы браузер отображал фотографию, он должен иметь доступ к нему в вашей учетной записи хранения. Данные BLOB-объектов должны быть доступны для общедоступного чтения с помощью анонимного (неуверенного) доступа.
Для повышения безопасности учетные записи хранения создаются с анонимным доступом к данным BLOB-объектов, отключенным по умолчанию. В этом разделе описано, как включить анонимный доступ на чтение в учетной записи хранения, а затем создать контейнер с именами фотографий , предоставляющих общедоступный (анонимный) доступ к большим двоичным объектам.
Обновите учетную запись хранения, чтобы разрешить анонимный доступ на чтение к blob-объектам с помощью команды az storage account update .
az storage account update \ --name $STORAGE_ACCOUNT_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --allow-blob-public-access true
Включение анонимного доступа в учетной записи хранения не влияет на доступ для отдельных BLOB-объектов. Необходимо явно включить общедоступный доступ к BLOB-объектам на уровне контейнера.
Создайте контейнер с именем "фотографии " в учетной записи хранения с помощью команды az storage container create . Разрешить анонимный доступ на чтение (общедоступную) к blob-объектам в только что созданном контейнере.
az storage container create \ --account-name $STORAGE_ACCOUNT_NAME \ --name photos \ --public-access blob \ --account-key $(az storage account keys list --account-name $STORAGE_ACCOUNT_NAME \ --query [0].value --output tsv)
Примечание.
Для краткости эта команда использует ключ учетной записи хранения для авторизации с учетной записью хранения. Для большинства сценариев рекомендуемый подход Майкрософт — использовать роли Microsoft Entra ID и Azure (RBAC). Краткий набор инструкций см . в кратком руководстве. Создание, скачивание и перечисление больших двоичных объектов с помощью Azure CLI. Обратите внимание, что несколько ролей Azure позволяют создавать контейнеры в учетной записи хранения, включая "Владелец", "Участник", "Владелец данных BLOB-объектов хранилища" и "Участник данных BLOB-объектов хранилища".
Дополнительные сведения о анонимном доступе на чтение к данным BLOB-объектов см. в статье Настройка анонимного доступа на чтение для контейнеров и БОЛЬШИХ двоичных объектов.
Тестирование веб-приложения Python в Azure
В примере приложения Python используется пакет azure.identity и его DefaultAzureCredential
класс. Когда приложение запущено в Azure, автоматически обнаруживает, DefaultAzureCredential
существует ли управляемое удостоверение для Служба приложений и, если это так, использует его для доступа к другим ресурсам Azure (хранилище и PostgreSQL в этом случае). Нет необходимости предоставлять ключи хранения, сертификаты или учетные данные Служба приложений для доступа к этим ресурсам.
Перейдите к развернутом приложению по URL-адресу
http://$APP_SERVICE_NAME.azurewebsites.net
.Для запуска приложения может потребоваться несколько минут. Если вы видите страницу приложения по умолчанию, которая не является образцом приложения по умолчанию, подождите минуту и обновите браузер.
Проверьте функциональные возможности примера приложения, добавив ресторан и некоторые отзывы с фотографиями для ресторана.
Сведения о ресторане и обзоре хранятся в База данных Azure для PostgreSQL, а фотографии хранятся в служба хранилища Azure. Ниже приведен пример снимка экрана:
Очистка
В этом руководстве все ресурсы Azure были созданы в одной группе ресурсов. При удалении группы ресурсов команда az group delete удаляет все ресурсы в группе ресурсов и является самым быстрым способом удаления всех ресурсов Azure, используемых для приложения.
az group delete --name $RESOURCE_GROUP_NAME
При необходимости можно добавить аргумент --no-wait
, чтобы команда возвращала данные до завершения операции.