次の方法で共有


.NET Aspire Azure データ テーブルの統合

含まれているもの:ホスティング統合が含まれています ホスティング統合 —および— Client 統合が含まれていますClient 統合

Azure Table Storage は、構造化された NoSQL データを格納するためのサービスです。 .NET Aspire Azure データ テーブル統合を使用すると、既存の Azure Table Storage インスタンスに接続したり、.NET アプリケーションから新しいインスタンスを作成したりできます。

Hosting integration

.NET .NET Aspire Azure Storage ホスティング統合は、さまざまなストレージ リソースを次の種類としてモデル化します。

これらの型と API にアクセスして表現するには、、📦、Aspire、.Hosting、Azure、および を含む NuGet パッケージ .Storage を、アプリホスト プロジェクトに追加します。

dotnet add package Aspire.Hosting.Azure.Storage

詳細については、「dotnet パッケージ の追加」または「.NET アプリケーションでのパッケージの依存関係の管理」を参照してください。

ストレージ リソース Azure 追加する

アプリ ホスト プロジェクトで、AddAzureStorage を呼び出して、Azure Storage リソース ビルダーを追加して返します。

var builder = DistributedApplication.CreateBuilder(args);

var storage = builder.AddAzureStorage("storage");

// An Azure Storage resource is required to add any of the following:
//
// - Azure Blob storage resource.
// - Azure Queue storage resource.
// - Azure Table storage resource.

// After adding all resources, run the app...

アプリ ホストに AzureStorageResource を追加すると、BLOB、Queue、Table Storage のリソース Azure 追加するための他の便利な API が公開されます。 つまり、他のストレージ リソースを追加する前に、AzureStorageResource を追加する必要があります。

Important

AddAzureStorageを呼び出すと、暗黙的に AddAzureProvisioningが呼び出されます。これによって、アプリの起動時に Azure リソースを動的に生成するためのサポートが追加されます。 アプリは、適切なサブスクリプションと場所を構成する必要があります。 詳細については、「ローカル プロビジョニング: 構成」を参照してください。

Provisioning-generated Bicep

Bicepを初めて使う場合は、Azureリソースを定義するためのドメイン固有の言語です。 .NET .NET Aspireでは、Bicep を手動で記述する必要はありません。代わりに、プロビジョニング API によって Bicep が生成されます。 アプリを発行すると、生成された Bicep がマニフェスト ファイルと共に出力されます。 Azure Storage リソースを追加すると、次の Bicep が生成されます。

@description('The location for the resource(s) to be deployed.')
param location string = resourceGroup().location

resource storage 'Microsoft.Storage/storageAccounts@2024-01-01' = {
  name: take('storage${uniqueString(resourceGroup().id)}', 24)
  kind: 'StorageV2'
  location: location
  sku: {
    name: 'Standard_GRS'
  }
  properties: {
    accessTier: 'Hot'
    allowSharedKeyAccess: false
    minimumTlsVersion: 'TLS1_2'
    networkAcls: {
      defaultAction: 'Allow'
    }
  }
  tags: {
    'aspire-resource-name': 'storage'
  }
}

output blobEndpoint string = storage.properties.primaryEndpoints.blob

output queueEndpoint string = storage.properties.primaryEndpoints.queue

output tableEndpoint string = storage.properties.primaryEndpoints.table

output name string = storage.name

上記の Bicep は、Azure ストレージ アカウントを次の既定値でプロビジョニングするモジュールです。

  • kind: ストレージ アカウントの種類。 既定値は StorageV2です。
  • sku: ストレージ アカウントの SKU。 既定値は Standard_GRSです。
  • properties: ストレージ アカウントのプロパティ:
    • accessTier: ストレージ アカウントのアクセス層。 既定値は Hotです。
    • allowSharedKeyAccess: ストレージ アカウントがアカウント アクセス キーによる要求の承認を許可するかどうかを示すブール値。 既定値は falseです。
    • minimumTlsVersion: ストレージ アカウントでサポートされている TLS の最小バージョン。 既定値は TLS1_2です。
    • networkAcls: ストレージ アカウントのネットワーク ACL。 既定値は { defaultAction: 'Allow' }です。

ストレージ アカウントに加えて、BLOB コンテナーもプロビジョニングします。

次のロールの割り当てがストレージ アカウントに追加され、アプリケーションへのアクセスが許可されます。 詳細については、組み込みの Azure ロールベースのアクセス制御 (Azure RBAC) ロール を参照してください。

