Modello di archivio di configurazione esterno

Spostare le informazioni di configurazione dal pacchetto di distribuzione dell'applicazione in una posizione centralizzata. Questo approccio consente di gestire e controllare più facilmente i dati di configurazione e di condividere i dati di configurazione tra applicazioni e istanze dell'applicazione.

Contesto e problema

La maggior parte degli ambienti di runtime dell'applicazione include informazioni di configurazione nei file distribuiti con l'applicazione. In alcuni casi, è possibile modificare questi file per modificare il comportamento dell'applicazione dopo la distribuzione dell'applicazione. Tuttavia, le modifiche alla configurazione richiedono di ridistribuire l'applicazione. La ridistribuzione comporta spesso tempi di inattività inaccettabili e altri costi amministrativi.

I file di configurazione locali limitano anche la configurazione a una singola applicazione. In alcuni scenari potrebbe essere necessario condividere le impostazioni di configurazione tra più applicazioni. Ad esempio, le stringhe di connessione al database, le informazioni sul tema grafico dell'interfaccia e gli URL delle code e dell'archiviazione utilizzati da un set di applicazioni correlate.

La gestione delle modifiche alle configurazioni locali in più istanze in esecuzione dell'applicazione è complessa. Questa sfida può comportare istanze che usano impostazioni di configurazione diverse durante la distribuzione dell'aggiornamento.

Gli aggiornamenti alle applicazioni e ai componenti potrebbero anche richiedere modifiche agli schemi di configurazione. Molti sistemi di configurazione non supportano versioni diverse delle informazioni di configurazione.

Soluzione

Archiviare le informazioni di configurazione nell'archiviazione esterna e fornire un'interfaccia che è possibile usare per leggere ed aggiornare in modo rapido ed efficiente le impostazioni di configurazione. Il tipo di archivio esterno dipende dall'ambiente di hosting e di runtime dell'applicazione. In uno scenario ospitato nel cloud, l'archiviazione esterna è in genere un servizio di archiviazione basato sul cloud o un servizio di configurazione dedicato. Potrebbe anche trattarsi di un database ospitato o di un altro sistema personalizzato.

L'archivio di backup scelto per le informazioni di configurazione deve avere un'interfaccia che fornisce accesso coerente e facile da usare. Deve esporre le informazioni in un formato tipizzato e strutturato correttamente. L'implementazione potrebbe anche dover autorizzare l'accesso degli utenti per proteggere i dati di configurazione. Potrebbe essere necessario essere sufficientemente flessibile per archiviare più versioni della configurazione, ad esempio sviluppo, gestione temporanea e produzione, incluse più versioni di rilascio di ogni configurazione.

Molti sistemi di configurazione predefiniti leggono i dati all'avvio dell'applicazione e quindi memorizzano nella cache i dati in memoria per fornire accesso rapido e ridurre al minimo l'impatto sulle prestazioni dell'applicazione. A seconda del tipo di archivio di backup usato e della latenza di questo archivio, potrebbe essere necessario implementare un meccanismo di memorizzazione nella cache all'interno dell'archivio di configurazione esterno. Per altre informazioni, vedere Indicazioni sulla memorizzazione nella cache. Il diagramma seguente mostra una panoramica del modello di archivio di configurazione esterna con una cache locale facoltativa.

Diagramma che mostra una panoramica del modello archivio di configurazione esterna con una cache locale facoltativa.

Problemi e considerazioni

