Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой части серии руководств вы узнаете, как развернуть контейнерное веб-приложение Python в веб-приложении службы приложений Azure для контейнеров. Эта полностью управляемая служба позволяет запускать контейнерные приложения без необходимости поддерживать собственный оркестратор контейнеров.
Служба приложений упрощает развертывание с помощью конвейеров непрерывной интеграции и непрерывного развертывания (CI/CD), работающих с Docker Hub, реестром контейнеров Azure, Azure Key Vault и другими средствами DevOps. Это руководство является частью 4 из 5-частной серии руководств.
В конце этой статьи у вас есть безопасное веб-приложение службы приложений, готовое к использованию в производственной среде и запускаемое из образа контейнера Docker. Приложение использует управляемое удостоверение, назначаемое системой , для извлечения образа из реестра контейнеров Azure и получения секретов из Azure Key Vault.
На этой схеме службы выделены компоненты, описанные в этой статье.
Команды Azure CLI можно запускать в Azure Cloud Shell или на локальном компьютере с установленным Azure CLI.
Важный
Мы рекомендуем использовать Azure Cloud Shell для всех шагов на основе ИНТЕРФЕЙСА командной строки, описанных в этом руководстве.
- Уже подтверждена подлинность с вашей учетной записью Azure, что позволяет избегать проблем с входом.
- Включает все необходимые расширения Azure CLI без дополнительных настроек
- Обеспечивает согласованное поведение независимо от локальной ОС или среды.
- Не требует локальной установки, идеально подходит для пользователей без прав администратора.
- Предоставляет прямой доступ к службам Azure на портале— не требуется локальная настройка Docker или сеть
- Избегает проблем с локальной конфигурацией брандмауэра или сети
Создание Key Vault с авторизацией RBAC
Azure Key Vault — это безопасная служба для хранения секретов, ключей API, строк подключения и сертификатов. В этом скрипте хранится строка подключения MongoDB и веб-приложение SECRET_KEY
.
Key Vault настроено использовать управление доступом на основе ролей (RBAC) для управления доступом с помощью ролей Azure вместо традиционных политик доступа. Веб-приложение использует системно назначенное управляемое удостоверение для безопасного получения секретов во время исполнения.
Заметка
Раннее создание хранилища ключей обеспечивает возможность назначения ролей до любой попытки доступа к секретам. Это также помогает избежать задержек при распределении ролей. Поскольку Key Vault не зависит от службы приложений, его ранняя настройка повышает надежность и упорядоченность.
На этом шаге вы используете команду az keyvault create для создания Azure Key Vault с включенным RBAC.
#!/bin/bash RESOURCE_GROUP_NAME="msdocs-web-app-rg" LOCATION="westus" KEYVAULT_NAME="${RESOURCE_GROUP_NAME}-kv" az keyvault create \ --name "$KEYVAULT_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --location "$LOCATION" \ --enable-rbac-authorization true
Создание плана службы приложений и веб-приложения
План службы приложений определяет вычислительные ресурсы, ценовую категорию и регион для веб-приложения. Веб-приложение запускает контейнерное приложение и оснащается системно назначаемым управляемым удостоверением, которое используется для безопасной аутентификации в Реестре контейнеров Azure (ACR) и Azure Key Vault.
На этом шаге выполняются следующие задачи:
- Создание плана службы приложений
- Создайте веб-приложение с управляемым удостоверением
- Настройка веб-приложения для развертывания с помощью определенного образа контейнера
- Подготовка к непрерывному развертыванию с помощью ACR
Заметка
Перед назначением доступа к ACR или Key Vault необходимо создать веб-приложение, так как управляемое удостоверение создается только во время развертывания. Кроме того, назначение образа контейнера во время создания гарантирует правильность запуска приложения с предполагаемой конфигурацией.
На этом шаге вы используете команду az appservice plan create для подготовки вычислительной среды для приложения.
#!/bin/bash APP_SERVICE_PLAN_NAME="msdocs-web-app-plan" az appservice plan create \ --name "$APP_SERVICE_PLAN_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --sku B1 \ --is-linux
На этом шаге вы используете команду az webapp create для создания веб-приложения. Эта команда также включает управляемое удостоверение, назначаемое системой и задает образ контейнера для запуска приложения.
#!/bin/bash APP_SERVICE_NAME="msdocs-website-name" #APP_SERVICE_NAME must be globally unique as it becomes the website name in the URL `https://<website-name>.azurewebsites.net`. # Use the same registry name as in part 2 of this tutorial series. REGISTRY_NAME="msdocscontainerregistryname" #REGISTRY_NAME is the registry name you used in part 2 of this tutorial. CONTAINER_NAME="$REGISTRY_NAME.azurecr.io/msdocspythoncontainerwebapp:latest" #CONTAINER_NAME is of the form "yourregistryname.azurecr.io/repo_name:tag". az webapp create \ --resource-group "$RESOURCE_GROUP_NAME" \ --plan "$APP_SERVICE_PLAN_NAME" \ --name "$APP_SERVICE_NAME" \ --assign-identity '[system]' \ --deployment-container-image-name "$CONTAINER_NAME"
Заметка
При выполнении этой команды может возникнуть следующая ошибка:
No credential was provided to access Azure Container Registry. Trying to look up... Retrieving credentials failed with an exception:'Failed to retrieve container registry credentials. Please either provide the credentials or run 'az acr update -n msdocscontainerregistryname --admin-enabled true' to enable admin first.'
Эта ошибка возникает, так как веб-приложение пытается использовать учетные данные администратора для доступа к ACR, учетные данные которых отключены по умолчанию. Это сообщение безопасно игнорировать: следующий шаг настраивает веб-приложение для использования управляемого удостоверения для проверки подлинности с помощью ACR.
Предоставление роли офицера секретов пользователю, вошедшего в систему
Чтобы хранить секреты в Azure Key Vault, пользователь, запускающий сценарий, должен иметь роль Key Vault Secrets Officer. Эта роль позволяет создавать и управлять секретами в хранилище.
На этом шаге скрипт назначает эту роль пользователю, вошедшего в систему. Затем этот пользователь может безопасно хранить секреты приложений, например строку подключения MongoDB и приложение SECRET_KEY
.
Это назначение роли является первым из двух назначений ролей, связанных с Key Vault. Позже управляемому удостоверению, назначаемому системой для веб-приложения, предоставляется доступ для получения секретов из хранилища ключей.
Использование Azure RBAC обеспечивает безопасный аудит доступа на основе удостоверений, устраняя необходимость жестко закодированных учетных данных.
Заметка
Назначение пользователю роли офицера секретов Key Vault должно быть выполнено до попытки хранения секретов в хранилище ключей. Это назначение выполняется с помощью команды az role assignment create , заданной в Key Vault.
На этом шаге вы используете команду az role assignment create , чтобы назначить роль в области Key Vault.
#!/bin/bash CALLER_ID=$(az ad signed-in-user show --query id -o tsv) echo $CALLER_ID # Verify this value retrieved successfully. In production, poll to verify this value is retrieved successfully. az role assignment create \ --role "Key Vault Secrets Officer" \ --assignee "$CALLER_ID" \ --scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME"
Предоставление веб-доступа к ACR с помощью управляемого удостоверения
Чтобы безопасно извлекать образы из реестра контейнеров Azure (ACR), веб-приложение должно быть настроено для использования управляемого удостоверения, назначаемого системой. Использование управляемого удостоверения позволяет избежать необходимости в использовании учетных данных администратора и поддерживает безопасное, без учетных данных развертывание.
Этот процесс включает два ключевых действия:
- Включение веб-приложения для использования его управляемой идентичности при доступе к Azure Container Registry (ACR)
- Назначение роли AcrPull для этого удостоверения в целевом ACR
На этом шаге вы извлечете идентификатор субъекта (уникальный идентификатор объекта) управляемого удостоверения веб-приложения с помощью команды az webapp identity show. Затем вы включаете управляемое удостоверение для аутентификации в ACR, настраивая свойство
acrUseManagedIdentityCreds
значениемtrue
с помощью az webapp config set. Затем вы назначите роль AcrPull управляемому удостоверению веб-приложения с помощью команды az role assignment create . Эта роль предоставляет веб-приложению разрешение на извлечение образов из реестра.#!/bin/bash PRINCIPAL_ID=$(az webapp identity show \ --name "$APP_SERVICE_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --query principalId \ -o tsv) echo $PRINCIPAL_ID # Verify this value retrieved successfully. In production, poll for successful 'AcrPull' role assignment using `az role assignment list`. az webapp config set \ --resource-group "$RESOURCE_GROUP_NAME" \ --name "$APP_SERVICE_NAME" \ --generic-configurations '{"acrUseManagedIdentityCreds": true}' az role assignment create \ --role "AcrPull" \ --assignee "$PRINCIPAL_ID" \ --scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ContainerRegistry/registries/$REGISTRY_NAME"
Предоставьте доступ к хранилищу ключей для управляемого удостоверения веб-приложения.
Веб-приложение должно иметь разрешение на доступ к секретам, таким как строка подключения MongoDB и .SECRET_KEY
Чтобы предоставить эти разрешения, необходимо назначить роль пользователя секретов Key Vaultназначенному системой управляемому удостоверению веб-приложения.
На этом шаге вы используете уникальный идентификатор (основной идентификатор) управляемого удостоверения веб-приложения, назначаемого системой, для предоставления веб-приложению доступа к Key Vault с ролью пользователя секретов Key Vault с помощью команды az role assignment create .
#!/bin/bash az role assignment create \ --role "Key Vault Secrets User" \ --assignee "$PRINCIPAL_ID" \ --scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME"
Хранение секретов в Key Vault
Чтобы избежать жесткого кода секретов в приложении, на этом шаге хранится строка подключения MongoDB и секретный ключ веб-приложения в Azure Key Vault. Затем к этим секретам может безопасно получить доступ веб-приложение во время выполнения через управляемое удостоверение, без необходимости хранения учетных данных в коде или конфигурации.
Заметка
Хотя в этом руководстве хранятся только строка подключения и секретный ключ в хранилище ключей, можно также хранить другие параметры приложения, такие как имя базы данных MongoDB или имя коллекции в Key Vault.
На этом шаге вы используете команду az cosmosdb keys list для получения строки подключения MongoDB. Затем вы используете команду az keyvault secret set для хранения строки подключения и случайно созданного секретного ключа в Key Vault.
#!/bin/bash ACCOUNT_NAME="msdocs-cosmos-db-account-name" MONGO_CONNECTION_STRING=$(az cosmosdb keys list \ --name "$ACCOUNT_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --type connection-strings \ --query "connectionStrings[?description=='Primary MongoDB Connection String'].connectionString" -o tsv) SECRET_KEY=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9') # This key is cryptographically secure, using OpenSSL’s strong random number generator. az keyvault secret set \ --vault-name "$KEYVAULT_NAME" \ --name "MongoConnectionString" \ --value "$MONGO_CONNECTION_STRING" az keyvault secret set \ --vault-name "$KEYVAULT_NAME" \ --name "MongoSecretKey" \ --value "$SECRET_KEY"
Настройка веб-приложения для использования секретов Kay Vault
Для безопасного доступа к секретам во время выполнения веб-приложение должно быть настроено для ссылки на секреты, хранящиеся в Azure Key Vault. Этот шаг выполняется с помощью ссылок Key Vault, которые внедряют значения секретов в среду приложения с помощью управляемого удостоверения, назначаемого системой.
Этот подход позволяет избежать жесткого кода секретов и позволяет приложению безопасно извлекать конфиденциальные значения, такие как строка подключения MongoDB и секретный ключ во время выполнения.
На этом шаге вы используете команду az webapp config appsettings set для добавления параметров приложения, ссылающихся на секреты Key Vault. В частности, это задает настройки
MongoConnectionString
иMongoSecretKey
приложения для ссылок на соответствующие секреты, хранящиеся в Key Vault.#!/bin/bash MONGODB_NAME="restaurants_reviews" MONGODB_COLLECTION_NAME="restaurants_reviews" az webapp config appsettings set \ --resource-group "$RESOURCE_GROUP_NAME" \ --name "$APP_SERVICE_NAME" \ --settings \ CONNECTION_STRING="@Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoConnectionString)" \ SECRET_KEY="@Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoSecretKey)" \ DB_NAME="$MONGODB_NAME" \ COLLECTION_NAME="$MONGODB_COLLECTION_NAME"
Настройка непрерывного развертывания из ACR
Включение непрерывного развертывания позволяет веб-приложению автоматически извлекать и запускать последний образ контейнера при отправке в реестр контейнеров Azure (ACR). Это сокращает действия по развертыванию вручную и помогает обеспечить актуальность приложения.
Заметка
На следующем шаге вы зарегистрируете веб-перехватчик в ACR, чтобы уведомить веб-приложение о отправке нового образа.
На этом шаге вы используете команду az webapp deployment container config , чтобы включить непрерывное развертывание из ACR в веб-приложение.
#!/bin/bash az webapp deployment container config \ --name "$APP_SERVICE_NAME" \ --resource-group "$RESOURCE_GROUP_NAME" \ --enable-cd true
Регистрация веб-хука ACR для непрерывного развертывания
Чтобы автоматизировать развертывание, зарегистрируйте веб-перехватчик в реестре контейнеров Azure (ACR), который уведомляет веб-приложение при отправке нового образа контейнера. Вебхук позволяет приложению автоматически загружать и запускать последнюю версию.
Веб-перехватчик, настроенный в реестре контейнеров Azure (ACR), отправляет запрос POST в конечную точку SCM веб-приложения (SERVICE_URI), когда новый образ отправляется в репозиторий msdocspythoncontainerwebapp. Это действие активирует веб-приложение для извлечения и развертывания обновленного образа, завершения конвейера непрерывного развертывания между ACR и службой приложений Azure.
Заметка
URI для веб-перехватчика должен соответствовать следующему формату:
https://<app-name>.scm.azurewebsites.net/api/registry/webhook
Он должен заканчиваться/api/registry/webhook
. Если вы получите ошибку URI, убедитесь, что путь правильный.
На этом шаге используйте команду az acr webhook create, чтобы зарегистрировать веб-перехватчик и настроить его для активации на событиях
push
.#!/bin/bash CREDENTIAL=$(az webapp deployment list-publishing-credentials \ --resource-group "$RESOURCE_GROUP_NAME" \ --name "$APP_SERVICE_NAME" \ --query publishingPassword --output tsv) # Web app publishing credentials may not be available immediately. In production, poll until non-empty. SERVICE_URI="https://$APP_SERVICE_NAME:$CREDENTIAL@$APP_SERVICE_NAME.scm.azurewebsites.net/api/registry/webhook" az acr webhook create \ --name webhookforwebapp \ --registry "$REGISTRY_NAME" \ --scope msdocspythoncontainerwebapp:* \ --uri "$SERVICE_URI" \ --actions push
Просмотр сайта
Чтобы убедиться, что веб-приложение запущено, откройте https://<website-name>.azurewebsites.net
и замените <website-name>
имя службы приложений. Вам стоит посмотреть образец приложения для обзора ресторанов. Для загрузки в первый раз может потребоваться несколько минут.
После появления сайта попробуйте добавить ресторан и отправить отзыв, чтобы убедиться, что приложение работает правильно.
Заметка
Команда az webapp browse
не поддерживается в Cloud Shell. Если вы используете Cloud Shell, откройте браузер вручную и перейдите по URL-адресу сайта.
Если вы используете Azure CLI локально, вы можете использовать команду az webapp browse , чтобы открыть сайт в браузере по умолчанию:
az webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME
Заметка
Команда az webapp browse
не поддерживается в Cloud Shell. Откройте окно браузера и перейдите по URL-адресу веб-сайта.
Устранение неполадок развертывания
Если пример приложения не отображается, выполните следующие действия.
- При развертывании контейнеров и службе приложений всегда проверяйте страницу Центра развертывания / журналов на портале Azure. Убедитесь, что контейнер был запущен и работает. Начальное извлечение и запуск контейнера может занять несколько минут.
- Попробуйте перезапустить службу приложений и узнать, устранена ли проблема.
- При наличии ошибок программирования эти ошибки отображаются в журналах приложений. На странице портала Azure для службы приложений выберите Диагностика и решение проблем/журналы приложений.
- Пример приложения использует подключение к Azure Cosmos DB для MongoDB. Убедитесь, что служба приложений имеет параметры приложения с правильными сведениями о подключении.
- Убедитесь, что управляемое удостоверение включено в Службе приложений и используется в Центре развертывания. На странице портала Azure для службы приложений перейдите к ресурсу Службы приложений Центр развертывания и убедитесь, что Аутентификация задано значение Управляемое удостоверение.
- Убедитесь, что вебхук определен в реестре контейнеров Azure. Вебхук позволяет службе приложений извлекать образ контейнера. В частности, убедитесь, что URI службы заканчивается на "/api/registry/webhook". Если нет, добавьте его.
- Различные тарифные планы реестра контейнеров Azure обладают разными функциями, включая количество веб-перехватчиков. Если вы повторно используете реестр, вы можете увидеть сообщение "Квота превышена для вебхуков типа ресурса для SKU реестра "Базовый". Дополнительные сведения о различных квотах SKU и процессе обновления: https://aka.ms/acr/tiers". Если вы видите это сообщение, используйте новый реестр или уменьшите количество вебхуков реестра.