Integração de tabelas de dados .NET AspireAzure
Inclui:integração de hospedagem e Client integração
Azure Table Storage é um serviço para armazenar dados NoSQL estruturados. A integração .NET AspireAzure Tabelas de Dados permite que você se conecte a instâncias existentes de Azure Table Storage ou crie novas instâncias a partir de aplicativos .NET.
Integração de hospedagem
A integração de hospedagem de armazenamento .NET.NET AspireAzure modela os vários recursos de armazenamento como os seguintes tipos:
- AzureStorageResource: representa um recurso de armazenamento Azure.
- AzureStorageEmulatorResource: representa um recurso do emulador de Armazenamento Azure (Azurite).
- AzureBlobStorageResource: representa um recurso de armazenamento de Blobs Azure.
- AzureQueueStorageResource: Representa um recurso de armazenamento para filas Azure.
- AzureTableStorageResource: representa um recurso de armazenamento de tabela Azure.
Para acessar esses tipos e APIs para expressá-los, adicione o 📦Aspire.Hosting.Azure.Storage pacote NuGet no projeto de host do aplicativo .
dotnet add package Aspire.Hosting.Azure.Storage
Para obter mais informações, consulte dotnet adicionar pacote ou Gerenciar dependências de pacotes em .NET aplicativos.
Adicionar Azure recurso de Armazenamento
Em seu projeto de host de aplicativo, chame AddAzureStorage para adicionar e retornar um construtor de recursos de armazenamento Azure.
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...
Quando você adiciona um AzureStorageResource
ao host do aplicativo, ele expõe outras APIs úteis para adicionar Azure blob, fila e recursos de armazenamento de tabela. Em outras palavras, você deve adicionar um AzureStorageResource
antes de adicionar qualquer um dos outros recursos de armazenamento.
Importante
Quando você chama AddAzureStorage, ele chama implicitamente AddAzureProvisioning— o que adiciona suporte para gerar recursos Azure dinamicamente durante a inicialização do aplicativo. O aplicativo deve configurar a assinatura e o local apropriados. Para obter mais informações, consulte Provisionamento local: Configuração.
Provisionamento Bicep gerado
Se você é novo no Bicep, é uma linguagem específica de domínio para definir recursos Azure. Com .NET.NET Aspire, você não precisa escrever Bicep manualmente; as APIs de provisionamento geram Bicep para você. Quando você publica seu aplicativo, o Bicep gerado é exibido junto com o arquivo de manifesto. Quando você adiciona um recurso de Armazenamento Azure, o seguinte Bicep é gerado:
Alternar Armazenamento Bicep Azure.
@description('The location for the resource(s) to be deployed.')
param location string = resourceGroup().location
param principalId string
param principalType string
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'
}
}
resource blobs 'Microsoft.Storage/storageAccounts/blobServices@2024-01-01' = {
name: 'default'
parent: storage
}
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
}
output blobEndpoint string = storage.properties.primaryEndpoints.blob
output queueEndpoint string = storage.properties.primaryEndpoints.queue
output tableEndpoint string = storage.properties.primaryEndpoints.table
O Bicep anterior é um módulo que provisiona uma conta de Armazenamento Azure com os seguintes padrões:
-
kind
: o tipo de conta de armazenamento. O padrão éStorageV2
. -
sku
: a SKU da conta de armazenamento. O padrão éStandard_GRS
. -
properties
: as propriedades da conta de armazenamento:-
accessTier
: a camada de acesso da conta de armazenamento. O padrão éHot
. -
allowSharedKeyAccess
: um valor booliano que indica se a conta de armazenamento permite que as solicitações sejam autorizadas com a chave de acesso da conta. O padrão éfalse
. -
minimumTlsVersion
: a versão mínima do TLS com suporte para a conta de armazenamento. O padrão éTLS1_2
. -
networkAcls
: as ACLs de rede para a conta de armazenamento. O padrão é{ defaultAction: 'Allow' }
.
-
Além da conta de armazenamento, ela também provisiona um contêiner de blobs.
As atribuições de função a seguir são adicionadas à conta de armazenamento para dar acesso à sua aplicação. Consulte as funções de controle de acesso baseado em função internas () (Azure) (Azure RBAC) () para obter mais informações:
Função/ID | Descrição |
---|---|
Colaborador de Dados do Blob de Armazenamentoba92f5b4-2d11-453d-a403-e96b0029c9fe |
Ler, gravar e excluir contêineres e blobs de armazenamento Azure. |
Colaborador de dados de tabela de armazenamento0a9a7e1f-b9d0-4cc4-a60d-0319b160aaa3 |
Ler, gravar e excluir tabelas e entidades de armazenamento Azure. |
Colaborador de dados da fila de armazenamento974c5e8b-45b9-4653-ba55-5f855dd0fb88 |
Ler, gravar e excluir as filas de armazenamento Azure e as mensagens das filas. |
O Bicep gerado é um ponto de partida e pode ser personalizado para atender aos seus requisitos específicos.
Personalizar a infraestrutura de provisionamento
Todos os recursos .NET AspireAzure são subclasses do tipo AzureProvisioningResource. Esse tipo permite a customização do Bicep que foi gerado, ao fornecer uma API fluente que configura os recursos de Azure com o uso da API ConfigureInfrastructure<T>(IResourceBuilder<T>, Action<AzureResourceInfrastructure>). Por exemplo, você pode configurar o kind
, sku
, properties
e muito mais. O exemplo a seguir demonstra como personalizar o recurso de Armazenamento Azure:
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");
});
O código anterior:
- Encadeia uma chamada à API ConfigureInfrastructure.
- O parâmetro
infra
é uma instância do tipo AzureResourceInfrastructure. - Os recursos provisionáveis são recuperados chamando o método GetProvisionableResources().
- O elemento único StorageAccount é recuperado.
- O StorageAccount.AccessTier é atribuído a StorageAccountAccessTier.Cool.
- O StorageAccount.Sku é atribuído a um novo StorageSku com um
Name
de PremiumZrs. - Uma etiqueta é adicionada à conta de armazenamento com uma chave de
ExampleKey
e um valor deExample value
.
- O parâmetro
Há muitas outras opções de configuração disponíveis para personalizar o recurso de Armazenamento Azure. Para obter mais informações, consulte Azure.Provisioning.Storage.
Conectar-se a uma conta de Armazenamento Azure existente
Você pode ter uma conta de Armazenamento Azure existente à qual deseja se conectar. Em vez de representar um novo recurso de armazenamento Azure, você pode adicionar uma cadeia de conexão ao host do aplicativo. Para adicionar uma conexão a uma conta de Armazenamento Azure existente, chame o método 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...
Nota
As cadeias de conexão são usadas para representar uma ampla gama de informações de conexão, incluindo conexões de banco de dados, agentes de mensagens, URIs de ponto de extremidade e outros serviços. Em .NET.NET Aspire nomenclatura, o termo "cadeia de conexão" é usado para representar qualquer tipo de informação de conexão.
A cadeia de conexão é configurada na configuração do host do aplicativo, normalmente em Segredos do Usuário, na seção ConnectionStrings
. O host do aplicativo injeta essa cadeia de conexão como uma variável de ambiente em todos os recursos dependentes, por exemplo:
{
"ConnectionStrings": {
"blobs": "https://{account_name}.blob.core.windows.net/"
}
}
O recurso dependente pode acessar a cadeia de conexão injetada chamando o método GetConnectionString e passando o nome da conexão como o parâmetro, nesse caso "blobs"
. A API GetConnectionString
é uma abreviação para IConfiguration.GetSection("ConnectionStrings")[name]
.
Adicionar recurso de emulação de armazenamento Azure
Para adicionar um recurso do emulador de armazenamento Azure, encadear uma chamada em um IResourceBuilder<AzureStorageResource>
à API RunAsEmulator:
var builder = DistributedApplication.CreateBuilder(args);
var storage = builder.AddAzureStorage("storage")
.RunAsEmulator();
// After adding all resources, run the app...
Quando você chama RunAsEmulator
, ele configura seus recursos de armazenamento para serem executados localmente usando um emulador. O emulador nesse caso é do Azurite. O emulador de software livre do Azurite fornece um ambiente local gratuito para testar seus aplicativos Azure Blob, Armazenamento de Filas e Armazenamento de Tabelas e é um complemento perfeito para o .NET AspireAzure integração de hospedagem. O Azurite não está instalado; ao contrário, é acessível a .NET.NET Aspire como um contêiner. Quando você adiciona um contêiner ao host do aplicativo, conforme mostrado no exemplo anterior com a imagem mcr.microsoft.com/azure-storage/azurite
, ele cria e inicia o contêiner quando o host do aplicativo é iniciado. Para obter mais informações, consulte ciclo de vida do recurso de contêiner.
Configurar o contêiner do Azurite
Há várias configurações disponíveis para recursos de contêiner, por exemplo, você pode configurar as portas do contêiner, variáveis de ambiente, é tempo de vidae muito mais.
Configurar portas de contêiner do Azurite
Por padrão, o contêiner do Azurite quando configurado por .NET.NET Aspire, expõe os seguintes pontos de extremidade:
Ponto de Extremidade | Porta de contêiner | Porta do host |
---|---|---|
blob |
10.000 | dinâmico |
queue |
10001 | dinâmico |
table |
10002 | dinâmico |
A porta em que eles estão escutando é dinâmica por padrão. Quando o contêiner é iniciado, as portas são mapeadas para uma porta aleatória no computador host. Para configurar as portas de ponto de extremidade, encadeia chamadas no construtor de recursos de contêiner fornecido pelo método RunAsEmulator
, conforme mostrado no exemplo a seguir:
var builder = DistributedApplication.CreateBuilder(args);
var storage = builder.AddAzureStorage("storage").RunAsEmulator(
azurite =>
{
azurite.WithBlobPort("blob", 27000)
.WithQueuePort("queue", 27001)
.WithTablePort("table", 27002);
});
// After adding all resources, run the app...
O código anterior configura os endpoints existentes do contêiner Azurite (blob
, queue
e table
) para escutarem nas portas 27000
, 27001
e 27002
, respectivamente. As portas do contêiner Azurite são mapeadas para as portas do host, conforme mostrado na tabela a seguir.
Nome do ponto de extremidade | Mapeamento de porta (container:host ) |
---|---|
blob |
10000:27000 |
queue |
10001:27001 |
table |
10002:27002 |
Configurar o contêiner do Azurite com vida útil persistente
Para configurar o contêiner do Azurite com um tempo de vida persistente, chame o método WithLifetime no recurso de contêiner do Azurite e passe 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...
Para obter mais informações, consulte tempo de vida do recurso do contêiner.
Configurar contêiner do Azurite com volume de dados
Para adicionar um volume de dados ao recurso do emulador de Armazenamento Azure, chame o método WithDataVolume no recurso do emulador de Armazenamento Azure:
var builder = DistributedApplication.CreateBuilder(args);
var storage = builder.AddAzureStorage("storage").RunAsEmulator(
azurite =>
{
azurite.WithDataVolume();
});
// After adding all resources, run the app...
O volume de dados é usado para manter os dados do Azurite fora do ciclo de vida de seu contêiner. O volume de dados é montado no caminho /data
no contêiner do Azurite e, quando um parâmetro name
não é fornecido, o nome é formatado como .azurite/{resource name}
. Para obter mais informações sobre volumes de dados e detalhes sobre por que eles são preferenciais em vez de associar montagens, consulte Docker documentos: Volumes.
Configurar o contêiner do Azurite com montagem de vinculação de dados
Para adicionar uma montagem de associação de dados ao recurso do emulador de Armazenamento do Azure, chame o método WithDataBindMount:
var builder = DistributedApplication.CreateBuilder(args);
var storage = builder.AddAzureStorage("storage").RunAsEmulator(
azurite =>
{
azurite.WithDataBindMount("../Azurite/Data");
});
// After adding all resources, run the app...
Importante
Os de dados associam montagens têm funcionalidade limitada em comparação com volumes, que oferecem melhor desempenho, portabilidade e segurança, tornando-os mais adequados para ambientes de produção. No entanto, as montagens bind permitem acesso direto e modificação de arquivos no sistema host, ideal para desenvolvimento e teste onde as alterações no tempo real são necessárias.
As montagens de associação de dados dependem do sistema de arquivos do computador host para persistir os dados do Azurite nas reinicializações de contêiner. O ponto de montagem do vínculo de dados é feito no caminho ../Azurite/Data
no computador host, em relação ao diretório do host do aplicativo (IDistributedApplicationBuilder.AppHostDirectory) no contêiner do Azurite. Para obter mais informações sobre montagens de ligação de dados, consulte Docker documentação: Montagens de ligação.
Conectar-se aos recursos de armazenamento
Quando o host do aplicativo
Nota
O Gerenciador de Armazenamento do Azure descobre os recursos de armazenamento do Azurite supondo que as portas padrão sejam usadas. Se você configurou o contêiner do Azurite para usar portas diferentes, precisará configurar o Gerenciador de Armazenamento Azure para se conectar às portas corretas.
Para se conectar ao recurso de armazenamento do Gerenciador de Armazenamento Azure, siga estas etapas:
Execute o host do aplicativo .NET.NET Aspire.
Abra o Gerenciador de Armazenamento Azure.
Visualize o painel Explorer.
Selecione o link Atualizar tudo para refrescar a lista de contas de armazenamento.
Expanda o nó Anexado & do Emulador.
Expanda o nó Contas de Armazenamento.
Você deve ver uma conta de armazenamento com o nome do recurso como um prefixo:
Você é livre para explorar a conta de armazenamento e seu conteúdo usando o Gerenciador de Armazenamento Azure. Para obter mais informações sobre como usar o Gerenciador de Armazenamento Azure, consulte Introdução ao Gerenciador de Armazenamento.
Adicionar Azure Table Storage recurso
No projeto de host do aplicativo, registre a integração Azure Table Storage encadeando uma chamada para AddTables na instância de IResourceBuilder<IAzureStorageResource>
retornada por AddAzureStorage. O exemplo a seguir demonstra como adicionar um recurso de Azure Table Storage chamado storage
e um recurso de tabela chamado 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...
O código anterior:
- Adiciona um recurso de Armazenamento Azure chamado
storage
. - Adiciona um recurso de armazenamento de tabela chamado
tables
ao recurso de armazenamento. - Adiciona o recurso
storage
aoExampleProject
e aguarda que ele esteja pronto antes de iniciar o projeto.
Verificações de integridade de integração de hospedagem
A integração de hospedagem do armazenamento Azure adiciona automaticamente uma verificação de saúde para o recurso de armazenamento. Ele é adicionado somente ao ser executado como um emulador e verifica se o contêiner do Azurite está em execução e se uma conexão pode ser estabelecida com ele. A integração de hospedagem depende do pacote NuGet 📦 AspNetCore.HealthChecks.Azure.Storage.Blobs.
Integração com o Client
Para começar a usar a integração das Tabelas de Dados .NET AspireAzureclient, instale o pacote NuGet 📦Aspire.Azure.Data.Tables no projeto que consome client, ou seja, o projeto do aplicativo que usa as Tabelas de Dados Azureclient. A integração do Azure Data Tables client registra uma instância de TableServiceClient que você pode usar para interagir com Azure Table Storage.
dotnet add package Aspire.Azure.Data.Tables
Adicionar Azure Table Storageclient
No arquivo Program.cs do seu projeto que utiliza client, chame o método de extensão AddAzureTableClient em qualquer IHostApplicationBuilder para registrar um TableServiceClient
para uso através do contêiner de injeção de dependências. O método usa um parâmetro de nome de conexão.
builder.AddAzureTableClient("tables");
Em seguida, você pode recuperar a instância de TableServiceClient
usando a injeção de dependência. Por exemplo, para recuperar o client de um serviço:
public class ExampleService(TableServiceClient client)
{
// Use client...
}
Configuração
A integração .NET AspireAzure Table Storage fornece várias opções para configurar o TableServiceClient
com base nos requisitos e convenções do seu projeto.
Usar provedores de configuração
A integração .NET AspireAzure Table Storage dá suporte a Microsoft.Extensions.Configuration. Ele carrega o AzureDataTablesSettings e o TableClientOptions da configuração usando a chave Aspire:Azure:Data:Tables
. O snippet a seguir é um exemplo de um arquivo de appsettings.json que configura algumas das opções:
{
"Aspire": {
"Azure": {
"Data": {
"Tables": {
"ServiceUri": "YOUR_URI",
"DisableHealthChecks": true,
"DisableTracing": false,
"ClientOptions": {
"EnableTenantDiscovery": true
}
}
}
}
}
}
Para obter o esquema Azure de integração client de tabelas de dados JSON completa, consulte Aspire.Azure. Data.Tables/ConfigurationSchema.json.
Usar delegados embutidos
Você também pode passar a delegação Action<AzureDataTablesSettings> configureSettings
para configurar algumas ou todas as opções diretamente, por exemplo, para configurar o ServiceUri
:
builder.AddAzureTableClient(
"tables",
settings => settings.DisableHealthChecks = true);
Você também pode configurar o TableClientOptions usando o delegado Action<IAzureClientBuilder<TableServiceClient, TableClientOptions>> configureClientBuilder
, o segundo parâmetro do método AddAzureTableClient
. Por exemplo, para definir a ID do TableServiceClient
para identificar o client:
builder.AddAzureTableClient(
"tables",
configureClientBuilder: clientBuilder =>
clientBuilder.ConfigureOptions(
options => options.EnableTenantDiscovery = true));
Client verificações de integração de integridade
Por padrão, as integrações .NET.NET Aspire habilitam verificações de integridade para todos os serviços. Para obter mais informações, consulte .NET.NET Aspire visão geral de integrações.
A integração de tabelas de dados .NET AspireAzure:
- Adiciona a verificação de integridade quando AzureDataTablesSettings.DisableHealthChecks é
false
, que tenta se conectar ao Azure Table Storage. - Integra-se ao endpoint HTTP
/health
, que especifica que todas as verificações de integridade registradas devem ser concluídas para que o aplicativo seja considerado pronto para aceitar o tráfego.
Observabilidade e telemetria
.NET .NET Aspire integrações configuram automaticamente configurações de Log, Rastreamento e Métricas, que às vezes são conhecidas como os pilares da observabilidade. Para obter mais informações sobre a observabilidade e a telemetria de integração, consulte .NET.NET Aspire visão geral das integrações. Dependendo do serviço de backup, algumas integrações só podem dar suporte a alguns desses recursos. Por exemplo, algumas integrações dão suporte a registro em log e rastreamento, mas não a métricas. Os recursos de telemetria também podem ser desabilitados usando as técnicas apresentadas na seção Configuration.
Registro de Atividades
A integração das tabelas de dados .NET AspireAzure utiliza as seguintes categorias de log:
Azure.Core
Azure.Identity
Rastreamento
A integração .NET AspireAzure Data Tables emite as seguintes atividades de rastreamento utilizando OpenTelemetry:
Azure.Data.Tables.TableServiceClient
Métricas
A integração .NET AspireAzure Tabelas de Dados atualmente não dá suporte a métricas por padrão devido a limitações com o SDK Azure.
Consulte também
- documentos Azure Table Storage
- integrações .NET.NET Aspire
- .NET Aspire GitHub repositório