役割/ID Description
ストレージ ブロブ データ コントリビューター
ba92f5b4-2d11-453d-a403-e96b0029c9fe
ストレージ コンテナーと BLOB の「Azure」を読み取り、書き込み、削除します。
ストレージ テーブル データ共同作成者
0a9a7e1f-b9d0-4cc4-a60d-0319b160aaa3
Storage のテーブルとエンティティ Azure 読み取り、書き込み、削除します。
ストレージ キュー データ共同作成者
974c5e8b-45b9-4653-ba55-5f855dd0fb88
Azure ストレージキューおよびキューメッセージを読み取り、書き込み、削除します。

さらに、ロールの割り当ては、別のモジュールで Azure リソースに対して作成されます。

@description('The location for the resource(s) to be deployed.')
param location string = resourceGroup().location

param storage_outputs_name string

param principalType string

param principalId string

resource storage 'Microsoft.Storage/storageAccounts@2024-01-01' existing = {
  name: storage_outputs_name
}

resource storage_StorageBlobDataContributor 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(storage.id, principalId, subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe'))
  properties: {
    principalId: principalId
    roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe')
    principalType: principalType
  }
  scope: storage
}

resource storage_StorageTableDataContributor 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(storage.id, principalId, subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0a9a7e1f-b9d0-4cc4-a60d-0319b160aaa3'))
  properties: {
    principalId: principalId
    roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0a9a7e1f-b9d0-4cc4-a60d-0319b160aaa3')
    principalType: principalType
  }
  scope: storage
}

resource storage_StorageQueueDataContributor 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(storage.id, principalId, subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '974c5e8b-45b9-4653-ba55-5f855dd0fb88'))
  properties: {
    principalId: principalId
    roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '974c5e8b-45b9-4653-ba55-5f855dd0fb88')
    principalType: principalType
  }
  scope: storage
}

生成された Bicep は開始点であり、C# のプロビジョニング インフラストラクチャへの変更の影響を受ける。 Bicep ファイルのカスタマイズは直接上書きされるため、C# プロビジョニング API を通じて変更を加えて、生成されたファイルに反映されるようにします。

プロビジョニング インフラストラクチャをカスタマイズする

すべての .NET AspireAzure リソースは、AzureProvisioningResource 型のサブクラスです。 生成された Bicep は、Azure API を使用して、ConfigureInfrastructure<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure>) リソースを構成するための流暢な API を提供することにより、カスタマイズできます。 たとえば、kindskupropertiesなどを構成できます。 次の例では、Azure Storage リソースをカスタマイズする方法を示します。

builder.AddAzureStorage("storage")
    .ConfigureInfrastructure(infra =>
    {
        var storageAccount = infra.GetProvisionableResources()
                                  .OfType<StorageAccount>()
                                  .Single();

        storageAccount.AccessTier = StorageAccountAccessTier.Cool;
        storageAccount.Sku = new StorageSku { Name = StorageSkuName.PremiumZrs };
        storageAccount.Tags.Add("ExampleKey", "Example value");
    });

上記のコード:

Azure Storage リソースをカスタマイズするために使用できる構成オプションは他にも多数あります。 詳細については、Azure.Provisioning.Storageを参照してください。

既存の Azure ストレージ アカウントに接続する

接続する既存の Azure ストレージ アカウントがある場合があります。 呼び出しをチェーンして、AzureStorageResource が既存のリソースであることを注釈付けることができます。

var builder = DistributedApplication.CreateBuilder(args);

var existingStorageName = builder.AddParameter("existingStorageName");
var existingStorageResourceGroup = builder.AddParameter("existingStorageResourceGroup");

var storageaccount = builder.AddAzureStorage("storage")
                    .AsExisting(existingStorageName, existingStorageResourceGroup)
                    .AddBlobs("blobs");

builder.AddProject<Projects.ExampleProject>()
       .WithReference(storageaccount);

// After adding all resources, run the app...

Important

RunAsExistingPublishAsExisting、またはAsExistingメソッドを呼び出して、Azure サブスクリプションに既に存在するリソースを操作する場合は、特定の構成値をアプリ ホストに追加して、.NET Aspireが見つけられるようにする必要があります。 必要な構成値には、 SubscriptionIdAllowResourceGroupCreationResourceGroupLocation が含まれます。 設定しない場合は、 .NET.NET Aspire ダッシュボードに "構成がありません" エラーが表示されます。 設定方法の詳細については、「 構成」を参照してください。

Azure Storage リソースを既存のリソースとして扱う方法の詳細については、「既存のAzure リソースを使用する」を参照してください。

Note

または、 Azure ストレージ アカウント リソースを表す代わりに、接続文字列をアプリ ホストに追加することもできます。 このアプローチは弱く型指定されており、ロールの割り当てやインフラストラクチャのカスタマイズでは機能しません。 詳細については、「Azureを使用して既存の リソースを追加する」を参照してください。

