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"