azure-resource-manager-redis-dotnet について
Azure.ResourceManager.Redis は、Azure Resource Manager を通じて Azure Cache for Redis を構成・管理する .NET 管理プレーン SDK です。キャッシュリソースを扱う開発者向けで、設定やアクセス、ネットワーク管理を提供し、Redis データの読み書きには使いません。
主な機能
- 01キャッシュの作成・取得・更新・削除
- 02SKU とキャッシュ設定の構成
- 03アクセスキーの管理とローテーション
- 04ファイアウォールルールとプライベートエンドポイントの設定
- 05パッチスケジュールと geo レプリケーションの構成
- 06キャッシュのインポート・エクスポート・再起動
活用シーン
- 01リソースグループでの Redis キャッシュ作成
- 02キャッシュ容量やメモリポリシーの変更
- 03許可された利用者向けのアクセスキー更新
- 04ファイアウォールルールやメンテナンス時間の設定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill azure-resource-manager-redis-dotnetインストール後、Claude Code で/azure-resource-manager-redis-dotnetを入力して読み込まれたか確認します。
詳細
Azure.ResourceManager.Redis(.NET)
Azure Resource Manager を介して Azure Cache for Redis リソースをプロビジョニングおよび管理するための管理プレーン SDK です。
⚠️ 管理プレーンとデータプレーン
- この SDK(Azure.ResourceManager.Redis):キャッシュの作成、ファイアウォールルールの構成、アクセスキーの管理、Geo レプリケーションの設定
- データプレーン SDK(StackExchange.Redis):キーの取得/設定、パブリッシュ/サブスクライブ、ストリーム、Lua スクリプト
インストール
dotnet add package Azure.ResourceManager.Redis
dotnet add package Azure.Identity
現在のバージョン:1.5.1(安定版)
API バージョン:2024-11-01
対象フレームワーク:.NET 8.0、.NET Standard 2.0
環境変数
AZURE_SUBSCRIPTION_ID=<your-subscription-id>
# For service principal auth (optional)
AZURE_TENANT_ID=<tenant-id>
AZURE_CLIENT_ID=<client-id>
AZURE_CLIENT_SECRET=<client-secret>
認証
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.Redis;
// Always use DefaultAzureCredential
var credential = new DefaultAzureCredential();
var armClient = new ArmClient(credential);
// Get subscription
var subscriptionId = Environment.GetEnvironmentVariable("AZURE_SUBSCRIPTION_ID");
var subscription = armClient.GetSubscriptionResource(
new ResourceIdentifier($"/subscriptions/{subscriptionId}"));
リソース階層
ArmClient
└── SubscriptionResource
└── ResourceGroupResource
└── RedisResource
├── RedisFirewallRuleResource
├── RedisPatchScheduleResource
├── RedisLinkedServerWithPropertyResource
├── RedisPrivateEndpointConnectionResource
└── RedisCacheAccessPolicyResource
主なワークフロー
プロビジョニングの前に、現在のサービスのライフサイクル、サポートされている SKU/ネットワーク機能、および正確なアカウント/サブスクリプションを確認してください。静的なバージョン/SKU 一覧は、現在の利用可否を保証するものではありません。作成やスケーリングには費用がかかり、エビクションポリシーの変更、インポート、再起動、キーのローテーション、削除は、利用者やデータに影響します。スコープを限定した認可、バックアップ、ロールアウト/ロールバックを必須にしてください。利用者をもう一方のキーに移行し、動作をテストしてから、一度に 1 つのキーのみをローテーションしてください。接続文字列、アクセスキー、SAS URL をログに記録しないでください。
1. Redis キャッシュの作成
using Azure.ResourceManager.Redis;
using Azure.ResourceManager.Redis.Models;
// Get resource group
var resourceGroup = await subscription
.GetResourceGroupAsync("my-resource-group");
// Define cache configuration
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"
}
};
// Create cache (long-running operation)
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. Redis キャッシュの取得
// Get existing cache
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. 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. Redis キャッシュの削除
await cache.Value.DeleteAsync(WaitUntil.Completed);
5. アクセスキーの取得
var keys = await cache.Value.GetKeysAsync();
// Use keys only in approved secret storage or a scoped connection; never log them.
6. アクセスキーの再生成
var regenerateContent = new RedisRegenerateKeyContent(RedisRegenerateKeyType.Primary);
var newKeys = await cache.Value.RegenerateKeyAsync(regenerateContent);
// Update authorized consumers through a secret store; never print the regenerated key.
7. ファイアウォールルールの管理
// Create firewall rule
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);
// List all firewall rules
await foreach (var rule in firewallCollection.GetAllAsync())
{
Console.WriteLine($"Rule: {rule.Data.Name} ({rule.Data.StartIP} - {rule.Data.EndIP})");
}
// Delete firewall rule
var ruleToDelete = await firewallCollection.GetAsync("allow-internal-network");
await ruleToDelete.Value.DeleteAsync(WaitUntil.Completed);
8. パッチスケジュールの構成(Premium SKU)
// Patch schedules require Premium SKU
var scheduleData = new RedisPatchScheduleData(
new[]
{
new RedisPatchScheduleSetting(RedisDayOfWeek.Saturday, 2) // 2 AM Saturday
{
MaintenanceWindow = TimeSpan.FromHours(5)
},
new RedisPatchScheduleSetting(RedisDayOfWeek.Sunday, 2) // 2 AM Sunday
{
MaintenanceWindow = TimeSpan.FromHours(5)
}
});
var scheduleCollection = cache.Value.GetRedisPatchSchedules();
await scheduleCollection.CreateOrUpdateAsync(
WaitUntil.Completed,
RedisPatchScheduleDefaultName.Default,
scheduleData);
9. データのインポート/エクスポート(Premium SKU)
// Import data from blob storage
var importContent = new ImportRdbContent(
files: new[] { "https://mystorageaccount.blob.core.windows.net/container/dump.rdb" },
format: "RDB");
await cache.Value.ImportDataAsync(WaitUntil.Completed, importContent);
// Export data to blob storage
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. 強制再起動
var rebootContent = new RedisRebootContent
{
RebootType = RedisRebootType.AllNodes,
ShardId = 0 // For clustered caches
};
await cache.Value.ForceRebootAsync(rebootContent);
SKU リファレンス
| SKU | ファミリ | 容量 | 機能 |
|---|---|---|---|
| Basic | C | 0-6 | シングルノード、SLA なし、開発/テスト専用 |
| Standard | C | 0-6 | 2 ノード(プライマリ/レプリカ)、SLA |
| Premium | P | 1-5 | クラスタリング、Geo レプリケーション、VNet、永続化 |
容量サイズ(ファミリ C - Basic/Standard):
- C0:250 MB
- C1:1 GB
- C2:2.5 GB
- C3:6 GB
- C4:13 GB
- C5:26 GB
- C6:53 GB
容量サイズ(ファミリ P - Premium):
- P1:シャードあたり 6 GB
- P2:シャードあたり 13 GB
- P3:シャードあたり 26 GB
- P4:シャードあたり 53 GB
- P5:シャードあたり 120 GB
主な型のリファレンス
| 型 | 用途 |
|---|---|
ArmClient | すべての ARM 操作のエントリポイント |
RedisResource | Redis キャッシュインスタンスを表します |
RedisCollection | キャッシュの CRUD 操作用コレクション |
RedisFirewallRuleResource | IP フィルタリング用のファイアウォールルール |
RedisPatchScheduleResource | メンテナンス時間帯の構成 |
RedisLinkedServerWithPropertyResource | Geo レプリケーション用のリンクされたサーバー |
RedisPrivateEndpointConnectionResource | プライベートエンドポイント接続 |
RedisCacheAccessPolicyResource | RBAC アクセスポリシー |
RedisCreateOrUpdateContent | キャッシュ作成ペイロード |
RedisPatch | キャッシュ更新ペイロード |
RedisSku | SKU 構成(名前、ファミリ、容量) |
RedisAccessKeys | プライマリおよびセカンダリのアクセスキー |
RedisRegenerateKeyContent | キー再生成リクエスト |
ベストプラクティス
- 処理を続行する前に完了が必要な操作には、
WaitUntil.Completedを使用します - 手動でポーリングする場合や操作を並列で実行する場合は、
WaitUntil.Startedを使用します - 必ず
DefaultAzureCredentialを使用してください — キーをハードコードしないでください - ARM API エラーには
RequestFailedExceptionを処理します - 冪等な操作には
CreateOrUpdateAsyncを使用します Get*メソッドを使用して階層をたどります(例:cache.GetRedisFirewallRules())- Geo レプリケーション、クラスタリング、永続化が必要な本番ワークロードには Premium SKU を使用します
- TLS 1.2 以上を有効にします —
MinimumTlsVersion = RedisTlsVersion.Tls1_2を設定します - 非 SSL ポートを無効にします — セキュリティのため
EnableNonSslPort = falseを設定します - キーを定期的にローテーションします —
RegenerateKeyAsyncを使用し、接続文字列を更新します
エラー処理
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}");
}
よくある落とし穴
- SKU のダウングレードはできません — Premium から Standard/Basic にはダウングレードできません
- クラスター化には Premium が必要です — シャード構成は Premium SKU でのみ利用できます
- 地理レプリケーションには Premium が必要です — リンクされたサーバーは Premium キャッシュでのみ動作します
- VNet インジェクションには Premium が必要です — 仮想ネットワークのサポートは Premium のみです
- パッチスケジュールには Premium が必要です — メンテナンス期間は Premium でのみ構成できます
- キャッシュ名はグローバルで一意である必要があります — Redis キャッシュ名は、すべての Azure サブスクリプションで一意である必要があります
- プロビジョニングに時間がかかります — キャッシュの作成には 15~20 分かかることがあります。非同期パターンでは
WaitUntil.Startedを使用してください
StackExchange.Redis を使用した接続(データプレーン)
この管理 SDK でキャッシュを作成した後、データ操作には StackExchange.Redis を使用します。
using StackExchange.Redis;
// Get connection info from management SDK
var cache = await resourceGroup.Value.GetRedisAsync("my-redis-cache");
var keys = await cache.Value.GetKeysAsync();
// Connect with 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();
// Data operations
await db.StringSetAsync("key", "value");
var value = await db.StringGetAsync("key");
関連 SDK
| SDK | 用途 | インストール |
|---|---|---|
StackExchange.Redis | データプレーン(get/set、pub/sub、ストリーム) | dotnet add package StackExchange.Redis |
Azure.ResourceManager.Redis | 管理プレーン(この SDK) | dotnet add package Azure.ResourceManager.Redis |
Microsoft.Azure.StackExchangeRedis | Azure 固有の Redis 拡張機能 | dotnet add package Microsoft.Azure.StackExchangeRedis |
使用する場面
このスキルは、概要で説明されているワークフローまたはアクションを実行する場合に適用できます。
制限事項
- タスクが上記の説明の範囲に明確に該当する場合にのみ、このスキルを使用してください。
- 出力を、環境固有の検証、テスト、または専門家によるレビューの代わりとして扱わないでください。
- 必要な入力、権限、安全上の境界、または成功基準が不足している場合は、作業を停止して確認してください。