HardТеория2 min

Azure App Service для разработчиков

App Service планы, deployment slots, масштабирование, конфигурация для AZ-204

App Service -- центральный PaaS-сервис Azure для веб-приложений. На экзамене AZ-204 он составляет значительную часть домена Compute Solutions (25-30%).

Создание веб-приложения

Для работы App Service необходимы два ресурса: App Service Plan (определяет вычислительные мощности) и Web App (само приложение).

# Создание Resource Group
az group create --name rg-orderapp --location westeurope

# Создание App Service Plan (Linux, SKU S1)
az appservice plan create \
  --name plan-orderapp \
  --resource-group rg-orderapp \
  --sku S1 \
  --is-linux

# Создание Web App на .NET
az webapp create \
  --name app-orderapp \
  --resource-group rg-orderapp \
  --plan plan-orderapp \
  --runtime "DOTNETCORE:8.0"

App Service Plans

App Service Plan определяет вычислительные ресурсы, на которых работает ваше приложение. Несколько приложений могут использовать один Plan.

SKU Особенности Масштабирование
F1 (Free) 60 мин CPU/день, 1 GB Нет
B1-B3 (Basic) Выделенные ресурсы Ручное, до 3 экземпляров
S1-S3 (Standard) Слоты, бэкапы, автомасштабирование До 10 экземпляров
P1v3-P3v3 (Premium) Улучшенная производительность До 30 экземпляров
I1v2-I3v2 (Isolated) Изолированная сеть (ASE) До 100 экземпляров

Для production рекомендуется минимум S1 (Standard) -- он поддерживает deployment slots и автомасштабирование.

Конфигурация приложения

Application Settings

Application Settings -- это переменные окружения, которые переопределяют значения из appsettings.json. В Azure они шифруются и передаются приложению через переменные среды.

az webapp config appsettings set \
  --name app-orderapp \
  --resource-group rg-orderapp \
  --settings \
    ASPNETCORE_ENVIRONMENT=Production \
    ApplicationInsights__ConnectionString="InstrumentationKey=xxx"

Connection Strings

Строки подключения к базам данных настраиваются отдельно:

az webapp config connection-string set \
  --name app-orderapp \
  --resource-group rg-orderapp \
  --connection-string-type SQLAzure \
  --settings OrderDB="Server=sql-orderapp.database.windows.net;..."

Key Vault References

Вместо хранения секретов в Application Settings, можно ссылаться на Key Vault:

@Microsoft.KeyVault(SecretUri=https://kv-orderapp.vault.azure.net/secrets/ConnectionString-OrderDB)

Для этого App Service должен иметь Managed Identity с доступом к Key Vault.

Deployment Slots

Deployment Slots позволяют развертывать новую версию приложения без простоя. Это основа стратегии blue-green деплоя.

Как это работает:

  1. Деплой новой версии в staging слот
  2. Тестирование staging (свой URL: app-orderapp-staging.azurewebsites.net)
  3. Swap staging -> production -- мгновенная замена без простоя
  4. Если проблема -- swap обратно (rollback)
# Создание staging слота
az webapp deployment slot create \
  --name app-orderapp \
  --resource-group rg-orderapp \
  --slot staging

# Деплой в staging
az webapp deployment source config-zip \
  --name app-orderapp \
  --resource-group rg-orderapp \
  --slot staging \
  --src app.zip

# Swap staging -> production
az webapp deployment slot swap \
  --name app-orderapp \
  --resource-group rg-orderapp \
  --slot staging \
  --target-slot production

Sticky Settings (Slot Settings)

Некоторые настройки должны оставаться привязанными к слоту и не переноситься при swap. Например, строка подключения к staging-базе данных не должна попасть в production.

az webapp config appsettings set \
  --name app-orderapp \
  --resource-group rg-orderapp \
  --slot staging \
  --slot-settings ASPNETCORE_ENVIRONMENT=Staging

Масштабирование

Scale Up (вертикальное)

Увеличение мощности плана: B1 -> S1 -> P1v3. Больше CPU, RAM, функциональности.

Scale Out (горизонтальное)

Увеличение количества экземпляров. Нагрузка распределяется между ними.

Autoscale

Автоматическое масштабирование на основе метрик или расписания:

# Создание правила автомасштабирования
az monitor autoscale create \
  --resource-group rg-orderapp \
  --name autoscale-orderapp \
  --resource plan-orderapp \
  --resource-type Microsoft.Web/serverfarms \
  --min-count 1 --max-count 5 --count 1

# Добавить экземпляр при CPU > 70%
az monitor autoscale rule create \
  --resource-group rg-orderapp \
  --autoscale-name autoscale-orderapp \
  --condition "CpuPercentage > 70 avg 5m" \
  --scale out 1

# Убрать экземпляр при CPU < 30%
az monitor autoscale rule create \
  --resource-group rg-orderapp \
  --autoscale-name autoscale-orderapp \
  --condition "CpuPercentage < 30 avg 5m" \
  --scale in 1

Правило автомасштабирования в JSON-формате:

{
  "metricTrigger": {
    "metricName": "CpuPercentage",
    "operator": "GreaterThan",
    "threshold": 70,
    "timeAggregation": "Average",
    "timeWindow": "PT5M"
  },
  "scaleAction": {
    "direction": "Increase",
    "type": "ChangeCount",
    "value": "1",
    "cooldown": "PT5M"
  }
}

Cooldown -- период ожидания после масштабирования, в течение которого новые правила не срабатывают. Предотвращает "метание" между масштабированием up и down.

Custom Domains и SSL

# Привязка пользовательского домена
az webapp config hostname add \
  --webapp-name app-orderapp \
  --resource-group rg-orderapp \
  --hostname orders.mycompany.com

# Бесплатный Managed Certificate
az webapp config ssl create \
  --name app-orderapp \
  --resource-group rg-orderapp \
  --hostname orders.mycompany.com

Проверь себя

Для чего используется параметр cooldown в правилах автомасштабирования?

Что происходит при операции Swap между staging и production слотами?

Как App Service может обращаться к секретам в Key Vault без хранения пароля?

Что такое Sticky Settings (Slot Settings) в App Service?

Какой минимальный план App Service поддерживает Deployment Slots?