Padrão de Armazenamento de Configuração Externo

Mude a informação de configuração do pacote de implementação da aplicação para um local centralizado. Esta abordagem facilita a gestão e controlo dos dados de configuração, bem como a partilha de dados de configuração entre aplicações e instâncias de aplicação.

Contexto e problema

A maioria dos ambientes de execução de aplicações inclui informação de configuração em ficheiros que implementa com a aplicação. Em alguns casos, pode editar estes ficheiros para alterar o comportamento da aplicação depois de a implementar. No entanto, alterações de configuração exigem que reimplantes a aplicação. A redistribuição resulta frequentemente em tempos de inatividade inaceitáveis e outros custos administrativos.

Os ficheiros de configuração locais também limitam a configuração a uma única aplicação. Em alguns cenários, pode querer partilhar definições de configuração entre várias aplicações. Exemplos incluem cadeias de ligação à base de dados, informações sobre temas de interface e URLs de filas e armazenamento que um conjunto relacionado de aplicações utiliza.

Gerir alterações nas configurações locais em múltiplas instâncias em execução da aplicação é desafiante. Este desafio pode resultar em instâncias que utilizam definições de configuração diferentes durante a implementação da atualização.

As atualizações de aplicações e componentes podem também exigir alterações nos esquemas de configuração. Muitos sistemas de configuração não suportam diferentes versões da informação de configuração.

Solução

Armazene a informação de configuração em armazenamento externo e forneça uma interface que possa usar para ler e atualizar rapidamente e eficientemente as definições de configuração. O tipo de armazenamento externo depende do alojamento e do ambiente de execução da aplicação. Num cenário alojado na nuvem, o armazenamento externo é tipicamente um serviço de armazenamento baseado na nuvem ou um serviço dedicado de configuração. Pode também ser uma base de dados alojada ou outro sistema personalizado.

A loja de backup que escolher para a informação de configuração deve ter uma interface que forneça acesso consistente e fácil de usar. Deve expor a informação num formato corretamente digitado e estruturado. A implementação pode também precisar de autorizar o acesso dos utilizadores para proteger os dados de configuração. Pode ser necessário ser suficientemente flexível para armazenar múltiplas versões da configuração, como desenvolvimento, pré-produção e produção, incluindo múltiplas versões de lançamento de cada configuração.

Muitos sistemas de configuração incorporados leem os dados quando a aplicação inicia e depois armazenam os dados em cache na memória para proporcionar acesso rápido e minimizar o impacto no desempenho da aplicação. Dependendo do tipo de armazenamento de suporte que utiliza e da latência desse armazenamento, pode querer implementar um mecanismo de cache dentro do armazenamento de configuração externo. Para mais informações, consulte Orientação de cache. O diagrama seguinte mostra uma visão geral do padrão External Configuration Store com uma cache local opcional.

Um diagrama que mostra uma visão geral do padrão External Configuration Store com uma cache local opcional.

Problemas e considerações