Quando si decide come implementare questo modello, tenere presente quanto segue:

  • Scegliere un archivio di backup che offre prestazioni accettabili, disponibilità elevata e affidabilità. Assicurarsi di poter eseguire il backup nel processo di manutenzione e amministrazione dell'applicazione. In un'applicazione ospitata nel cloud usare un meccanismo di archiviazione cloud o un servizio di piattaforma di configurazione dedicato per soddisfare questi requisiti.

  • Progettare lo schema dell'archivio di backup per consentire flessibilità nei tipi di informazioni che possono contenere. Assicurarsi che fornisca funzionalità per tutti i requisiti di configurazione, ad esempio dati tipiti, raccolte di impostazioni, più versioni di impostazioni e qualsiasi altra funzionalità richiesta dalle applicazioni. Lo schema deve essere semplice da estendere per supportare più impostazioni quando cambiano i requisiti.

  • Prendere in considerazione le funzionalità fisiche dell'archivio di backup, il modo in cui vengono archiviate le informazioni di configurazione e gli effetti sulle prestazioni. Ad esempio, l'archiviazione di un documento XML contenente informazioni di configurazione richiede l'interfaccia di configurazione o l'applicazione per analizzare il documento per leggere le singole impostazioni. L'analisi complica la modalità di aggiornamento delle impostazioni, ma la memorizzazione nella cache delle impostazioni consente di compensare le prestazioni di lettura più lente.

  • Si consideri come l'interfaccia di configurazione consenta il controllo dell'ambito e dell'ereditarietà delle impostazioni di configurazione. Ad esempio, potrebbe essere necessario definire l'ambito delle impostazioni di configurazione a livello di organizzazione, applicazione e computer. L'interfaccia di configurazione potrebbe dover delegare il controllo sull'accesso a ambiti diversi e impedire o consentire alle singole applicazioni di eseguire l'override delle impostazioni.

  • Assicurarsi che l'interfaccia di configurazione possa esporre i dati di configurazione nei formati necessari, ad esempio valori tipizzati, raccolte, coppie chiave-valore e contenitori di proprietà.

  • Si consideri il comportamento dell'interfaccia dell'archivio di configurazione quando le impostazioni contengono errori o non esistono nell'archivio di backup. Potrebbe essere necessario ripristinare le impostazioni predefinite e registrare gli errori. Considerare anche la distinzione tra maiuscole e minuscole delle chiavi o dei nomi di configurazione, come archiviare e gestire i dati binari e come gestire valori Null o vuoti.

  • Si consideri come proteggere i dati di configurazione e concedere l'accesso solo agli utenti e alle applicazioni appropriati. L'interfaccia dell'archivio di configurazione offre in genere questa funzionalità, ma è anche necessario assicurarsi che gli utenti e le applicazioni non possano accedere direttamente ai dati nell'archivio di backup senza le autorizzazioni appropriate. Assicurarsi una separazione rigorosa tra le autorizzazioni necessarie per leggere e scrivere i dati di configurazione. Valutare anche se è necessario crittografare alcune o tutte le impostazioni di configurazione e come implementare questa crittografia nell'interfaccia dell'archivio di configurazione.

    È anche necessario attivare la registrazione di controllo per registrare chi legge o modifica i valori di configurazione e quando si verificano queste azioni. Applicare gli stessi requisiti di controllo a qualsiasi copia di fallback locale dei dati di configurazione.

  • Separare i valori di configurazione non sensibili dai segreti. Mantenere le impostazioni ricorrenti, come i flag di funzionalità e gli endpoint, all'interno delle impostazioni di configurazione. Archiviare segreti, ad esempio stringhe di connessione, chiavi API, certificati e password, in un sistema di gestione dei segreti dedicato che fornisce la crittografia e l'accesso controllato.

  • Le configurazioni archiviate centralmente, che modificano il comportamento dell'applicazione durante il runtime, sono fondamentali. Distribuire, aggiornare e gestirli usando gli stessi meccanismi usati per distribuire il codice dell'applicazione. Ad esempio, è necessario eseguire modifiche che possono influire su più di un'applicazione usando un approccio di distribuzione completamente testato e a fasi per garantire che la modifica si adatti a tutte le applicazioni che usano questa configurazione. Se un amministratore modifica un'impostazione per aggiornare un'applicazione, potrebbe influire negativamente su altre applicazioni che usano la stessa impostazione. Prodotti come Configurazione app di Azure consentono di ridurre questo rischio tramite funzionalità predefinite, ad esempio cronologia delle revisioni, ripristino temporizzato (PITR), snapshot non modificabili e modelli di implementazione progressiva.

  • Se un'applicazione memorizza nella cache le informazioni di configurazione, è necessario avvisare l'applicazione quando cambia la configurazione. È possibile implementare criteri di scadenza per i dati di configurazione memorizzati nella cache in modo che queste informazioni vengano aggiornate periodicamente. L'applicazione vede le modifiche e le implementa.

  • I dati di configurazione memorizzati nella cache consentono di risolvere i problemi di connettività temporanei riscontrati dall'archivio di configurazione esterno in fase di esecuzione dell'applicazione, ma questo approccio in genere non risolve il problema se l'archivio esterno è inattivo all'avvio dell'applicazione. Assicurarsi che la pipeline di distribuzione dell'applicazione possa fornire l'ultimo set noto di valori di configurazione in un file di configurazione da usare quando l'applicazione non riesce a recuperare i valori in tempo reale all'avvio.

Quando usare questo modello

