Поделиться через


Создание и развертывание веб-приложения Django в Azure с помощью управляемого удостоверения, назначаемого пользователем

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

В этом руководстве вы создадите управляемое удостоверение, назначаемое пользователем, и прикрепите его к службе приложений, чтобы она могла получить доступ к ресурсам базы данных и учетной записи хранения. Пример использования управляемого удостоверения, назначаемого системой, см. в статье "Создание и развертывание веб-приложения Flask Python в Azure с управляемым удостоверением, назначаемое системой". Назначенные пользователями идентичности рекомендуется использовать, так как их может использовать несколько ресурсов, и их жизненный цикл отделен от жизненных циклов ресурсов, с которыми они ассоциированы. Для получения дополнительной информации о лучших методах использования управляемых удостоверений смотрите Рекомендации по лучшему применению управляемых удостоверений.

В этом руководстве показано, как развернуть Python-веб-приложение и создать ресурсы Azure с помощью Azure CLI. Команды, приведенные в этом руководстве, записываются для выполнения в оболочке Bash. Команды руководства можно выполнять в любой среде Bash с установленным интерфейсом командной строки, например локальной средой или Azure Cloud Shell. При некоторых изменениях, например, настройке и использовании переменных среды можно выполнять эти команды в других средах, таких как командная оболочка Windows.

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

Используйте пример примера приложения Django, чтобы следовать вместе с этим руководством. Скачайте или клонируйте пример приложения в среду разработки.

  1. Клонируйте пример.

    git clone https://github.com/Azure-Samples/msdocs-django-web-app-managed-identity.git
    
  2. Перейдите в папку приложения.

    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

  1. Настройте переменные среды, необходимые для руководства.

    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.

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

    az group create --location $LOCATION --name $RESOURCE_GROUP_NAME
    
  3. Создайте гибкий сервер 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-name — это название ценового уровня и конфигурации вычислений. Дополнительные сведения можно найти на странице ценообразование Azure Database для PostgreSQL. Чтобы перечислить доступные SKU, используйте az postgres flexible-server list-skus --location $LOCATION.

  4. Добавьте свою учетную запись 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
    
  5. Настройте правило брандмауэра на сервере с помощью команды 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?.

  6. Создайте базу данных с именем 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 и развертывание кода

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

  1. Создайте службу приложений с помощью команды 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. Полный список планов службы приложений см. на странице цены на Службу приложений.

  2. Настройте службу приложений для использования 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-объектам в контейнере. В последующих разделах вы создадите пользовательское управляемое удостоверение и настроите его для записи блобов в учетную запись хранения.

  1. Используйте команду 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
    
  2. Создайте контейнер с именем "photos" в учетной записи хранения с помощью команды az storage container create.

    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --auth-mode login
    

    Примечание.

    Если команда завершается ошибкой, например, если возникает ошибка, указывающая, что запрос может быть заблокирован сетевыми правилами внутри учетной записи хранения, введите следующую команду, чтобы убедиться, что вашей учетной записи 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-объектов хранилища".

Создание пользователем назначаемого управляемого удостоверения

Создайте управляемую пользователем идентичность и назначьте её Службе приложений. Управляемое удостоверение используется для доступа к базе данных и хранилищу.

  1. Используйте команду 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
    
  2. Используйте команду 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
    
  3. Назначьте управляемое удостоверение для службы приложений с помощью команды 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
    
  4. Создайте параметры приложения в Службе приложений, которые содержат идентификатор клиента управляемого удостоверения и другую информацию о конфигурации, с помощью команды 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 переменную среды, которую вы задаете в качестве настройки приложения.

Если переменная среды не существует, используется управляемое удостоверение, назначенное системой, если оно настроено. Для получения дополнительной информации см. статью "Introducing DefaultAzureCredential".

Создание ролей для управляемого удостоверения

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

  1. Создайте назначение ролей для управляемого удостоверения, чтобы разрешить доступ к учетной записи хранения с помощью команды 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"
    

    Команда указывает область назначения роли группе ресурсов. Дополнительные сведения см. в разделе "Общие сведения о назначениях ролей".

  2. Используйте команду 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 и его класс. Когда приложение запущено в Azure, DefaultAzureCredential автоматически определяет, существует ли управляемое удостоверение для Службы приложений, и при наличии использует его для доступа к другим ресурсам Azure (в данном случае хранилище и PostgreSQL). Нет необходимости предоставлять ключи хранения, сертификаты или учетные данные Службе приложений для доступа к этим ресурсам.

  1. Перейдите к развернутому приложению по URL-адресу http://$APP_SERVICE_NAME.azurewebsites.net.

    Для запуска приложения может потребоваться несколько минут. Если вы видите страницу приложения по умолчанию, которая не является образцом приложения по умолчанию, подождите минуту и обновите браузер.

  2. Проверьте функциональные возможности примера приложения, добавив ресторан и некоторые отзывы с фотографиями для ресторана.

    Сведения о ресторане и обзоре хранятся в База данных Azure для PostgreSQL, а фотографии хранятся в служба хранилища Azure. Ниже приведен пример снимка экрана:

    Screenshot of the sample app showing restaurant review functionality using Azure App Service, Azure PostgreSQL Database, and Azure Storage.Снимок экрана: пример приложения с функциями проверки ресторанов с помощью службы приложение Azure, Azure Postgre База данных SQL и служба хранилища Azure.

Очистка

В этом руководстве все ресурсы Azure были созданы в одной группе ресурсов. При удалении группы ресурсов с помощью команды az group delete, она удаляет все ресурсы в группе ресурсов, и это самый быстрый способ удалить все ресурсы Azure, используемые для вашего приложения.

az group delete  --name $RESOURCE_GROUP_NAME 

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

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

  • Создать и развернуть веб-приложение Flask в Azure с системным управляемым удостоверением

  • Развернуть веб-приложение на Python (Django или Flask) с PostgreSQL в службе приложений Azure