ストレージ エミュレーター リソース Azure 追加する

Azure ストレージ エミュレーター リソースを追加するには、IResourceBuilder<AzureStorageResource> の呼び出しを RunAsEmulator API にチェーンします。

var builder = DistributedApplication.CreateBuilder(args);

var storage = builder.AddAzureStorage("storage")
                     .RunAsEmulator();

// After adding all resources, run the app...

RunAsEmulatorを呼び出すと、エミュレーターを使用してローカルで実行するようにストレージ リソースが構成されます。 この場合のエミュレーターは Azuriteです。 Azurite オープンソース エミュレーターは、Azure BLOB、Queue Storage、Table Storage アプリをテストするための無料のローカル環境を提供します。これは、.NET AspireAzure ホスティング統合に最適なコンパニオンです。 Azurite はインストールされていません。代わりに、コンテナーとして .NET.NET Aspire アクセスできます。 前の例に示すように、mcr.microsoft.com/azure-storage/azurite イメージでコンテナーをアプリ ホストに追加すると、アプリ ホストが起動したときにコンテナーが作成されて起動されます。 詳細については、「コンテナー リソースのライフサイクルの」を参照してください。

Azurite コンテナーを構成する

コンテナー リソースで使用できるさまざまな構成があります。たとえば、コンテナーのポート、環境変数、 有効期間などを構成できます。

Azurite コンテナー ポートの構成

既定では、.NET.NET Aspireによって構成された Azurite コンテナーは、次のエンドポイントを公開します。

Endpoint Container port Host port
blob 10000 dynamic
queue 10001 dynamic
table 10002 dynamic

監視しているポートは、既定では動的です。 コンテナーが起動すると、ポートはホスト コンピューター上のランダムなポートにマップされます。 エンドポイント ポートを構成するには、次の例に示すように、RunAsEmulator メソッドによって提供されるコンテナー リソース ビルダーの呼び出しをチェーンします。

var builder = DistributedApplication.CreateBuilder(args);

var storage = builder.AddAzureStorage("storage").RunAsEmulator(
                     azurite =>
                     {
                         azurite.WithBlobPort(27000)
                                .WithQueuePort(27001)
                                .WithTablePort(27002);
                     });

// After adding all resources, run the app...

上記のコードは、Azurite コンテナーの既存の blobqueue、および table エンドポイントを構成して、ポート 2700027001、および 27002をそれぞれリッスンします。 Azurite コンテナーのポートは、次の表に示すようにホスト ポートにマップされます。

Endpoint name ポート マッピング (container:host)
blob 10000:27000
queue 10001:27001
table 10002:27002
永続的な有効期間で Azurite コンテナーを構成する

永続的な有効期間で Azurite コンテナーを構成するには、Azurite コンテナー リソースで WithLifetime メソッドを呼び出し、ContainerLifetime.Persistent渡します。

var builder = DistributedApplication.CreateBuilder(args);

var storage = builder.AddAzureStorage("storage").RunAsEmulator(
                     azurite =>
                     {
                         azurite.WithLifetime(ContainerLifetime.Persistent);
                     });

// After adding all resources, run the app...

詳細については、「コンテナー リソースの有効期間 」を参照してください。

データ ボリュームを使用して Azurite コンテナーを構成する

Azure ストレージ エミュレーター リソースにデータ ボリュームを追加するには、WithDataVolume ストレージ エミュレーター リソースで Azure メソッドを呼び出します。

var builder = DistributedApplication.CreateBuilder(args);

var storage = builder.AddAzureStorage("storage").RunAsEmulator(
                     azurite =>
                     {
                         azurite.WithDataVolume();
                     });

// After adding all resources, run the app...

データ ボリュームは、Azurite データをコンテナーのライフサイクル外に保持するために使用されます。 データ ボリュームは Azurite コンテナーの /data パスにマウントされ、name パラメーターが指定されていない場合、名前は .azurite/{resource name}形式になります。 データボリュームに関する詳細や、なぜバインド マウントよりも好まれるかについては、「Docker ドキュメント:ボリューム」を参照してください。

データ バインド マウントを使用して Azurite コンテナーを構成する

Azure ストレージ エミュレーター リソースにデータ バインド マウントを追加するには、WithDataBindMount メソッドを呼び出します。

var builder = DistributedApplication.CreateBuilder(args);

var storage = builder.AddAzureStorage("storage").RunAsEmulator(
                     azurite =>
                     {
                         azurite.WithDataBindMount("../Azurite/Data");
                     });