Considere os seguintes pontos ao decidir como implementar este padrão:

  • Escolha uma loja de apoio que ofereça desempenho aceitável, alta disponibilidade e robustez. Certifique-se de poder fazer backup no processo de manutenção e administração da sua aplicação. Numa aplicação alojada na cloud, utilize um mecanismo de armazenamento na nuvem ou um serviço dedicado de plataforma de configuração para satisfazer estes requisitos.

  • Projete o esquema do armazenamento de suporte para permitir flexibilidade nos tipos de informação que pode conter. Certifique-se de que fornece capacidades para todos os requisitos de configuração, como dados digitados, coleções de definições, múltiplas versões de definições e quaisquer outras funcionalidades que as aplicações necessitem. O esquema deve ser fácil de estender para suportar mais definições quando os requisitos mudam.

  • Considere as capacidades físicas do armazenamento de apoio, como se relacionam com a forma como armazena informação de configuração e os efeitos no desempenho. Por exemplo, armazenar um documento XML que contém informação de configuração requer que a interface de configuração ou a aplicação analise o documento para ler definições individuais. A análise complica a forma como atualiza as definições, mas o armazenamento em cache dessas definições pode ajudar a compensar o desempenho de leitura mais lento.

  • Considere como a interface de configuração permite controlar o âmbito e a herança das definições de configuração. Por exemplo, pode ser necessário definir definições de configuração ao nível da organização, aplicação e máquina. A interface de configuração pode precisar de delegar controlo sobre o acesso a diferentes escopos e impedir ou permitir que aplicações individuais sobreponham as definições.

  • Garantir que a interface de configuração consegue expor os dados de configuração nos formatos necessários, como valores tipados, coleções, pares-chave-valor e sacos de propriedades.

  • Considere como se comporta a interface de configuração do armazenamento quando as definições contêm erros ou não existem no armazenamento de apoio. Pode ser necessário restaurar as definições por defeito e registar erros. Considere também a sensibilidade a maiúsculas e minúsculas das chaves ou nomes de configuração, como armazenar e gerir dados binários, e como gerir valores nulos ou vazios.

  • Considere como proteger os dados de configuração e dar acesso apenas aos utilizadores e aplicações adequados. A interface de armazenamento de configuração normalmente fornece esta funcionalidade, mas também é necessário garantir que utilizadores e aplicações não possam aceder diretamente aos dados do armazenamento de apoio sem as permissões apropriadas. Garantir uma separação rigorosa entre as permissões necessárias para ler e escrever dados de configuração. Considera também se precisas de encriptar algumas ou todas as definições de configuração e como implementar essa encriptação na interface de armazenamento de configuração.

    Também deve ativar o registo de auditoria para registar quem lê ou modifica valores de configuração e quando estas ações ocorrem. Aplique os mesmos requisitos de auditoria a quaisquer cópias locais de backup dos dados de configuração.

  • Separa valores de configuração não sensíveis dos segredos. Mantenha as definições de rotina, como sinalizadores de funcionalidades e endpoints, nas definições de configuração. Armazena segredos, como strings de ligação, chaves API, certificados e palavras-passe, num sistema dedicado de gestão de segredos que fornece encriptação e acesso controlado.

  • Configurações armazenadas centralmente, que alteram o comportamento da aplicação durante a execução, são cruciais. Implemente-as, atualize e gere usando os mesmos mecanismos que utiliza para implementar o código da aplicação. Por exemplo, deve realizar alterações que possam afetar mais do que uma aplicação, utilizando uma abordagem de implementação totalmente testada e escalonada para garantir que a alteração se adequa a todas as aplicações que utilizam esta configuração. Se um administrador editar uma definição para atualizar uma aplicação, isso pode afetar negativamente outras aplicações que utilizam a mesma definição. Produtos como o Azure App Configuration ajudam a mitigar este risco através de capacidades integradas, como histórico de revisão, recuperação pontual (PITR), snapshots imutáveis e padrões progressivos de implementação.

  • Se uma aplicação armazenar em cache informação de configuração, precisa de alertar a aplicação quando a configuração muda. Pode implementar uma política de expiração para dados de configuração em cache para que esta informação seja atualizada automaticamente periodicamente. A aplicação vê as alterações e implementa-as.

  • Os dados de configuração em cache podem ajudar a resolver problemas de conectividade transitória que o armazenamento de configuração externo enfrenta em tempo de execução da aplicação, mas esta abordagem normalmente não resolve o problema se o armazenamento externo estiver em baixo quando a aplicação inicia. Garanta que o pipeline de implementação da sua aplicação pode fornecer o último conjunto conhecido de valores de configuração num ficheiro de configuração para usar quando a sua aplicação não conseguir recuperar valores em tempo real no arranque.

Quando utilizar este padrão

Utilize este padrão quando:

  • É necessário partilhar definições de configuração entre várias aplicações ou instâncias ou impor uma configuração padrão entre elas.

  • O seu sistema de configuração padrão não suporta todos os tipos de definições necessárias, como imagens ou estruturas de dados complexas.

  • É necessário um armazenamento complementar para algumas definições, permitindo que as aplicações sobrescritam alguns ou todos os valores armazenados centralmente.

  • É necessário simplificar a administração em várias aplicações e, opcionalmente, monitorizar o uso da configuração registando o acesso ao armazenamento de configuração.

Este padrão pode não ser adequado quando:

  • A sua configuração é simples, local para uma aplicação, e só muda durante ciclos normais de lançamento. Neste caso, um armazenamento de configuração externo pode adicionar complexidade operacional desnecessária.