Usare questo modello quando:

  • È necessario condividere le impostazioni di configurazione tra più applicazioni o istanze o applicare una configurazione standard tra di esse.

  • Il sistema di configurazione standard non supporta tutti i tipi di impostazione necessari, ad esempio immagini o strutture di dati complesse.

  • È necessario un archivio complementare per alcune impostazioni, consentendo alle applicazioni di eseguire l'override di alcuni o tutti i valori archiviati centralmente.

  • È necessario semplificare l'amministrazione in più applicazioni e, facoltativamente, monitorare l'utilizzo della configurazione registrando l'accesso all'archivio di configurazione.

Questo modello potrebbe non essere adatto quando:

  • La configurazione è semplice, locale in un'applicazione e cambia solo durante i normali cicli di rilascio. In questo caso, un archivio di configurazione esterno può aggiungere complessità operativa non necessarie.

Progettazione del carico di lavoro

Valutare come usare il modello di archivio di configurazione esterna in una progettazione del carico di lavoro per raggiungere gli obiettivi e i principi trattati nei pilastri di Azure Well-Architected Framework. La tabella seguente fornisce indicazioni su come questo modello supporta gli obiettivi di ogni pilastro.

Pilastro Come questo modello supporta gli obiettivi di pilastro
L'eccellenza operativa consente di offrire la qualità del carico di lavoro attraverso processi standardizzati e coesione del team. Questa separazione della configurazione dell'applicazione dal codice dell'applicazione supporta la configurazione specifica dell'ambiente e applica il controllo delle versioni ai valori di configurazione. Gli archivi di configurazione esterni sono anche un luogo comune per gestire i flag di funzionalità per implementare procedure di distribuzione sicure.

- Progettazione di Automazione di OE:10
- OE:11 Procedure di distribuzione sicura

Se questo modello introduce compromessi all'interno di un pilastro, considerarli contro gli obiettivi degli altri pilastri.

Example

Gli esempi seguenti illustrano come implementare il modello archivio di configurazione esterna in Azure. Il primo esempio usa Configurazione app e librerie client. Il secondo esempio usa un archivio di backup personalizzato per scenari che richiedono un'implementazione specializzata.

App Configuration

La maggior parte delle applicazioni può usare App Configuration invece di un archivio di configurazione personalizzato. Configurazione delle app supporta coppie chiave-valore a cui è possibile applicare spazi dei nomi. La configurazione app supporta anche snapshot non modificabili della configurazione in modo da poter esaminare, eseguire il ripristino o distribuire progressivamente le modifiche di configurazione senza rischiare le istanze in esecuzione.

Usare i riferimenti snapshot per consentire alle applicazioni di passare da uno snapshot all'altro in fase di esecuzione senza modifiche al codice o ridistribuzione. È possibile esportare i valori di configurazione in modo che una copia venga fornita con l'applicazione come backup da usare se il servizio non è raggiungibile all'avvio dell'applicazione.

In Configurazione app le chiavi e i valori sono stringhe Unicode e ogni coppia chiave-valore ha metadati facoltativi, ad esempio varianti basate su etichetta e tipo di contenuto. Usare il tipo di contenuto per descrivere come l'applicazione deve interpretare un valore, ad esempio in JSON o in un tipo di configurazione app predefinito. La configurazione dell'app mantiene anche una cronologia delle revisioni con PITR, che consente di esaminare e recuperare le coppie chiave-valore precedenti.

Per la resilienza, effettuare il provisioning dell'archivio in un'area che supporta le zone di disponibilità e attivare la replica geografica in modo che sia possibile configurare le applicazioni per la lettura dalla replica più vicina e passare tra gli endpoint di replica durante interruzioni a livello di area. Usare riferimenti di Azure Key Vault per conservare i segreti in Key Vault e farvi riferimento da App Configuration, anziché archiviare le credenziali direttamente nell'archivio di configurazione. Usare le identità gestite e Azure controllo degli accessi in base al ruolo (Azure RBAC) anziché le stringhe di connessione per autenticare le applicazioni alla Configurazione app.

Per i carichi di lavoro eseguiti in Servizio Azure Kubernetes (AKS), l'App Configuration Kubernetes Provider può generare ConfigMap e Secret direttamente dall'archivio senza la necessità di modifiche al codice nei contenitori dei carichi di lavoro. È anche possibile usare Configurazione app per gestire i flag di funzionalità, tra cui l'implementazione mirata e la sperimentazione basata su varianti, nelle procedure di distribuzione sicure.

Per l'isolamento della rete, usare gli endpoint privati per Configurazione App in modo che il traffico client rimanga sugli indirizzi IP privati tramite collegamento privato di Azure. Dopo aver configurato l'accesso privato, è possibile disattivare l'accesso pubblico per ridurre l'esposizione degli endpoint pubblici. Nelle distribuzioni con replica geografica, un singolo endpoint privato può raggiungere tutte le repliche, ma per una maggiore resilienza a livello di area, è possibile effettuare il provisioning di endpoint privati per ogni area di replica e configurare di conseguenza domain Name System (DNS).