// After adding all resources, run the app...

Important

データ バインド マウント、パフォーマンス、移植性、およびセキュリティが向上し、運用環境に適した ボリュームと比較して機能が制限されています。 ただし、バインド マウントを使用すると、ホスト システム上のファイルに直接アクセスして変更できるため、リアルタイムの変更が必要な開発とテストに最適です。

データ バインド マウントは、コンテナーの再起動の間に Azurite データを保持するために、ホスト マシンのファイルシステムに依存します。 データ バインド マウントは、Azurite コンテナー内のアプリ ホスト ディレクトリ (../Azurite/Data) を基準にして、ホスト コンピューター上の IDistributedApplicationBuilder.AppHostDirectory パスにマウントされます。 データバインドマウントの詳細については、「Docker のドキュメント: バインドマウント」を参照してください。

ストレージ リソースに接続する

.NET .NET Aspire アプリ ホストを実行すると、Azure Storage Explorerなどの外部ツールからストレージ リソースにアクセスできます。 Azurite を使用してストレージ リソースがローカルで実行されている場合は、Azure Storage Explorer によって自動的に取得されます。

Note

Azure Storage Explorer は、既定のポートが使用されていると仮定して Azurite ストレージ リソースを検出します。 異なるポートを使用するように Azurite コンテナーを構成 した場合は、適切なポートに接続するように Storage Explorer を構成する必要があります。

ストレージ エクスプローラーからストレージ リソース Azure 接続するには、次の手順に従います。

  1. .NET .NET Aspire アプリ ホストを実行します。

  2. Azure Storage Explorer を開きます。

  3. エクスプローラーの ペインを表示します。

  4. [すべてを更新] リンクを選択して、ストレージ アカウントの一覧を更新します。

  5. Emulator & Attached ノードを展開する。

  6. ストレージ アカウント ノードを展開します。

  7. リソースの名前がプレフィックスとして含まれたストレージ アカウントが表示されます。

    Azure ストレージ エクスプローラー: Azurite ストレージ リソースが検出されました。

Azure Storage Explorer を使用して、ストレージ アカウントとその内容を自由に探索できます。 Azure Storage Explorer の使用方法の詳細については、「Storage Explorerを始める」をご覧ください。

リソース Azure Table Storage を追加する

アプリ ホスト プロジェクトで、Azure Table Storageによって返された AddTables インスタンスで IResourceBuilder<IAzureStorageResource> への呼び出しを連結して、AddAzureStorage 統合を登録します。 次の例では、Azure Table Storage という名前の storage リソースと tablesという名前のテーブル リソースを追加する方法を示します。

var builder = DistributedApplication.CreateBuilder(args);

var tables = builder.AddAzureStorage("storage")
                    .AddTables("tables");

builder.AddProject<Projects.ExampleProject>()
       .WithReference(tables)
       .WaitFor(tables);

// After adding all resources, run the app...

上記のコード:

  • Azureという名前の storage Storage リソースを追加します。
  • tables という名前のテーブル ストレージ リソースをストレージ リソースに追加します。
  • storage リソースを ExampleProject に追加し、準備が整うのを待ってからプロジェクトを開始します。

Provisioning-generated Bicep

Bicepを初めて使う場合は、Azureリソースを定義するためのドメイン固有の言語です。 .NET .NET Aspireでは、Bicep を手動で記述する必要はありません。代わりに、プロビジョニング API によって Bicep が生成されます。 アプリを発行すると、生成された Bicep がマニフェスト ファイルと共に出力されます。 Azure Storage リソースを追加すると、次の Bicep が生成されます。

@description('The location for the resource(s) to be deployed.')
param location string = resourceGroup().location

resource storage 'Microsoft.Storage/storageAccounts@2024-01-01' = {
  name: take('storage${uniqueString(resourceGroup().id)}', 24)
  kind: 'StorageV2'
  location: location
  sku: {
    name: 'Standard_GRS'
  }
  properties: {
    accessTier: 'Hot'
    allowSharedKeyAccess: false
    minimumTlsVersion: 'TLS1_2'
    networkAcls: {
      defaultAction: 'Allow'
    }
  }
  tags: {
    'aspire-resource-name': 'storage'
  }
}

output blobEndpoint string = storage.properties.primaryEndpoints.blob

output queueEndpoint string = storage.properties.primaryEndpoints.queue

output tableEndpoint string = storage.properties.primaryEndpoints.table

output name string = storage.name

