Proposé par .NET, le pattern IOptions est une méthode qui injecte proprement la configuration dans vos services applicatifs. En effet, il permet de lier automatiquement des classes C# fortement typées à une section spécifique dans un fichier JSON ou dans les App Settings Azure.
Concrètement, ce pattern se décline en trois interfaces principales, chacune répondant à un besoin différent :
Grâce à la prise en charge de l’injection de dépendances et du modèle de configuration de .NET, Azure Functions (nous parlerons ici exclusivement d’Isolated Process) permet d’adopter des pratiques éprouvées pour une configuration propre et modulaire.
Ainsi, le pattern IOptions présente plusieurs avantages clés dans ce contexte :
Pour illustrer concrètement ce mécanisme, suivons un exemple simple en quatre étapes.
Tout d’abord, nous créons une classe C# qui représente la structure de nos paramètres.
public class MySettings { public string ApiKey { get; set; } public int TimeoutInSeconds { get; set; } }
Ensuite, nous ajoutons une section correspondante dans le fichier appsettings.json pour y définir les valeurs.
{ "MySettings": { "ApiKey": "xyz-123", "TimeoutInSeconds": 30 } }
Puis, au démarrage de l’application, nous lions cette section de configuration à notre classe MySettings via l’injection de dépendances.
builder.Services.Configure<MySettings>( builder.Configuration.GetSection("MySettings") );
Enfin, il ne reste plus qu’à injecter IOptions<MySettings> directement dans le constructeur de la fonction pour y accéder de manière typée et sécurisée.
public class MyFunction { private readonly MySettings _settings; public MyFunction(IOptions<MySettings> options) { _settings = options.Value; } [Function("MyFunction")] public void Run([TimerTrigger("0 */5 * * * *")] TimerInfo timer, FunctionContext context) { var logger = context.GetLogger("MyFunction"); logger.LogInformation($"Using API Key: {_settings.ApiKey}, Timeout: {_settings.TimeoutInSeconds}s"); } }
Grâce à cette approche, la configuration est centralisée, le code reste propre et les paramètres sont facilement accessibles dans la fonction.
⚠️ Attention : Pour utiliser Key Vault, votre application doit posséder les autorisations nécessaires pour y accéder. Assurez-vous d’avoir correctement configuré les droits d’accès dans votre environnement Azure, sans quoi la récupération des secrets échouera, provoquant des erreurs ou un dysfonctionnement silencieux.
Afin d’éviter d’exposer des secrets dans vos fichiers de configuration ou votre code, vous pouvez intégrer Azure Key Vault de deux manières principales.
Cette première méthode consiste à référencer explicitement chaque secret depuis les App Settings de votre Function App.
Étape 1 – Créer un Key Vault et ajouter un secret
Pour commencer, ajoutez un secret dans votre coffre, par exemple MySettings–ApiKey.
Étape 2 – Lier le secret dans Azure App Settings
Ensuite, dans la section « Configuration » de votre Function App, ajoutez un paramètre d’application avec la syntaxe suivante :
MySettings:ApiKey = @Microsoft.KeyVault(SecretUri=https://<mon-vault>.vault.azure.net/secrets/MySettings--ApiKey)
Étape 3 – Utiliser la configuration avec IOptions
Finalement, le système injectera automatiquement la valeur du secret sans aucun changement de code.
La seconde approche, plus globale, charge l’ensemble des secrets du Key Vault dans la configuration de l’application.
Étape 1 – Ajouter le package NuGet
D’abord, ajoutez le package NuGet Azure.Extensions.AspNetCore.Configuration.Secrets à votre projet avec la commande :
dotnet add package Azure.Extensions.AspNetCore.Configuration.Secrets
Étape 2 – Charger le Key Vault dans Program.cs
Puis, modifiez votre fichier Program.cs pour qu’il charge le Key Vault au démarrage :
builder.Configuration.AddAzureKeyVault( new Uri("https://<mon-vault>.vault.azure.net/"), new DefaultAzureCredential());
Étape 3 – Nommer les secrets comme les clés de config
Le système mappe automatiquement les secrets aux clés de configuration. Cependant, comme Key Vault n’autorise pas le caractère « : », vous devez le remplacer par un double tiret (—).
Ainsi, un secret nommé MySettings–ApiKey correspondra à la clé de configuration MySettings:ApiKey.
Étape 4 – Utilisation via IOptions<MySettings>
L’accès aux paramètres dans votre fonction reste identique, mais cette méthode est plus automatisée. Toutefois, faites attention à la lisibilité si de très nombreux secrets sont injectés de cette manière.
Pour valider vos options simplement, vous pouvez utiliser les attributs de validation standards de .NET, comme [Required] ou [Range]. Il suffit de décorer les propriétés de votre classe de configuration :
public class MySettings { [Required] public string ApiKey { get; set; } [Range(1, 300)] public int TimeoutInSeconds { get; set; } }
Ensuite, activez cette validation dans Program.cs en ajoutant les méthodes .ValidateDataAnnotations() et .ValidateOnStart() pour que l’application échoue au démarrage si une configuration est invalide.
builder.Services.AddOptions<MySettings>() .Bind(builder.Configuration.GetSection("MySettings")) .ValidateDataAnnotations() .ValidateOnStart();
Si vous devez gérer différentes variantes d’une même configuration, le pattern IOptions permet d’enregistrer des « options nommées ».
Par exemple, pour configurer deux services distincts :
builder.Services.Configure<MySettings>("ServiceA", config.GetSection("ServiceA")); builder.Services.Configure<MySettings>("ServiceB", config.GetSection("ServiceB"));
Puis, vous pouvez récupérer la configuration spécifique à chaque service en utilisant son nom :
var a = monitor.Get("ServiceA"); var b = monitor.Get("ServiceB");
Finalement, cette fonctionnalité simplifie grandement la gestion d’architectures multiclients, multi-environnements ou multi-services.
En conclusion, le pattern IOptions est bien plus qu’un simple détail technique ; c’est un pilier pour concevoir des Azure Functions robustes, maintenables et sécurisées. Il transforme la manière dont vous gérez vos paramètres en remplaçant par exemple les chaînes de connexion fragiles par des objets C# fortement typés et validés. De plus, son intégration native avec des services comme Azure Key Vault renforce la sécurité, faisant de lui un allié indispensable pour toute architecture cloud moderne et fiable.
Liens Utiles: