Easy📖Теория2 min

Azure SQL Database на практике

Создание Azure SQL, Managed Identity подключение, миграции, firewall

Azure SQL Database на практике

Практическое руководство по созданию и использованию Azure SQL Database с Managed Identity (без паролей в коде).

Создание через CLI

# Создание SQL Server
az sql server create \
  --name sql-orderapp-dev \
  --resource-group rg-orderapp-dev \
  --location westeurope \
  --admin-user sqladmin \
  --admin-password "SecureP@ss123!"

# Создание базы данных (Basic -- для dev/test)
az sql db create \
  --resource-group rg-orderapp-dev \
  --server sql-orderapp-dev \
  --name OrderDB \
  --service-objective Basic \
  --backup-storage-redundancy Local

# Разрешить Azure-сервисам доступ через firewall
az sql server firewall-rule create \
  --resource-group rg-orderapp-dev \
  --server sql-orderapp-dev \
  --name AllowAzureServices \
  --start-ip-address 0.0.0.0 \
  --end-ip-address 0.0.0.0

# Разрешить доступ с вашего IP (для разработки)
MY_IP=$(curl -s https://api.ipify.org)
az sql server firewall-rule create \
  --resource-group rg-orderapp-dev \
  --server sql-orderapp-dev \
  --name MyDevMachine \
  --start-ip-address $MY_IP \
  --end-ip-address $MY_IP

Подключение через Managed Identity

Managed Identity позволяет App Service подключаться к SQL Database без пароля.

Шаг 1: Назначить Entra ID Admin

az sql server ad-admin create \
  --resource-group rg-orderapp-dev \
  --server sql-orderapp-dev \
  --display-name "SQL Admin" \
  --object-id $(az ad signed-in-user show --query id -o tsv)

Шаг 2: Connection String без пароля

{
  "ConnectionStrings": {
    "OrderDB": "Server=sql-orderapp-dev.database.windows.net;Database=OrderDB;Authentication=Active Directory Default;"
  }
}

Authentication=Active Directory Default заставляет EF Core использовать DefaultAzureCredential, который автоматически:

  • В Azure -> использует Managed Identity
  • Локально -> использует Azure CLI credentials (az login)

Шаг 3: Выдать права Managed Identity

Подключитесь к базе данных как Entra ID Admin и выполните:

CREATE USER [orderapp-dev-app] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [orderapp-dev-app];
ALTER ROLE db_datawriter ADD MEMBER [orderapp-dev-app];
ALTER ROLE db_ddladmin ADD MEMBER [orderapp-dev-app]; -- для миграций

Шаг 4: Настройка EF Core

services.AddDbContext<OrderDbContext>(options =>
{
    options.UseSqlServer(
        configuration.GetConnectionString("OrderDB"),
        sqlOptions =>
        {
            sqlOptions.EnableRetryOnFailure(
                maxRetryCount: 5,
                maxRetryDelay: TimeSpan.FromSeconds(30),
                errorNumbersToAdd: null);
            sqlOptions.CommandTimeout(30);
        });
});

Миграции

# Создание миграции
dotnet ef migrations add InitialCreate \
  --project src/OrderManagement.Infrastructure \
  --startup-project src/OrderManagement.API

# Применение миграций (локально через Azure CLI auth)
dotnet ef database update \
  --project src/OrderManagement.Infrastructure \
  --startup-project src/OrderManagement.API

# Генерация SQL-скрипта для production
dotnet ef migrations script \
  --idempotent \
  --project src/OrderManagement.Infrastructure \
  --startup-project src/OrderManagement.API \
  --output migration.sql

Модели ценообразования

Модель Описание Сценарий
DTU Basic 5 DTU, 2 GB Dev/test, минимальная нагрузка
DTU Standard S1 20 DTU, 250 GB Небольшие production-приложения
vCore General Purpose Выбор CPU/RAM Гибкий контроль
Serverless Автомасштабирование + автопауза Dev/test с непредсказуемой нагрузкой

Serverless для экономии

az sql db update \
  --resource-group rg-orderapp-dev \
  --server sql-orderapp-dev \
  --name OrderDB \
  --edition GeneralPurpose \
  --compute-model Serverless \
  --auto-pause-delay 60 \
  --min-capacity 0.5 \
  --capacity 2

База автоматически приостанавливается после 60 минут простоя (нулевая стоимость) и возобновляется при первом запросе.

Резервное копирование

Azure SQL автоматически создает резервные копии:

  • Полные бэкапы -- каждую неделю
  • Дифференциальные -- каждые 12-24 часа
  • Логи транзакций -- каждые 5-10 минут
# Point-in-time restore
az sql db restore \
  --resource-group rg-orderapp-dev \
  --server sql-orderapp-dev \
  --name OrderDB-Restored \
  --dest-name OrderDB-Restored \
  --time "2024-01-15T10:00:00Z"

Проверь себя

🧪

Какой тип аутентификации используется в connection string 'Authentication=Active Directory Default'?

🧪

Что делает Serverless Azure SQL при 60 минутах без запросов?

🧪

Какая firewall-правило с IP 0.0.0.0--0.0.0.0 разрешает?