上記の Bicep は、Azure ストレージ アカウントを次の既定値でプロビジョニングするモジュールです。

  • kind: ストレージ アカウントの種類。 既定値は StorageV2です。
  • sku: ストレージ アカウントの SKU。 既定値は Standard_GRSです。
  • properties: ストレージ アカウントのプロパティ:
    • accessTier: ストレージ アカウントのアクセス層。 既定値は Hotです。
    • allowSharedKeyAccess: ストレージ アカウントがアカウント アクセス キーによる要求の承認を許可するかどうかを示すブール値。 既定値は falseです。
    • minimumTlsVersion: ストレージ アカウントでサポートされている TLS の最小バージョン。 既定値は TLS1_2です。
    • networkAcls: ストレージ アカウントのネットワーク ACL。 既定値は { defaultAction: 'Allow' }です。

ストレージ アカウントに加えて、BLOB コンテナーもプロビジョニングします。

次のロールの割り当てがストレージ アカウントに追加され、アプリケーションへのアクセスが許可されます。 詳細については、組み込みの Azure ロールベースのアクセス制御 (Azure RBAC) ロール を参照してください。

役割/ID Description
ストレージ ブロブ データ コントリビューター
ba92f5b4-2d11-453d-a403-e96b0029c9fe
ストレージ コンテナーと BLOB の「Azure」を読み取り、書き込み、削除します。
ストレージ テーブル データ共同作成者
0a9a7e1f-b9d0-4cc4-a60d-0319b160aaa3
Storage のテーブルとエンティティ Azure 読み取り、書き込み、削除します。
ストレージ キュー データ共同作成者
974c5e8b-45b9-4653-ba55-5f855dd0fb88
Azure ストレージキューおよびキューメッセージを読み取り、書き込み、削除します。

さらに、ロールの割り当ては、別のモジュールで Azure リソースに対して作成されます。

@description('The location for the resource(s) to be deployed.')
param location string = resourceGroup().location

param storage_outputs_name string

param principalType string

param principalId string

resource storage 'Microsoft.Storage/storageAccounts@2024-01-01' existing = {
  name: storage_outputs_name
}

resource storage_StorageBlobDataContributor 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(storage.id, principalId, subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe'))
  properties: {
    principalId: principalId
    roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ba92f5b4-2d11-453d-a403-e96b0029c9fe')
    principalType: principalType
  }
  scope: storage
}

resource storage_StorageTableDataContributor 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(storage.id, principalId, subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0a9a7e1f-b9d0-4cc4-a60d-0319b160aaa3'))
  properties: {
    principalId: principalId
    roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0a9a7e1f-b9d0-4cc4-a60d-0319b160aaa3')
    principalType: principalType
  }
  scope: storage
}

resource storage_StorageQueueDataContributor 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(storage.id, principalId, subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '974c5e8b-45b9-4653-ba55-5f855dd0fb88'))
  properties: {
    principalId: principalId
    roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '974c5e8b-45b9-4653-ba55-5f855dd0fb88')
    principalType: principalType
  }
  scope: storage
}

生成された Bicep は開始点であり、C# のプロビジョニング インフラストラクチャへの変更の影響を受ける。 Bicep ファイルのカスタマイズは直接上書きされるため、C# プロビジョニング API を通じて変更を加えて、生成されたファイルに反映されるようにします。

プロビジョニング インフラストラクチャをカスタマイズする

すべての .NET AspireAzure リソースは、AzureProvisioningResource 型のサブクラスです。 生成された Bicep は、Azure API を使用して、ConfigureInfrastructure<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure>) リソースを構成するための流暢な API を提供することにより、カスタマイズできます。 たとえば、kindskupropertiesなどを構成できます。 次の例では、Azure Storage リソースをカスタマイズする方法を示します。

builder.AddAzureStorage("storage")
    .ConfigureInfrastructure(infra =>
    {
        var storageAccount = infra.GetProvisionableResources()
                                  .OfType<StorageAccount>()
                                  .Single();

        storageAccount.AccessTier = StorageAccountAccessTier.Cool;
        storageAccount.Sku = new StorageSku { Name = StorageSkuName.PremiumZrs };
        storageAccount.Tags.Add("ExampleKey", "Example value");
    });

上記のコード:

Azure Storage リソースをカスタマイズするために使用できる構成オプションは他にも多数あります。 詳細については、Azure.Provisioning.Storageを参照してください。

ストレージ エミュレーター リソース Azure 追加する

Azure ストレージ エミュレーター リソースを追加するには、IResourceBuilder<AzureStorageResource> の呼び出しを RunAsEmulator API にチェーンします。

var builder = DistributedApplication.CreateBuilder(args);

var storage = builder.AddAzureStorage("storage")
                     .RunAsEmulator();

// After adding all resources, run the app...