Design da carga de trabalho

Avalie como usar o padrão External Configuration Store num design de carga de trabalho para abordar os objetivos e princípios abordados nos pilares Azure Well-Architected Framework. A tabela a seguir fornece orientação sobre como esse padrão suporta as metas de cada pilar.

Pilar Como esse padrão suporta os objetivos do pilar
A Excelência Operacional ajuda a fornecer qualidade de carga de trabalho por meio de processos padronizados e coesão da equipe. Essa separação da configuração do aplicativo do código do aplicativo oferece suporte à configuração específica do ambiente e aplica o controle de versão aos valores de configuração. Armazenamentos de configuração externos são também um local comum para gerir sinalizadores de funcionalidades e implementar práticas de implementação seguras.

- OE:10 Projeto de automação
- OE:11 Práticas de implementação seguras

Se este padrão introduzir compensações dentro de um pilar, considere-as em relação aos objetivos dos outros pilares.

Exemplo

Os exemplos seguintes mostram como implementar o padrão de Armazenamento de Configuração Externa no Azure. O primeiro exemplo utiliza a Configuração de Aplicações e bibliotecas de clientes. O segundo exemplo utiliza uma loja de apoio personalizada para cenários que requerem implementação especializada.

App Configuration

A maioria das aplicações pode usar a Configuração de Aplicações em vez de uma loja de configuração personalizada. A Configuração de Aplicações suporta pares chave-valor aos quais pode aplicar namespaces. A Configuração de Aplicações também suporta instantâneos imutáveis da configuração, permitindo que inspecione, reverta ou implemente progressivamente alterações de configuração sem risco para as instâncias em execução.

Use referências snapshot para permitir que as aplicações alternem entre snapshots em tempo de execução sem alterações de código ou reimplementação. Pode exportar valores de configuração para que uma cópia seja enviada com a sua aplicação como backup para usar caso o serviço esteja inacessível quando a aplicação inicia.

Na App Configuration, as chaves e valores são strings Unicode, e cada par chave-valor tem metadados opcionais, como variantes baseadas em rótulos e tipo de conteúdo. Use o tipo de conteúdo para descrever como a sua aplicação deve interpretar um valor, como em JSON ou num tipo de Configuração de Aplicação incorporado. A Configuração de Aplicações também mantém um histórico de revisões com o PITR, o que ajuda a rever e recuperar pares chave-valor anteriores.

Para resiliência, coloque a sua loja numa região que suporte zonas de disponibilidade e ative a geo-replicação para configurar as suas aplicações para lerem da réplica mais próxima e alternar entre endpoints de réplica durante falhas regionais. Use referências do Azure Key Vault para guardar segredos no Key Vault e referenciá-los a partir da App Configuration, em vez de armazenar as credenciais diretamente na loja de configuração. Use managed identity e o controlo de acesso baseado em funções do Azure (Azure RBAC) em vez de strings de ligação para autenticar aplicações no App Configuration.

Para cargas de trabalho que correm em Azure Kubernetes Service (AKS), o App Configuration Kubernetes Provider pode gerar ConfigMaps e Secrets diretamente a partir da sua loja sem exigir alterações de código nos seus contentores de workload. Também pode usar a Configuração de Aplicações para gerir sinalizadores de funcionalidades, incluindo distribuição direcionada e experimentação baseada em variantes, nas suas práticas de implementação segura.

Para isolamento da rede, use endpoints privados para App Configuration para que o tráfego do cliente permaneça em endereços IP privados utilizando o Azure Private Link. Depois de configurar o acesso privado, pode desligar o acesso público para reduzir a exposição a endpoints públicos. Em implementações geo-replicadas, um único endpoint privado pode alcançar todas as réplicas, mas para maior resiliência regional, pode provisionar endpoints privados para cada região de réplica e configurar o Sistema de Nomes de Domínio (DNS) em conformidade.

Um diagrama que mostra um exemplo de implementação de padrão de Armazenamento de Configuração Externo com a App Configuration como hub central que liga múltiplos serviços Azure e sistemas de armazenamento.

Bibliotecas de cliente

