.NET Aspire Azure Service Bus 統合
含まれるもの: ホスティング統合と
Client 統合
Azure Service Bus は、メッセージ キューとパブリッシュ/サブスクライブ トピックを含むフル マネージドのエンタープライズ メッセージ ブローカーです。 .NET Aspire Azure Service Bus 統合により、.NET アプリケーションから Azure Service Bus インスタンスに接続できます。
ホスティング統合
.NET .NET Aspire Azure Service Bus ホスティング統合は、さまざまな Service Bus リソースを次の種類としてモデル化します。
- AzureServiceBusResource: Azure Service Bus リソースを表します。
- AzureServiceBusEmulatorResource: Azure Service Bus エミュレーター リソースを表します。
これらの型とAPIにアクセスして表現するには、アプリホストプロジェクト内で📦Aspire.Hosting.Azure.ServiceBus NuGetパッケージを追加します。
dotnet add package Aspire.Hosting.Azure.ServiceBus
詳細については、「dotnet パッケージ の追加」または「.NET アプリケーションでのパッケージの依存関係の管理」を参照してください。
リソース Azure Service Bus を追加する
アプリ ホスト プロジェクトで、AddAzureServiceBus を呼び出して、Azure Service Bus リソース ビルダーを追加して返します。
var builder = DistributedApplication.CreateBuilder(args);
var serviceBus = builder.AddAzureServiceBus("messaging");
// After adding all resources, run the app...
アプリ ホストに AzureServiceBusResource を追加すると、キューやトピックを追加するための他の便利な API が公開されます。 つまり、他の Service Bus リソースを追加する前に、AzureServiceBusResource
を追加する必要があります。
重要
AddAzureServiceBusを呼び出すと、暗黙的に AddAzureProvisioningが呼び出されます。これによって、アプリの起動時に Azure リソースを動的に生成するためのサポートが追加されます。 アプリは、適切なサブスクリプションと場所を構成する必要があります。 詳細については、構成に関するページを参照してください。
生成されたプロビジョニング構成 Bicep
Bicep を初めて使用する場合は、Azure リソースを定義するためのドメイン固有の言語です。 .NET .NET Aspireでは、Bicep を手動で記述する必要はありません。代わりに、プロビジョニング API によって Bicep が生成されます。 アプリを発行すると、生成された Bicep がマニフェスト ファイルと共に出力されます。 Azure Service Bus リソースを追加すると、次の Bicep が生成されます。
@description('The location for the resource(s) to be deployed.')
param location string = resourceGroup().location
param sku string = 'Standard'
param principalType string
param principalId string
resource service_bus 'Microsoft.ServiceBus/namespaces@2024-01-01' = {
name: take('servicebus-${uniqueString(resourceGroup().id)}', 50)
location: location
properties: {
disableLocalAuth: true
}
sku: {
name: sku
}
tags: {
'aspire-resource-name': 'service-bus'
}
}
resource service_bus_AzureServiceBusDataOwner 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(service_bus.id, principalId, subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '090c5cfd-751d-490a-894a-3ce6f1109419'))
properties: {
principalId: principalId
roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '090c5cfd-751d-490a-894a-3ce6f1109419')
principalType: principalType
}
scope: service_bus
}
output serviceBusEndpoint string = service_bus.properties.serviceBusEndpoint
上記の Bicep は、次の既定値で Azure Service Bus 名前空間をプロビジョニングするモジュールです。
-
sku
: Service Bus 名前空間の SKU。 既定値は Standard です。 -
location
: Service Bus 名前空間の場所。 既定値はリソース グループの場所です。
Service Bus 名前空間に加えて、Azure Service Bus データ所有者の Azure ロールベースのアクセス制御 (Azure RBAC) 組み込みロールもプロビジョニングされます。 ロールは、Service Bus 名前空間のリソース グループに割り当てられます。 詳細については、「Azure Service Bus データ所有者」を参照してください。
プロビジョニング インフラストラクチャをカスタマイズする
すべての .NET AspireAzure リソースは、AzureProvisioningResource 型のサブクラスです。 この型は、Azure API を使用することによって、ConfigureInfrastructure<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure>) リソースを構成するための流暢な(開発しやすい)API を提供し、生成された Bicep のカスタマイズを可能にします。 たとえば、SKU、場所などを構成できます。 次の例では、Azure Service Bus リソースをカスタマイズする方法を示します。
builder.AddAzureServiceBus("service-bus")
.ConfigureInfrastructure(infra =>
{
var serviceBusNamespace = infra.GetProvisionableResources()
.OfType<ServiceBusNamespace>()
.Single();
serviceBusNamespace.Sku = new ServiceBusSku
{
Tier = ServiceBusSkuTier.Premium
};
serviceBusNamespace.Tags.Add("ExampleKey", "Example value");
});
上記のコード:
-
ConfigureInfrastructure API への呼び出しを連鎖させます。
- infra パラメーターは、AzureResourceInfrastructure 型のインスタンスです。
- プロビジョニング可能なリソースは、GetProvisionableResources() メソッドを呼び出すことによって取得されます。
- 1つのServiceBusNamespaceが取得されました。
- ServiceBusSkuTier.Premium で作成された ServiceBusNamespace.Sku
-
ExampleKey
のキーと値がExample value
のタグが Service Bus 名前空間に追加されます。
Azure Service Bus リソースをカスタマイズするために使用できる構成オプションは他にも多数あります。 詳細については、Azure.Provisioning.ServiceBusを参照してください。 詳細については、Azureを参照してください。プロビジョニングのカスタマイズ。
既存の Azure Service Bus 名前空間に接続する
接続する既存の Azure Service Bus 名前空間がある場合があります。 新しい Azure Service Bus リソースを表す代わりに、接続文字列をアプリ ホストに追加できます。 既存の Azure Service Bus 名前空間に接続を追加するには、AddConnectionString メソッドを呼び出します。
var builder = DistributedApplication.CreateBuilder(args);
var serviceBus = builder.AddConnectionString("messaging");
builder.AddProject<Projects.WebApplication>("web")
.WithReference(serviceBus);
// After adding all resources, run the app...
手記
接続文字列は、データベース接続、メッセージ ブローカー、エンドポイント URI、その他のサービスなど、さまざまな接続情報を表すために使用されます。 .NET .NET Aspire 命名法では、"接続文字列" という用語は、あらゆる種類の接続情報を表すために使用されます。
接続文字列は、アプリ ホストの構成 (通常は セクションの ConnectionStrings
) で構成されます。 アプリ ホストは、この接続文字列を環境変数としてすべての依存リソースに挿入します。次に例を示します。
{
"ConnectionStrings": {
"messaging": "Endpoint=sb://{namespace}.servicebus.windows.net/;SharedAccessKeyName={key_name};SharedAccessKey={key_value};"
}
}
依存リソースは、GetConnectionString メソッドを呼び出し、接続名をパラメーターとして渡すことによって、挿入された接続文字列にアクセスできます(この場合 "messaging"
。
GetConnectionString
API は、IConfiguration.GetSection("ConnectionStrings")[name]
の短縮形です。
Azure Service Bus キューを追加する
Azure Service Bus キューを追加するには、IResourceBuilder<AzureServiceBusResource>
で AddServiceBusQueue メソッドを呼び出します。
var builder = DistributedApplication.CreateBuilder(args);
var serviceBus = builder.AddAzureServiceBus("messaging");
serviceBus.AddServiceBusQueue("queue");
// After adding all resources, run the app...
AddServiceBusQueue(IResourceBuilder<AzureServiceBusResource>, String, String)を呼び出すと、Service Bus リソースに queue
という名前のキューが構成されます。 キューは、前に追加した AzureServiceBusResource
によって表される Service Bus 名前空間に作成されます。 詳細については、「Azure Service Busのキュー、トピック、サブスクリプション」を参照してください。
Azure Service Bus トピックとサブスクリプションを追加
Azure Service Bus トピックを追加するには、IResourceBuilder<AzureServiceBusResource>
で AddServiceBusTopic メソッドを呼び出します。
var builder = DistributedApplication.CreateBuilder(args);
var serviceBus = builder.AddAzureServiceBus("messaging");
serviceBus.AddServiceBusTopic("topic");
// After adding all resources, run the app...
AddServiceBusTopic(IResourceBuilder<AzureServiceBusResource>, String, String)を呼び出すと、Service Bus リソースに topic
という名前のトピックが構成されます。 このトピックは、前に追加した AzureServiceBusResource
によって表される Service Bus 名前空間に作成されます。
トピックのサブスクリプションを追加するには、IResourceBuilder<AzureServiceBusTopicResource>
で AddServiceBusSubscription メソッドを呼び出し、WithProperties メソッドを使用して構成します。
using Aspire.Hosting.Azure;
var builder = DistributedApplication.CreateBuilder(args);
var serviceBus = builder.AddAzureServiceBus("messaging");
var topic = serviceBus.AddServiceBusTopic("topic");
topic.AddServiceBusSubscription("sub1")
.WithProperties(subscription =>
{
subscription.MaxDeliveryCount = 10;
subscription.Rules.Add(
new AzureServiceBusRule("app-prop-filter-1")
{
CorrelationFilter = new()
{
ContentType = "application/text",
CorrelationId = "id1",
Subject = "subject1",
MessageId = "msgid1",
ReplyTo = "someQueue",
ReplyToSessionId = "sessionId",
SessionId = "session1",
SendTo = "xyz"
}
});
});
// After adding all resources, run the app...
上記のコードは、トピックを追加し、トピックの sub1
という名前のサブスクリプションを作成して構成するだけではありません。 サブスクリプションには、10
の最大配信数と、app-prop-filter-1
という名前のルールがあります。 ルールは、ContentType
、CorrelationId
、Subject
、MessageId
、ReplyTo
、ReplyToSessionId
、SessionId
、および SendTo
のプロパティに基づいてメッセージをフィルター処理する関連付けフィルターです。
詳細については、Azure Service Busの「キュー、トピック、サブスクリプション」を参照してください。
エミュレーターリソースAzure Service Busを追加する
Azure Service Bus エミュレーター リソースを追加するには、<IResourceBuilder<AzureServiceBusResource>>
の呼び出しを RunAsEmulator API にチェーンします。
var builder = DistributedApplication.CreateBuilder(args);
var serviceBus = builder.AddAzureServiceBus("messaging")
.RunAsEmulator();
// After adding all resources, run the app...
RunAsEmulator
を呼び出すと、エミュレーターを使用してローカルで実行するように Service Bus リソースが構成されます。 この場合のエミュレーターは、Azure Service Bus Emulatorです。
Azure Service Bus Emulator は、Azure Service Bus アプリをテストするための無料のローカル環境を提供し、.NET AspireAzure ホスティング統合に最適です。 エミュレーターはインストールされていません。代わりに、コンテナーとして .NET.NET Aspire にアクセスできます。 前の例に示すように、mcr.microsoft.com/azure-messaging/servicebus-emulator
イメージ (およびコンパニオン mcr.microsoft.com/azure-sql-edge
イメージ) でコンテナーをアプリ ホストに追加すると、アプリ ホストの起動時にコンテナーが作成されて起動されます。 詳細については、「コンテナー リソースのライフサイクルの」を参照してください。
Service Bus エミュレーター コンテナーの構成
コンテナー リソースにはさまざまな構成が用意されています。たとえば、コンテナーのポートを構成したり、すべてをオーバーライドする wholistic JSON 構成を指定したりできます。
Service Bus エミュレーター コンテナーのホスト ポートを構成する
既定では、.NET.NET Aspireによって構成された Service Bus エミュレーター コンテナーは、次のエンドポイントを公開します。
エンドポイント | 画像 | コンテナー ポート | ホスト ポート |
---|---|---|---|
emulator |
mcr.microsoft.com/azure-messaging/servicebus-emulator |
5672 | 動的 |
tcp |
mcr.microsoft.com/azure-sql-edge |
1433 | 動的 |
リッスンしているポートは、既定では動的です。 コンテナーが起動すると、ポートはホスト コンピューター上のランダムなポートにマップされます。 エンドポイント ポートを構成するには、RunAsEmulator
メソッドによって提供されるコンテナー リソース ビルダーの呼び出しをチェーンし、次の例に示すように WithHostPort(IResourceBuilder<AzureServiceBusEmulatorResource>, Nullable<Int32>) します。
var builder = DistributedApplication.CreateBuilder(args);
var serviceBus = builder.AddAzureServiceBus("messaging").RunAsEmulator(
emulator =>
{
emulator.WithHostPort(7777);
});
// After adding all resources, run the app...
前のコードは、Service Bus エミュレーター コンテナーの既存の emulator
エンドポイントをポート 7777
でリッスンするように構成します。 Service Bus エミュレーター コンテナーのポートは、次の表に示すようにホスト ポートにマップされます。
エンドポイント名 | ポート マッピング (container:host ) |
---|---|
emulator |
5672:7777 |
Service Bus エミュレーター コンテナー JSON の設定を構成する
Service Bus エミュレーター コンテナーは、既定の config.json ファイルで実行されます。 このファイルを完全に置き換えることも、JSON 設定を JsonNode 設定の表現で更新することもできます。
カスタム JSON 構成ファイルを指定するには、WithConfigurationFile(IResourceBuilder<AzureServiceBusEmulatorResource>, String) メソッドを呼び出します。
var builder = DistributedApplication.CreateBuilder(args);
var serviceBus = builder.AddAzureServiceBus("messaging").RunAsEmulator(
emulator =>
{
emulator.WithConfigurationFile(
path: "./messaging/custom-config.json");
});
前のコードでは、Service Bus エミュレーター コンテナーが、./messaging/custom-config.json
にあるカスタム JSON 構成ファイルを使用するように構成します。 代わりに、既定の構成で特定のプロパティをオーバーライドするには、WithConfiguration(IResourceBuilder<AzureServiceBusEmulatorResource>, Action<JsonNode>) メソッドを呼び出します。
var builder = DistributedApplication.CreateBuilder(args);
var serviceBus = builder.AddAzureServiceBus("messaging").RunAsEmulator(
emulator =>
{
emulator.WithConfiguration(
(JsonNode configuration) =>
{
var userConfig = configuration["UserConfig"];
var ns = userConfig["Namespaces"][0];
var firstQueue = ns["Queues"][0];
var properties = firstQueue["Properties"];
properties["MaxDeliveryCount"] = 5;
properties["RequiresDuplicateDetection"] = true;
properties["DefaultMessageTimeToLive"] = "PT2H";
});
});
// After adding all resources, run the app...
上記のコードは、既定の構成から UserConfig
ノードを取得します。 次に、最初のキューのプロパティを更新して、MaxDeliveryCount
を 5
に、RequiresDuplicateDetection
を true
に、DefaultMessageTimeToLive
を 2 hours
に設定します。
ホスティング統合の正常性チェック
Azure Service Bus ホスティング統合により、Service Bus リソースの正常性チェックが自動的に追加されます。 正常性チェックでは、Service Bus が実行されていること、および Service Bus への接続を確立できることを確認します。
ホスティング統合は、📦 AspNetCore.HealthChecks.AzureServiceBus NuGet パッケージに依存します。
Client 統合
.NET Aspire Azure Service Bus クライアント統合を開始するには、📦Aspireをインストールします。Azure.Messaging.ServiceBus クライアントを使用するプロジェクト、つまり Service Bus クライアントを使用するアプリケーションのプロジェクトの NuGet パッケージです。 Service Bus クライアント統合により、Service Bus との対話に使用できる ServiceBusClient インスタンスが登録されます。
dotnet add package Aspire.Azure.Messaging.ServiceBus
Service Bus クライアントの追加
クライアントを使用するプロジェクトの Program.cs ファイルで、任意の AddAzureServiceBusClient で IHostApplicationBuilder 拡張メソッドを呼び出して、依存関係挿入コンテナーを介して使用する ServiceBusClient を登録します。 このメソッドは、接続名パラメーターを受け取ります。
builder.AddAzureServiceBusClient(connectionName: "messaging");
ヒント
connectionName
パラメーターは、アプリ ホスト プロジェクトで Service Bus リソースを追加するときに使用される名前と一致する必要があります。 つまり、AddAzureServiceBus
を呼び出す際に messaging
の名前を指定した場合、その同じ名前を AddAzureServiceBusClient
を呼び出す際にも使用する必要があります。 詳細については、「に Azure Service Bus リソースを追加する」を参照してください。
その後、依存関係の挿入を使用して ServiceBusClient インスタンスを取得できます。 たとえば、サービスの例から接続を取得するには、次のようにします。
public class ExampleService(ServiceBusClient client)
{
// Use client...
}
依存関係の挿入に関する詳細については、.NET 依存関係の挿入を参照してください。
キー付き Service Bus クライアントを追加する
接続名が異なる複数の ServiceBusClient
インスタンスを登録する場合があります。 キー付き Service Bus クライアントを登録するには、AddKeyedAzureServiceBusClient メソッドを呼び出します。
builder.AddKeyedAzureServiceBusClient(name: "mainBus");
builder.AddKeyedAzureServiceBusClient(name: "loggingBus");
重要
キー付きサービスを使用する場合、Service Bus リソースで 2 つの名前付きバス (1 つは mainBus
用、もう 1 つは loggingBus
用) が構成されている必要があります。
その後、依存関係の挿入を使用して ServiceBusClient
インスタンスを取得できます。 たとえば、サービスの例から接続を取得するには、次のようにします。
public class ExampleService(
[FromKeyedServices("mainBus")] ServiceBusClient mainBusClient,
[FromKeyedServices("loggingBus")] ServiceBusClient loggingBusClient)
{
// Use clients...
}
キー付きサービスの詳細については、「.NET 依存関係の挿入: キー付きサービスの」を参照してください。
構成
.NET Aspire Azure Service Bus 統合には、プロジェクトの要件と規則に基づいて接続を構成するための複数のオプションが用意されています。
接続文字列を使用する
ConnectionStrings
構成セクションの接続文字列を使用する場合は、AddAzureServiceBusClient メソッドを呼び出すときに接続文字列の名前を指定できます。
builder.AddAzureServiceBusClient("messaging");
その後、接続文字列は ConnectionStrings
構成セクションから取得されます。
{
"ConnectionStrings": {
"messaging": "Endpoint=sb://{namespace}.servicebus.windows.net/;SharedAccessKeyName={keyName};SharedAccessKey={key};"
}
}
この接続文字列の書式を設定する方法の詳細については、ConnectionString のドキュメントを参照してください。
構成プロバイダーを使用する
.NET Aspire
Azure Service Bus 統合では、Microsoft.Extensions.Configurationがサポートされます。
AzureMessagingServiceBusSettings キーを使用して、構成から Aspire:Azure:Messaging:ServiceBus
を読み込みます。 次のスニペットは、いくつかのオプションを構成する appsettings.json ファイルの例です。
{
"Aspire": {
"Azure": {
"Messaging": {
"ServiceBus": {
"ConnectionString": "Endpoint=sb://{namespace}.servicebus.windows.net/;SharedAccessKeyName={keyName};SharedAccessKey={key};",
"DisableTracing": false
}
}
}
}
}
完全な Service Bus クライアント統合 JSON スキーマについては、Aspireを参照してください。Azure.Messaging.ServiceBus/ConfigurationSchema.json.
インライン デリゲートを使用する
また、Action<AzureMessagingServiceBusSettings> configureSettings
デリゲートを渡して、コードからのトレースを無効にするなど、一部またはすべてのオプションをインラインで設定することもできます。
builder.AddAzureServiceBusClient(
"messaging",
static settings => settings.DisableTracing = true);
Azure.Messaging.ServiceBus.ServiceBusClientOptions メソッドの省略可能な Action<ServiceBusClientOptions> configureClientOptions
パラメーターを使用して、AddAzureServiceBusClient
を設定することもできます。 たとえば、このクライアントによって発生するすべての要求の問題に対して、ServiceBusClientOptions.Identifier ユーザー エージェント ヘッダー サフィックスを設定するには、次のようにします。
builder.AddAzureServiceBusClient(
"messaging",
configureClientOptions:
clientOptions => clientOptions.Identifier = "myapp");
Client 統合ヘルスチェック
既定では、.NET.NET Aspire 統合により、すべてのサービスの正常性チェックが有効になります。 詳細については、.NET.NET Aspire 統合の概要を参照してください。
.NET Aspire Azure Service Bus 統合:
-
AzureMessagingServiceBusSettings.DisableTracing が
false
されたときに正常性チェックを追加します。これは Service Bus への接続を試みます。 -
/health
HTTP エンドポイントと統合されます。このエンドポイントは、アプリがトラフィックを受け入れる準備ができていると見なされるために、登録されているすべての正常性チェックに合格する必要があります。
可観測性とテレメトリ
伐採
.NET Aspire Azure Service Bus 統合では、次のログ カテゴリが使用されます。
Azure.Core
Azure.Identity
Azure-Messaging-ServiceBus
失敗した要求の Azure Service Bus 要求診断を取得するだけでなく、待機時間のしきい値を構成して、成功した Azure Service Bus 要求診断をログに記録するかを決定できます。 既定値は、ポイント操作の場合は 100 ミリ秒、非ポイント操作の場合は 500 ミリ秒です。
builder.AddAzureServiceBusClient(
"messaging",
configureClientOptions:
clientOptions => {
clientOptions.ServiceBusClientTelemetryOptions = new()
{
ServiceBusThresholdOptions = new()
{
PointOperationLatencyThreshold = TimeSpan.FromMilliseconds(50),
NonPointOperationLatencyThreshold = TimeSpan.FromMilliseconds(300)
}
};
});
トレース
.NET Aspire Azure Service Bus 統合では、OpenTelemetryを使用して次のトレース アクティビティが出力されます。
Message
ServiceBusSender.Send
ServiceBusSender.Schedule
ServiceBusSender.Cancel
ServiceBusReceiver.Receive
ServiceBusReceiver.ReceiveDeferred
ServiceBusReceiver.Peek
ServiceBusReceiver.Abandon
ServiceBusReceiver.Complete
ServiceBusReceiver.DeadLetter
ServiceBusReceiver.Defer
ServiceBusReceiver.RenewMessageLock
ServiceBusSessionReceiver.RenewSessionLock
ServiceBusSessionReceiver.GetSessionState
ServiceBusSessionReceiver.SetSessionState
ServiceBusProcessor.ProcessMessage
ServiceBusSessionProcessor.ProcessSessionMessage
ServiceBusRuleManager.CreateRule
ServiceBusRuleManager.DeleteRule
ServiceBusRuleManager.GetRules
Azure Service Bus トレースは現在プレビュー段階であるため、トレースが確実に出力されるように試験段階のスイッチを設定する必要があります。
AppContext.SetSwitch("Azure.Experimental.EnableActivitySource", true);
詳細については、「Azure Service Bus: Service Bus メッセージングによる分散トレースと相関付け」を参照してください。
メトリック
.NET Aspire Azure Service Bus 統合は現在、Azure SDK の制限により、既定ではメトリックをサポートしていません。
関連項目
.NET Aspire