RunAsEmulatorを呼び出すと、エミュレーターを使用してローカルで実行するようにストレージ リソースが構成されます。 この場合のエミュレーターは Azuriteです。 Azurite オープンソース エミュレーターは、Azure BLOB、Queue Storage、Table Storage アプリをテストするための無料のローカル環境を提供します。これは、.NET AspireAzure ホスティング統合に最適なコンパニオンです。 Azurite がインストールされていません。代わりに、コンテナーとして .NET.NET Aspire にアクセスできます。 前の例に示すように、mcr.microsoft.com/azure-storage/azurite イメージでコンテナーをアプリ ホストに追加すると、アプリ ホストが起動したときにコンテナーが作成されて起動されます。 詳細については、「コンテナー リソースのライフサイクルの」を参照してください。

Azurite コンテナーを構成する

コンテナー リソースで使用できるさまざまな構成があります。たとえば、コンテナーのポート、環境変数、 有効期間などを構成できます。

Azurite コンテナー ポートの構成

既定では、Azurite コンテナーは、 .NET.NET Aspireによって構成されると、次のエンドポイントを公開します。

Endpoint Container port Host port
blob 10000 dynamic
queue 10001 dynamic
table 10002 dynamic

監視しているポートは、既定では動的です。 コンテナーが起動すると、ポートはホスト コンピューター上のランダムなポートにマップされます。 エンドポイント ポートを構成するには、次の例に示すように、RunAsEmulator メソッドによって提供されるコンテナー リソース ビルダーの呼び出しをチェーンします。

var builder = DistributedApplication.CreateBuilder(args);

var storage = builder.AddAzureStorage("storage").RunAsEmulator(
                     azurite =>
                     {
                         azurite.WithBlobPort(27000)
                                .WithQueuePort(27001)
                                .WithTablePort(27002);
                     });

// After adding all resources, run the app...

上記のコードは、Azurite コンテナーの既存の blobqueue、および table エンドポイントを構成して、ポート 2700027001、および 27002をそれぞれリッスンします。 Azurite コンテナーのポートは、次の表に示すようにホスト ポートにマップされます。

Endpoint name ポート マッピング (container:host)
blob 10000:27000
queue 10001:27001
table 10002:27002
永続的な有効期間で Azurite コンテナーを構成する

永続的な有効期間で Azurite コンテナーを構成するには、Azurite コンテナー リソースで WithLifetime メソッドを呼び出し、ContainerLifetime.Persistent渡します。

var builder = DistributedApplication.CreateBuilder(args);

var storage = builder.AddAzureStorage("storage").RunAsEmulator(
                     azurite =>
                     {
                         azurite.WithLifetime(ContainerLifetime.Persistent);
                     });

// After adding all resources, run the app...

詳細については、「コンテナー リソースの有効期間 」を参照してください。

データ ボリュームを使用して Azurite コンテナーを構成する

Azure ストレージ エミュレーター リソースにデータ ボリュームを追加するには、WithDataVolume ストレージ エミュレーター リソースで Azure メソッドを呼び出します。

var builder = DistributedApplication.CreateBuilder(args);

var storage = builder.AddAzureStorage("storage").RunAsEmulator(
                     azurite =>
                     {
                         azurite.WithDataVolume();
                     });

// After adding all resources, run the app...

データ ボリュームは、Azurite データをコンテナーのライフサイクル外に保持するために使用されます。 データ ボリュームは Azurite コンテナーの /data パスにマウントされ、name パラメーターが指定されていない場合、名前は .azurite/{resource name}形式になります。 データボリュームに関する詳細や、なぜバインド マウントよりも好まれるかについては、「Docker ドキュメント:ボリューム」を参照してください。

データ バインド マウントを使用して Azurite コンテナーを構成する

Azure ストレージ エミュレーター リソースにデータ バインド マウントを追加するには、WithDataBindMount メソッドを呼び出します。

var builder = DistributedApplication.CreateBuilder(args);

var storage = builder.AddAzureStorage("storage").RunAsEmulator(
                     azurite =>
                     {
                         azurite.WithDataBindMount("../Azurite/Data");
                     });

// After adding all resources, run the app...

Important

データ バインド マウント、パフォーマンス、移植性、およびセキュリティが向上し、運用環境に適した ボリュームと比較して機能が制限されています。 ただし、バインド マウントを使用すると、ホスト システム上のファイルに直接アクセスして変更できるため、リアルタイムの変更が必要な開発とテストに最適です。

