Le pattern IOptions dans Azure Functions

Publié par Adrien DECONINCK
Catégorie : .Net / Azure / Azure Functions Azure Key Vault
07/10/2025

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 :

  • IOptions<T> : fournit un objet de configuration figé, car il est chargé une seule fois au démarrage. Par conséquent, on l’utilise souvent pour les fonctions planifiées ou statiques où les paramètres changent peu.
    • Exemple : configuration d’un endpoint externe ou d’un seuil fixe.
  • IOptionsMonitor<T> : permet de récupérer la configuration actuelle et supporte le rafraîchissement dynamique grâce à la fonction OnChange. Toutefois, son intérêt dépend de la source : la mise à jour d’un App Setting dans Azure redémarre la Function App (annulant l’intérêt du rafraîchissement), tandis qu’un secret mis à jour dans Key Vault peut se répercuter sans redémarrage.
    • Exemple : ajustement d’un intervalle de polling ou d’un niveau de log configuré dynamiquement via Key Vault ou Azure App Configuration.
  • IOptionsSnapshot<T> : fournit une nouvelle instance de configuration pour chaque requête HTTP (scoped).
    • Exemple typique : applications multitenant qui chargent des options en fonction de l’utilisateur connecté.

 

Pourquoi utiliser le pattern IOptions dans Azure Functions ?

 

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 :

  • Lisibilité et maintenabilité : il encapsule les paramètres dans des classes typées.
  • Sécurité : il évite de coder les secrets en dur, car ils peuvent provenir d’un Key Vault.
  • Testabilité : il simplifie l’injection d’une configuration simulée lors des tests.
  • Flexibilité : il permet de modifier la configuration à chaud grâce à IOptionsMonitor.

 

Exemple de mise en œuvre dans Azure Functions

 

Pour illustrer concrètement ce mécanisme, suivons un exemple simple en quatre étapes.

 

Étape 1 – Créer une classe de configuration

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; }
}

 

Étape 2 – Définir la configuration dans appsettings.json

Ensuite, nous ajoutons une section correspondante dans le fichier appsettings.json pour y définir les valeurs.

{
  "MySettings": {
    "ApiKey": "xyz-123",
    "TimeoutInSeconds": 30
  }
}

 

Étape 3 – Lier cette section dans Program.cs

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")
);

 

Étape 4 – Injecter la configuration dans la fonction

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.

 

Sécuriser les paramètres avec Azure Key Vault

 

⚠️ 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.

 

Méthode 1 – Références directes dans App Settings

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.

 

Méthode 2 – Chargement global via AddAzureKeyVault()

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.

 

Fonctionnalités supplémentaires avancées

 

Validation automatique avec des attributs de données

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();

 

Gérer plusieurs configurations (options nommées)

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.

 

Conclusion

 

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:

Docs Microsoft IOptions

Docs Microsoft KeyVault

Article MiddleWay KeyVault