Un diagramma che mostra un esempio di implementazione del modello di Store di configurazione esterna con App Configuration come hub centrale che si connette a più servizi di Azure e sistemi di archiviazione.

Librerie dei client

Le librerie client offrono molte delle funzionalità precedenti. Le librerie client si integrano con il runtime dell'applicazione per recuperare e memorizzare nella cache i valori, aggiornare i valori quando cambiano e gestire interruzioni temporanee in Configurazione app.

Runtime Libreria del client Note Quickstart
.NET Microsoft.Extensions.Configuration.AzureAppConfiguration Provider per Microsoft.Extensions.Configuration Guida introduttiva per .NET
ASP.NET Core Microsoft.Azure.AppConfiguration.AspNetCore Aggiunge middleware di aggiornamento basato su richiesta per ASP.NET Core Avvio Rapido per ASP.NET Core
Funzioni di Azure in .NET Microsoft.Azure.AppConfiguration.Functions.Worker Fornitore per il modello di lavoratore isolato che utilizza Program.cs Guida rapida per Funzioni di Azure
.NET Framework Microsoft.Configuration.ConfigurationBuilders.AzureAppConfiguration Generatore di configurazione per System.Configuration Guida rapida per .NET Framework
Java Primavera com.azure.spring > azure-spring-cloud-appconfiguration-config Supporta l'accesso a Spring Framework tramite ConfigurationProperties Guida rapida per Java Spring
Python fornitore di configurazione applicazioni Azure Libreria del provider che fornisce l'aggiornamento dinamico e il supporto di riferimento Key Vault Guida introduttiva per Python
JavaScript e Node.js @azure/app-configuration-provider Libreria del provider che fornisce l'aggiornamento dinamico e il supporto di riferimento Key Vault Guida introduttiva per JavaScript

Sono disponibili anche le seguenti attività di Configurazione app GitHub Action e Azure Pipelines predefinite:

Esempio di archivio di backup personalizzato

In un'applicazione che Azure host è possibile usare Archiviazione di Azure per archiviare le informazioni di configurazione esternamente. Questo approccio offre resilienza e prestazioni elevate. Per impostazione predefinita, Archiviazione replica i dati tre volte all'interno di un singolo data center. Per la ridondanza geografica tra aree, è possibile configurare la replica geografica con funzionalità di failover manuali. Archiviazione tabelle di Azure fornisce un archivio chiave-valore che può usare uno schema flessibile per i valori. Archiviazione BLOB di Azure fornisce un archivio gerarchico basato su contenitori che può contenere qualsiasi tipo di dati in BLOB denominati singolarmente.

Quando si implementa questo modello, è necessario astrarre gestione rete virtuale di Azure ed esporre le impostazioni all'interno delle applicazioni. È anche necessario verificare la disponibilità di aggiornamenti in fase di esecuzione e decidere come rispondere a tali aggiornamenti.

L'esempio seguente illustra come usare un archivio di configurazione semplice e gestione rete virtuale di Azure per archiviare ed esporre le informazioni di configurazione. Una classe BlobSettingsStore astrae gestione rete virtuale di Azure per contenere le informazioni di configurazione. Implementa un'interfaccia semplice ISettingsStore .

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

Questa interfaccia definisce i metodi per recuperare le impostazioni di configurazione che l'archivio di configurazione contiene e include un numero di versione che è possibile usare per rilevare le modifiche recenti delle impostazioni di configurazione. Una BlobSettingsStore classe può usare la ETag proprietà del BLOB per implementare il controllo delle versioni. La ETag proprietà viene aggiornata automaticamente ogni volta che viene scritto un blob.

Annotazioni

Per impostazione predefinita, questa semplice illustrazione espone tutte le impostazioni di configurazione come valori stringa anziché valori tipizzati.

Una classe ExternalConfigurationManager fornisce un involucro per un'istanza di BlobSettingsStore. Un'applicazione può usare questa classe per recuperare le informazioni di configurazione. Questa classe può usare un meccanismo di notifica delle modifiche, ad esempio Microsoft Reactive Extensions, per pubblicare gli aggiornamenti della configurazione durante l'esecuzione del sistema. Implementa anche il modello diCache-Aside per le impostazioni per offrire una migliore resilienza e prestazioni.

Nell'esempio seguente viene illustrato come implementare una ExternalConfigurationManager classe .

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

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

Passaggi successivi