データ バインド マウントは、コンテナーの再起動の間に Azurite データを保持するために、ホスト マシンのファイルシステムに依存します。 データ バインド マウントは、Azurite コンテナー内のアプリ ホスト ディレクトリ (../Azurite/Data) を基準にして、ホスト コンピューター上の IDistributedApplicationBuilder.AppHostDirectory パスにマウントされます。 データバインドマウントの詳細については、「Docker のドキュメント: バインドマウント」を参照してください。

既存の Azure ストレージ アカウントに接続する

接続する既存の Azure ストレージ アカウントがある場合があります。 新しい Azure Storage リソースを表す代わりに、接続文字列をアプリ ホストに追加できます。 既存の Azure Storage アカウントに接続を追加するには、AddConnectionString メソッドを呼び出します。

var builder = DistributedApplication.CreateBuilder(args);

var blobs = builder.AddConnectionString("blobs");

builder.AddProject<Projects.WebApplication>("web")
       .WithReference(blobs);

// After adding all resources, run the app...

Note

接続文字列は、データベース接続、メッセージ ブローカー、エンドポイント URI、その他のサービスなど、さまざまな接続情報を表すために使用されます。 .NET .NET Aspire 命名法では、"接続文字列" という用語は、あらゆる種類の接続情報を表すために使用されます。

接続文字列は、アプリ ホストの構成 (通常は セクションの ConnectionStrings) で構成されます。 アプリ ホストは、この接続文字列を環境変数としてすべての依存リソースに挿入します。次に例を示します。

{
    "ConnectionStrings": {
        "blobs": "https://{account_name}.blob.core.windows.net/"
    }
}

