Создание и развертывание веб-приложения Django в Azure с помощью управляемого удостоверения, назначаемого пользователем
В этом руководстве описано, как развернуть веб-приложение Django в службе приложение Azure. Веб-приложение использует управляемое удостоверение, назначаемое пользователем (подключения без пароля) с помощью управления доступом на основе ролей Azure для доступа к служба хранилища Azure и База данных Azure для PostgreSQL — гибким ресурсам сервера. В коде используется класс DefaultAzureCredential клиентской библиотеки удостоверений Azure для Python. Класс DefaultAzureCredential
автоматически обнаруживает, что управляемое удостоверение существует для Служба приложений и использует его для доступа к другим ресурсам Azure.
В этом руководстве вы создадите управляемое удостоверение, назначаемое пользователем, и назначите его Служба приложений, чтобы получить доступ к ресурсам базы данных и учетной записи хранения. Пример использования управляемого удостоверения, назначаемого системой, см. в статье "Создание и развертывание веб-приложения Flask Python в Azure с управляемым удостоверением, назначаемое системой". Управляемые удостоверения, назначаемые пользователем, рекомендуются, так как их можно использовать несколькими ресурсами, и их жизненный цикл отделяется от жизненных циклов ресурсов, с которыми они связаны. Дополнительные сведения о рекомендациях по использованию управляемых удостоверений см . в рекомендациях по использованию управляемых удостоверений.
В этом руководстве показано, как развернуть веб-приложение Python и создать ресурсы Azure с помощью Azure CLI. Команды, приведенные в этом руководстве, записываются для выполнения в оболочке Bash. Команды руководства можно выполнять в любой среде Bash с установленным интерфейсом командной строки, например локальной средой или Azure Cloud Shell. При некоторых изменениях, например, настройке и использовании переменных среды можно выполнять эти команды в других средах, таких как командная оболочка Windows.
Получение примера приложения
Используйте пример примера приложения Django, чтобы следовать вместе с этим руководством. Скачайте или клонируйте пример приложения в среду разработки.
Клонируйте пример.
git clone https://github.com/Azure-Samples/msdocs-django-web-app-managed-identity.git
Перейдите в папку приложения.
cd msdocs-django-web-app-managed-identity
Проверка кода проверки подлинности
Пример веб-приложения должен пройти проверку подлинности в двух разных хранилищах данных:
- Сервер хранилища BLOB-объектов Azure, где он хранит и извлекает фотографии, отправленные рецензентами.
- База данных Azure для PostgreSQL — гибкая база данных сервера, в которой хранятся рестораны и отзывы.
Он использует DefaultAzureCredential для проверки подлинности в обоих хранилищах данных. С DefaultAzureCredential
помощью приложения можно настроить запуск под удостоверением разных субъектов-служб в зависимости от среды, в которой она выполняется, без внесения изменений в код. Например, в локальной среде разработки приложение может выполняться под удостоверением разработчика, выполнившего вход в Azure CLI, в то время как в Azure, как и в этом руководстве, оно может выполняться под управляемым удостоверением, назначаемым пользователем.
В любом случае субъект безопасности, на котором выполняется приложение, должен иметь роль в каждом ресурсе Azure, который использует приложение, которое позволяет ему выполнять действия по ресурсу, который требуется приложению. В этом руководстве вы используете команды Azure CLI, чтобы создать управляемое удостоверение, назначаемое пользователем, и назначить его приложению в Azure. Затем вы вручную назначите соответствующие роли удостоверений в учетной записи хранения Azure и сервере База данных Azure для PostgreSQL. Наконец, вы задали AZURE_CLIENT_ID
переменную среды для приложения в Azure, чтобы настроить DefaultAzureCredential
использование управляемого удостоверения.
После настройки управляемого удостоверения, назначаемого пользователем, в приложении и его среде выполнения и назначения соответствующих ролей в хранилищах данных можно использовать DefaultAzureCredential
для проверки подлинности с необходимыми ресурсами Azure.
Следующий код используется для создания клиента хранилища BLOB-объектов для отправки фотографий в ./restaurant_review/views.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")
conf.settings.DATABASES['default']['PASSWORD'] = 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" UA_NAME="UAManagedIdentityPythonTest$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 \ --active-directory-auth Enabled \ --public-access 0.0.0.0
Имя SKU — это имя ценовой категории и конфигурации вычислений. Дополнительные сведения см. на странице цен на Базу данных Azure для PostgreSQL. Чтобы получить список доступных номеров SKU, используйте
az postgres flexible-server list-skus --location $LOCATION
.Добавьте свою учетную запись Azure в качестве администратора Microsoft Entra для сервера с помощью команды az postgres flexible-server ad-admin create .
ACCOUNT_EMAIL=$(az ad signed-in-user show --query userPrincipalName --output tsv) ACCOUNT_ID=$(az ad signed-in-user show --query id --output tsv) echo $ACCOUNT_EMAIL, $ACCOUNT_ID az postgres flexible-server ad-admin create \ --resource-group $RESOURCE_GROUP_NAME \ --server-name $DB_SERVER_NAME \ --display-name $ACCOUNT_EMAIL \ --object-id $ACCOUNT_ID \ --type User
Настройте правило брандмауэра на сервере с помощью команды az postgres flexible-server firewall-rule create . Это правило позволяет локальной среде подключаться к серверу. (Если вы используете Azure Cloud Shell, вы можете пропустить этот шаг.)
IP_ADDRESS=<your IP> az postgres flexible-server firewall-rule create \ --resource-group $RESOURCE_GROUP_NAME \ --name $DB_SERVER_NAME \ --rule-name AllowMyIP \ --start-ip-address $IP_ADDRESS \ --end-ip-address $IP_ADDRESS
Используйте любое средство или веб-сайт, отображающий IP-адрес для замены
<your IP>
в команде. Например, вы можете использовать веб-сайт What's My IP Address?Создайте базу данных с именем
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 \ --location $LOCATION \ --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.
Когда пользователь отправляет фотографию с проверкой, пример приложения записывает изображение в контейнер с помощью управляемого удостоверения и
DefaultAzureCredential
доступа к учетной записи хранения.Когда пользователь просматривает отзывы о ресторане, приложение возвращает ссылку на фотографию в хранилище BLOB-объектов для каждой проверки, связанной с ней. Чтобы браузер отображал фотографию, он должен иметь доступ к нему в вашей учетной записи хранения. Данные BLOB-объектов должны быть доступны для общедоступного чтения с помощью анонимного (неуверенного) доступа.
В этом разделе описано, как создать учетную запись хранения и контейнер, который разрешает общедоступный доступ на чтение к blob-объектам в контейнере. В последующих разделах вы создадите управляемое удостоверение, назначаемое пользователем, и настройте его для записи больших двоичных объектов в учетную запись хранения.
Используйте команду az storage create для создания учетной записи хранения.
STORAGE_ACCOUNT_NAME="msdocsstorage$RAND_ID" az storage account create \ --name $STORAGE_ACCOUNT_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --location $LOCATION \ --sku Standard_LRS \ --allow-blob-public-access true
Создайте контейнер с именем "фотографии " в учетной записи хранения с помощью команды az storage container create .
az storage container create \ --account-name $STORAGE_ACCOUNT_NAME \ --name photos \ --public-access blob \ --auth-mode login
Примечание.
Если команда завершается ошибкой, например при возникновении ошибки, указывающей, что запрос может быть заблокирован сетевыми правилами учетной записи хранения, введите следующую команду, чтобы убедиться, что учетная запись пользователя Azure назначена роль Azure с разрешением на создание контейнера.
az role assignment create --role "Storage Blob Data Contributor" --assignee $ACCOUNT_EMAIL --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Storage/storageAccounts/$STORAGE_ACCOUNT_NAME"
Дополнительные сведения см . в кратком руководстве. Создание, скачивание и перечисление больших двоичных объектов с помощью Azure CLI. Обратите внимание, что несколько ролей Azure позволяют создавать контейнеры в учетной записи хранения, включая "Владелец", "Участник", "Владелец данных BLOB-объектов хранилища" и "Участник данных BLOB-объектов хранилища".
Создание управляемого удостоверения, назначаемого пользователем
Создайте управляемое удостоверение, назначаемое пользователем, и назначьте его Служба приложений. Управляемое удостоверение используется для доступа к базе данных и учетной записи хранения.
Используйте команду az identity create, чтобы создать управляемое удостоверение, назначаемое пользователем, и вывести идентификатор клиента в переменную для последующего использования.
UA_CLIENT_ID=$(az identity create --name $UA_NAME --resource-group $RESOURCE_GROUP_NAME --query clientId --output tsv) echo $UA_CLIENT_ID
Используйте команду az account show, чтобы получить идентификатор подписки и вывести ее в переменную, которую можно использовать для создания идентификатора ресурса управляемого удостоверения.
SUBSCRIPTION_ID=$(az account show --query id --output tsv) RESOURCE_ID="/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$UA_NAME" echo $RESOURCE_ID
Назначьте управляемое удостоверение Служба приложений с помощью команды az webapp identity assign.
export MSYS_NO_PATHCONV=1 az webapp identity assign \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --identities $RESOURCE_ID
Создайте параметры приложения Служба приложений, содержащие идентификатор клиента управляемого удостоверения и другие сведения о конфигурации с помощью команды az webapp config appsettings set.
az webapp config appsettings set \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --settings AZURE_CLIENT_ID=$UA_CLIENT_ID \ STORAGE_ACCOUNT_NAME=$STORAGE_ACCOUNT_NAME \ STORAGE_CONTAINER_NAME=photos \ DBHOST=$DB_SERVER_NAME \ DBNAME=restaurant \ DBUSER=$UA_NAME
В примере приложения используются переменные среды (параметры приложения) для определения сведений о подключении для базы данных и учетной записи хранения, но эти переменные не включают пароли. Вместо этого проверка подлинности выполняется без пароля.DefaultAzureCredential
Пример кода приложения использует DefaultAzureCredential
конструктор классов без передачи идентификатора клиента управляемого удостоверения, назначаемого пользователем, конструктору. В этом сценарии резервный вариант — проверить AZURE_CLIENT_ID
переменную среды, которую вы задаете в качестве параметра приложения.
Если переменная среды не существует, управляемое AZURE_CLIENT_ID
удостоверение, назначаемое системой, используется, если оно настроено. Дополнительные сведения см. в разделе "Введение DefaultAzureCredential".
Создание ролей для управляемого удостоверения
В этом разделе описано, как создать назначения ролей для управляемого удостоверения, чтобы обеспечить доступ к учетной записи хранения и базе данных.
Создайте назначение ролей для управляемого удостоверения, чтобы разрешить доступ к учетной записи хранения с помощью команды az role assignment create .
export MSYS_NO_PATHCONV=1 az role assignment create \ --assignee $UA_CLIENT_ID \ --role "Storage Blob Data Contributor" \ --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCE_GROUP_NAME"
Команда указывает область назначения роли группе ресурсов. Дополнительные сведения см. в разделе "Общие сведения о назначениях ролей".
Используйте команду az postgres flexible-server execute, чтобы подключиться к базе данных Postgres и выполнить те же команды, чтобы назначить роли управляемому удостоверению.
ACCOUNT_EMAIL_TOKEN=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) az postgres flexible-server execute \ --name $DB_SERVER_NAME \ --admin-user $ACCOUNT_EMAIL \ --admin-password $ACCOUNT_EMAIL_TOKEN \ --database-name postgres \ --querytext "select * from pgaadauth_create_principal('"$UA_NAME"', false, false);select * from pgaadauth_list_principals(false);"
Если у вас возникли проблемы с выполнением команды, убедитесь, что вы добавили свою учетную запись пользователя в качестве администратора Microsoft Entra для сервера PosgreSQL и что вы разрешили доступ к IP-адресу в правилах брандмауэра. Дополнительные сведения см. в разделе "Создание гибкого сервера Azure PostgreSQL".
Тестирование веб-приложения 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
, чтобы команда возвращала данные до завершения операции.