As bibliotecas clientes fornecem muitas das funcionalidades anteriores. As bibliotecas cliente integram-se com o tempo de execução da aplicação para ajudar a obter e armazenar em cache valores, atualizar valores quando mudam, e gerir interrupções transitórias na Configuração da Aplicação.

Runtime Biblioteca de cliente Notes Início Rápido
.NET Microsoft.Extensions.Configuration.AzureAppConfiguration Prestador para Microsoft.Extensions.Configuration Início Rápido para .NET
ASP.NET Core Microsoft.Azure.AppConfiguration.AspNetCore Adiciona middleware de atualização orientado a pedidos para ASP.NET Core Quickstart para ASP.NET Core
Funções do Azure em .NET Microsoft.Azure.AppConfiguration.Functions.Worker Fornecedor para o modelo de trabalhador isolado que utiliza Program.cs Início Rápido para Funções do Azure
.NET Framework Microsoft.Configuration.ConfigurationBuilders.AzureAppConfiguration Construtor de configuração para System.Configuration Início Rápido para .NET Framework
Spring Java com.azure.spring > azure-spring-cloud-appconfiguration-config Suporta o acesso ao Spring Framework através de ConfigurationProperties Quickstart para Java Spring
Python azure-appconfiguration-provider Biblioteca de fornecedores que fornece atualização dinâmica e suporte de referência ao Key Vault Início Rápido para Python
JavaScript e Node.js @azure/app-configuration-provider Biblioteca de fornecedores que fornece atualização dinâmica e suporte de referência ao Key Vault Início Rápido para JavaScript

As seguintes ações de sincronização de Configuração de Aplicação no GitHub e tarefas integradas do Azure Pipelines também estão disponíveis:

Exemplo de armazenamento de suporte personalizado

Numa aplicação que o Azure hospeda, pode usar o Armazenamento do Azure para armazenar informação de configuração externamente. Esta abordagem proporciona resiliência e alto desempenho. Por defeito, o Armazenamento replica os dados três vezes dentro de um único centro de dados. Para geo-redundância entre regiões, pode configurar a geo-replicação com capacidades de failover manual. O Armazenamento de Tabelas do Azure fornece um armazenamento chave-valor que pode utilizar um esquema flexível para os valores. O Armazenamento de Blobs do Azure fornece um armazenamento hierárquico, baseado em contentores, que pode armazenar qualquer tipo de dados em blobs individualmente nomeados.

Quando implementas este padrão, precisas de abstrair o Armazenamento de Blobs e expor as tuas definições dentro das tuas aplicações. Também precisa de verificar atualizações durante a execução e decidir como responder a essas atualizações.

O exemplo seguinte mostra como pode usar um simples armazenamento de configuração e Armazenamento de Blobs para armazenar e expor informação de configuração. A classe BlobSettingsStore abstrai o Armazenamento de Blobs para armazenar informação de configuração. Implementa uma interface simples ISettingsStore .

public interface ISettingsStore
{
    Task<ETag> GetVersionAsync();
    Task<Dictionary<string, string>> FindAllAsync();
}

Esta interface define métodos para recuperar as definições de configuração que o armazenamento de configuração contém e inclui um número de versão que pode usar para detetar modificações recentes nas configurações de configuração. Uma BlobSettingsStore classe pode usar a ETag propriedade do blob para implementar versionamento. A ETag propriedade atualiza-se automaticamente cada vez que um blob é escrito.

Note

Por design, esta ilustração simples expõe todas as definições de configuração como valores de cadeia em vez de valores tipados.

Uma ExternalConfigurationManager classe fornece um wrapper em torno de uma BlobSettingsStore instância. Uma aplicação pode usar esta classe para recuperar informação de configuração. Esta classe pode usar um mecanismo de notificação de alterações, como Microsoft Reactive Extensions, para publicar atualizações de configuração enquanto o sistema está em execução. Implementa também o padrão Cache-Aside para configurações, proporcionando melhor resiliência e desempenho.

O exemplo seguinte mostra como podes implementar uma ExternalConfigurationManager classe.

static void Main(string[] args)
{
    // Start monitoring configuration changes.
    ExternalConfiguration.Instance.StartMonitor();

    // Get a setting.
    var setting = ExternalConfiguration.Instance.GetAppSetting("someSettingKey");
    …
}

Passos seguintes