依存リソースは、GetConnectionString メソッドを呼び出し、接続名をパラメーターとして渡すことによって、挿入された接続文字列にアクセスできます(この場合 "blobs"GetConnectionString API は、IConfiguration.GetSection("ConnectionStrings")[name]の短縮形です。

ストレージ リソースに接続する

.NET .NET Aspire アプリ ホストを実行すると、Azure Storage Explorerなどの外部ツールからストレージ リソースにアクセスできます。 Azurite を使用してストレージ リソースがローカルで実行されている場合は、Azure Storage Explorer によって自動的に取得されます。

Note

Azure Storage Explorer は、既定のポートが使用されていると仮定して Azurite ストレージ リソースを検出します。 異なるポートを使用するように Azurite コンテナーを構成 した場合は、適切なポートに接続するように Storage Explorer を構成する必要があります。

ストレージ エクスプローラーからストレージ リソース Azure 接続するには、次の手順に従います。

  1. .NET .NET Aspire アプリ ホストを実行します。

  2. Azure Storage Explorer を開きます。

  3. エクスプローラーの ペインを表示します。

  4. [すべてを更新] リンクを選択して、ストレージ アカウントの一覧を更新します。

  5. Emulator & Attached ノードを展開する。

  6. ストレージ アカウント ノードを展開します。

  7. リソースの名前がプレフィックスとして含まれたストレージ アカウントが表示されます。

    Azure ストレージ エクスプローラー: Azurite ストレージ リソースが検出されました。

Azure Storage Explorer を使用して、ストレージ アカウントとその内容を自由に探索できます。 Azure Storage Explorer の使用方法の詳細については、「Storage Explorerを始める」をご覧ください。

ホスティング統合の正常性チェック

Azure Storage ホスティング統合により、ストレージ リソースの正常性チェックが自動的に追加されます。 エミュレーターとして実行されている場合にのみ追加され、Azurite コンテナーが実行されていることと、そのコンテナーへの接続を確立できることを確認します。 ホスティング統合は、📦 AspNetCore.HealthChecks およびAzure.Storage.Blobs NuGet パッケージに依存しています。

Client 統合

.NET Aspire Azure Data Tables クライアント統合を開始するには、📦AspireおよびAzure.Data.Tables NuGet パッケージをクライアントを使用するプロジェクト、つまり Azure データテーブルクライアントを使用するアプリケーションのプロジェクトにインストールします。 Azure Data Tables クライアント統合により、TableServiceClientとの対話に使用できる Azure Table Storage インスタンスが登録されます。

dotnet add package Aspire.Azure.Data.Tables

クライアント Azure Table Storage 追加する

クライアントを使用するプロジェクトの Program.cs ファイルで、任意の AddAzureTableClientIHostApplicationBuilder 拡張メソッドを呼び出して、依存関係挿入コンテナーを介して使用する TableServiceClient を登録します。 このメソッドは、接続名パラメーターを受け取ります。

builder.AddAzureTableClient("tables");

その後、依存関係の挿入を使用して TableServiceClient インスタンスを取得できます。 たとえば、サービスからクライアントを取得するには、次のようにします。

public class ExampleService(TableServiceClient client)
{
    // Use client...
}

Configuration

.NET Aspire Azure Table Storage 統合には、プロジェクトの要件と規則に基づいて TableServiceClient を構成するための複数のオプションが用意されています。

構成プロバイダーを使用する

.NET Aspire Azure Table Storage 統合では、Microsoft.Extensions.Configurationがサポートされます。 AzureDataTablesSettings キーを使用して、構成から TableClientOptionsAspire:Azure:Data:Tables を読み込みます。 次のスニペットは、いくつかのオプションを構成する appsettings.json ファイルの例です。

{
  "Aspire": {
    "Azure": {
      "Data": {
        "Tables": {
          "ServiceUri": "YOUR_URI",
          "DisableHealthChecks": true,
          "DisableTracing": false,
          "ClientOptions": {
            "EnableTenantDiscovery": true
          }
        }
      }
    }
  }
}

完全な Azure Data Tables クライアント統合 JSON スキーマについては、Aspireを参照してください。Azure.Data.Tables/ConfigurationSchema.json

名前付き構成を使用する

.NET Aspire Azure Table Storage統合では、名前付き構成がサポートされています。これにより、同じリソースの種類の複数のインスタンスを異なる設定で構成できます。 名前付き構成では、メイン構成セクションのキーとして接続名が使用されます。

{
  "Aspire": {
    "Azure": {
      "Data": {
        "Tables": {
          "tables1": {
            "ServiceUri": "https://myaccount1.table.core.windows.net/",
            "DisableHealthChecks": true,
            "ClientOptions": {
              "EnableTenantDiscovery": true
            }
          },
          "tables2": {
            "ServiceUri": "https://myaccount2.table.core.windows.net/",
            "DisableTracing": true,
            "ClientOptions": {
              "EnableTenantDiscovery": false
            }
          }
        }
      }
    }
  }
}

この例では、tables1を呼び出すときに、tables2AddAzureTableClientの接続名を使用できます。

builder.AddAzureTableClient("tables1");
builder.AddAzureTableClient("tables2");

名前付き構成は、最上位レベルの構成よりも優先されます。 両方を指定すると、名前付き構成の設定が最上位の設定よりも優先されます。

インライン デリゲートを使用する

Action<AzureDataTablesSettings> configureSettings デリゲートを渡して、一部またはすべてのオプションをインラインで設定することもできます。たとえば、ServiceUriを構成する場合などです。

builder.AddAzureTableClient(
    "tables",
    settings => settings.DisableHealthChecks = true);

TableClientOptions メソッドの 2 番目のパラメーター Action<IAzureClientBuilder<TableServiceClient, TableClientOptions>> configureClientBuilder デリゲートを使用して、AddAzureTableClient を設定することもできます。 たとえば、クライアントを識別する TableServiceClient ID を設定するには、次のようにします。

builder.AddAzureTableClient(
    "tables",
    configureClientBuilder: clientBuilder =>
        clientBuilder.ConfigureOptions(
            options => options.EnableTenantDiscovery = true));

Client 統合健康診断

既定では、.NET.NET Aspire 統合により、すべてのサービス 正常性チェック が有効になります。 詳細については、.NET.NET Aspire 統合の概要を参照してください。

.NET Aspire Azure データ テーブルの統合:

  • AzureDataTablesSettings.DisableHealthChecksfalseされたときに正常性チェックを追加し、Azure Table Storageへの接続を試みます。
  • /health HTTP エンドポイントと統合されます。このエンドポイントは、アプリがトラフィックを受け入れる準備ができていると見なされるために、登録されているすべての正常性チェックに合格する必要があります。

可観測性とテレメトリ

統合により、ログ記録、トレース、メトリックの構成が自動的に設定されます。これは、監視の柱 とも呼ばれます。 統合の可観測性とテレメトリの詳細については、統合の概要 参照してください。 バッキング サービスによっては、一部の統合でこれらの機能の一部のみがサポートされる場合があります。 たとえば、一部の統合ではログ記録とトレースがサポートされますが、メトリックはサポートされません。 テレメトリ機能は、「構成」セクションに記載されている手法を使用して無効にすることもできます。

Logging

.NET Aspire Azure データ テーブル統合では、次のログ カテゴリが使用されます。

  • Azure.Core
  • Azure.Identity

Tracing

.NET Aspire Azure データ テーブル統合では、OpenTelemetryを使用して次のトレース アクティビティが出力されます。

  • Azure.Data.Tables.TableServiceClient

Metrics

.NET Aspire Azure データ テーブルの統合では現在、Azure SDK の制限により、既定ではメトリックがサポートされていません。

See also