Azure.ResourceManager.Redis (.NET)
SDK du plan de gestion pour provisionner et gérer les ressources Azure Cache for Redis via Azure Resource Manager.
⚠️ Plan de gestion vs Plan de données
- Ce SDK (Azure.ResourceManager.Redis) : Créer des caches, configurer les règles de pare-feu, gérer les clés d'accès, configurer la géo-réplication
- SDK du plan de données (StackExchange.Redis) : Obtenir/définir des clés, pub/sub, streams, scripts Lua
Installation
dotnet add package Azure.ResourceManager.Redis
dotnet add package Azure.Identity
Version actuelle : 1.5.1 (Stable)
Version API : 2024-11-01
Frameworks cibles : .NET 8.0, .NET Standard 2.0
Variables d'environnement
AZURE_SUBSCRIPTION_ID=<your-subscription-id>
# Pour l'authentification par principal de service (optionnel)
AZURE_TENANT_ID=<tenant-id>
AZURE_CLIENT_ID=<client-id>
AZURE_CLIENT_SECRET=<client-secret>
Authentification
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.Redis;
// Toujours utiliser DefaultAzureCredential
var credential = new DefaultAzureCredential();
var armClient = new ArmClient(credential);
// Obtenir l'abonnement
var subscriptionId = Environment.GetEnvironmentVariable("AZURE_SUBSCRIPTION_ID");
var subscription = armClient.GetSubscriptionResource(
new ResourceIdentifier($"/subscriptions/{subscriptionId}"));
Hiérarchie des ressources
ArmClient
└── SubscriptionResource
└── ResourceGroupResource
└── RedisResource
├── RedisFirewallRuleResource
├── RedisPatchScheduleResource
├── RedisLinkedServerWithPropertyResource
├── RedisPrivateEndpointConnectionResource
└── RedisCacheAccessPolicyResource
Flux de travail principaux
1. Créer un cache Redis
using Azure.ResourceManager.Redis;
using Azure.ResourceManager.Redis.Models;
// Obtenir le groupe de ressources
var resourceGroup = await subscription
.GetResourceGroupAsync("my-resource-group");
// Définir la configuration du cache
var cacheData = new RedisCreateOrUpdateContent(
location: AzureLocation.EastUS,
sku: new RedisSku(RedisSkuName.Standard, RedisSkuFamily.BasicOrStandard, 1))
{
EnableNonSslPort = false,
MinimumTlsVersion = RedisTlsVersion.Tls1_2,
RedisConfiguration = new RedisCommonConfiguration
{
MaxMemoryPolicy = "volatile-lru"
},
Tags =
{
["environment"] = "production"
}
};
// Créer le cache (opération longue)
var cacheCollection = resourceGroup.Value.GetAllRedis();
var operation = await cacheCollection.CreateOrUpdateAsync(
WaitUntil.Completed,
"my-redis-cache",
cacheData);
RedisResource cache = operation.Value;
Console.WriteLine($"Cache created: {cache.Data.HostName}");
2. Obtenir un cache Redis
// Obtenir un cache existant
var cache = await resourceGroup.Value
.GetRedisAsync("my-redis-cache");
Console.WriteLine($"Host: {cache.Value.Data.HostName}");
Console.WriteLine($"Port: {cache.Value.Data.Port}");
Console.WriteLine($"SSL Port: {cache.Value.Data.SslPort}");
Console.WriteLine($"Provisioning State: {cache.Value.Data.ProvisioningState}");
3. Mettre à jour un cache Redis
var patchData = new RedisPatch
{
Sku = new RedisSku(RedisSkuName.Standard, RedisSkuFamily.BasicOrStandard, 2),
RedisConfiguration = new RedisCommonConfiguration
{
MaxMemoryPolicy = "allkeys-lru"
}
};
var updateOperation = await cache.Value.UpdateAsync(
WaitUntil.Completed,
patchData);
4. Supprimer un cache Redis
await cache.Value.DeleteAsync(WaitUntil.Completed);
5. Obtenir les clés d'accès
var keys = await cache.Value.GetKeysAsync();
Console.WriteLine($"Primary Key: {keys.Value.PrimaryKey}");
Console.WriteLine($"Secondary Key: {keys.Value.SecondaryKey}");
6. Régénérer les clés d'accès
var regenerateContent = new RedisRegenerateKeyContent(RedisRegenerateKeyType.Primary);
var newKeys = await cache.Value.RegenerateKeyAsync(regenerateContent);
Console.WriteLine($"New Primary Key: {newKeys.Value.PrimaryKey}");
7. Gérer les règles de pare-feu
// Créer une règle de pare-feu
var firewallData = new RedisFirewallRuleData(
startIP: System.Net.IPAddress.Parse("10.0.0.1"),
endIP: System.Net.IPAddress.Parse("10.0.0.255"));
var firewallCollection = cache.Value.GetRedisFirewallRules();
var firewallOperation = await firewallCollection.CreateOrUpdateAsync(
WaitUntil.Completed,
"allow-internal-network",
firewallData);
// Lister toutes les règles de pare-feu
await foreach (var rule in firewallCollection.GetAllAsync())
{
Console.WriteLine($"Rule: {rule.Data.Name} ({rule.Data.StartIP} - {rule.Data.EndIP})");
}
// Supprimer une règle de pare-feu
var ruleToDelete = await firewallCollection.GetAsync("allow-internal-network");
await ruleToDelete.Value.DeleteAsync(WaitUntil.Completed);
8. Configurer un calendrier de correctif (SKU Premium)
// Les calendriers de correctif nécessitent une SKU Premium
var scheduleData = new RedisPatchScheduleData(
new[]
{
new RedisPatchScheduleSetting(RedisDayOfWeek.Saturday, 2) // 2 h du matin samedi
{
MaintenanceWindow = TimeSpan.FromHours(5)
},
new RedisPatchScheduleSetting(RedisDayOfWeek.Sunday, 2) // 2 h du matin dimanche
{
MaintenanceWindow = TimeSpan.FromHours(5)
}
});
var scheduleCollection = cache.Value.GetRedisPatchSchedules();
await scheduleCollection.CreateOrUpdateAsync(
WaitUntil.Completed,
RedisPatchScheduleDefaultName.Default,
scheduleData);
9. Importer/Exporter des données (SKU Premium)
// Importer les données depuis le stockage blob
var importContent = new ImportRdbContent(
files: new[] { "https://mystorageaccount.blob.core.windows.net/container/dump.rdb" },
format: "RDB");
await cache.Value.ImportDataAsync(WaitUntil.Completed, importContent);
// Exporter les données vers le stockage blob
var exportContent = new ExportRdbContent(
prefix: "backup",
container: "https://mystorageaccount.blob.core.windows.net/container?sastoken",
format: "RDB");
await cache.Value.ExportDataAsync(WaitUntil.Completed, exportContent);
10. Forcer un redémarrage
var rebootContent = new RedisRebootContent
{
RebootType = RedisRebootType.AllNodes,
ShardId = 0 // Pour les caches en cluster
};
await cache.Value.ForceRebootAsync(rebootContent);
Référence SKU
| SKU | Famille | Capacité | Fonctionnalités |
|---|---|---|---|
| Basic | C | 0-6 | Nœud unique, pas de SLA, développement/test uniquement |
| Standard | C | 0-6 | Deux nœuds (primaire/réplica), SLA |
| Premium | P | 1-5 | Clustering, géo-réplication, VNet, persistance |
Tailles de capacité (Famille C - Basic/Standard) :
- C0 : 250 Mo
- C1 : 1 Go
- C2 : 2,5 Go
- C3 : 6 Go
- C4 : 13 Go
- C5 : 26 Go
- C6 : 53 Go
Tailles de capacité (Famille P - Premium) :
- P1 : 6 Go par fragment
- P2 : 13 Go par fragment
- P3 : 26 Go par fragment
- P4 : 53 Go par fragment
- P5 : 120 Go par fragment
Référence des types de clé
| Type | Objectif |
|---|---|
ArmClient |
Point d'entrée pour toutes les opérations ARM |
RedisResource |
Représente une instance de cache Redis |
RedisCollection |
Collection pour les opérations CRUD du cache |
RedisFirewallRuleResource |
Règle de pare-feu pour le filtrage IP |
RedisPatchScheduleResource |
Configuration de la fenêtre de maintenance |
RedisLinkedServerWithPropertyResource |
Serveur lié pour la géo-réplication |
RedisPrivateEndpointConnectionResource |
Connexion de point de terminaison privé |
RedisCacheAccessPolicyResource |
Politique d'accès RBAC |
RedisCreateOrUpdateContent |
Charge utile de création du cache |
RedisPatch |
Charge utile de mise à jour du cache |
RedisSku |
Configuration SKU (nom, famille, capacité) |
RedisAccessKeys |
Clés d'accès primaire et secondaire |
RedisRegenerateKeyContent |
Demande de régénération de clé |
Bonnes pratiques
- Utiliser
WaitUntil.Completedpour les opérations qui doivent se terminer avant de continuer - Utiliser
WaitUntil.Startedpour sonder manuellement ou exécuter les opérations en parallèle - Toujours utiliser
DefaultAzureCredential— ne jamais coder en dur les clés - Gérer
RequestFailedExceptionpour les erreurs de l'API ARM - Utiliser
CreateOrUpdateAsyncpour les opérations idempotentes - Naviguer dans la hiérarchie via les méthodes
Get*(par exemple,cache.GetRedisFirewallRules()) - Utiliser la SKU Premium pour les charges de travail de production nécessitant la géo-réplication, le clustering ou la persistance
- Activer TLS 1.2 minimum — définir
MinimumTlsVersion = RedisTlsVersion.Tls1_2 - Désactiver le port non-SSL — définir
EnableNonSslPort = falsepour la sécurité - Pivoter les clés régulièrement — utiliser
RegenerateKeyAsyncet mettre à jour les chaînes de connexion
Gestion des erreurs
using Azure;
try
{
var operation = await cacheCollection.CreateOrUpdateAsync(
WaitUntil.Completed, cacheName, cacheData);
}
catch (RequestFailedException ex) when (ex.Status == 409)
{
Console.WriteLine("Cache already exists");
}
catch (RequestFailedException ex) when (ex.Status == 400)
{
Console.WriteLine($"Invalid configuration: {ex.Message}");
}
catch (RequestFailedException ex)
{
Console.WriteLine($"ARM Error: {ex.Status} - {ex.ErrorCode}: {ex.Message}");
}
Pièges courants
- Les rétrogradations de SKU ne sont pas autorisées — Vous ne pouvez pas rétrograder de Premium à Standard/Basic
- Le clustering nécessite Premium — La configuration des fragments n'est disponible que sur la SKU Premium
- La géo-réplication nécessite Premium — Les serveurs liés ne fonctionnent qu'avec les caches Premium
- L'injection VNet nécessite Premium — Le support des réseaux virtuels est réservé à Premium
- Les calendriers de correctif nécessitent Premium — Les fenêtres de maintenance ne sont configurables que sur Premium
- Le nom du cache est mondialement unique — Les noms des caches Redis doivent être uniques dans tous les abonnements Azure
- Temps de provisionnement longs — La création du cache peut prendre 15 à 20 minutes ; utiliser
WaitUntil.Startedpour les modèles asynchrones
Connexion avec StackExchange.Redis (Plan de données)
Après avoir créé le cache avec ce SDK de gestion, utiliser StackExchange.Redis pour les opérations de données :
using StackExchange.Redis;
// Obtenir les infos de connexion du SDK de gestion
var cache = await resourceGroup.Value.GetRedisAsync("my-redis-cache");
var keys = await cache.Value.GetKeysAsync();
// Se connecter avec StackExchange.Redis
var connectionString = $"{cache.Value.Data.HostName}:{cache.Value.Data.SslPort},password={keys.Value.PrimaryKey},ssl=True,abortConnect=False";
var connection = ConnectionMultiplexer.Connect(connectionString);
var db = connection.GetDatabase();
// Opérations de données
await db.StringSetAsync("key", "value");
var value = await db.StringGetAsync("key");
SDKs associés
| SDK | Objectif | Installation |
|---|---|---|
StackExchange.Redis |
Plan de données (obtenir/définir, pub/sub, streams) | dotnet add package StackExchange.Redis |
Azure.ResourceManager.Redis |
Plan de gestion (ce SDK) | dotnet add package Azure.ResourceManager.Redis |
Microsoft.Azure.StackExchangeRedis |
Extensions Redis spécifiques à Azure | dotnet add package Microsoft.Azure.StackExchangeRedis |