Создание и развертывание веб-приложения 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, чтобы следовать вместе с этим руководством. Скачайте или клонируйте пример приложения в среду разработки.

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

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

    cd msdocs-django-web-app-managed-identity
    

Создание гибкого сервера 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 — это имя ценовой категории и конфигурации вычислений. Дополнительные сведения см. на странице цен на Базу данных Azure для 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-объектов должны быть доступны для общедоступного чтения с помощью анонимного (неуверенного) доступа.

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

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

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

  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, которая устанавливается в качестве параметра приложения.

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

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

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

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

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

    Снимок экрана: пример приложения с функциями проверки ресторанов с помощью службы приложение Azure, Azure Postgre База данных SQL и служба хранилища Azure.

Очистка

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

az group delete  --name $RESOURCE_GROUP_NAME 

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

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