web-dev-qa-db-fra.com

Meilleur emplacement pour stocker les variables d'environnement pour Azure Function

Je teste une fonction Azure localement avec plusieurs clés API. Quel est le meilleur endroit pour stocker les variables d'environnement et comment y accéder? j'ai essayé

System.Environment.GetEnvironmentVariable("name")}

mais je ne sais pas où la variable d'environnement est stockée.

Merci!

16
DarthVadar123451

Vous devriez avoir un fichier appelé local.settings.json. Voici le site Web Azure pour Functions-Run-Local

Il est dit

Ces paramètres peuvent également être lus dans votre code en tant que variables d'environnement. En C #, utilisez System.Environment.GetEnvironmentVariable ou ConfigurationManager.AppSettings. En JavaScript, utilisez process.env. Les paramètres spécifiés en tant que variable d'environnement système ont priorité sur les valeurs du fichier local.settings.json.

exemple local.settings.json

{
  "IsEncrypted": false,   
  "Values": {
    "AzureWebJobsStorage": "<connection string>", 
    "AzureWebJobsDashboard": "<connection string>" 
  },
  "Host": {
    "LocalHttpPort": 7071, 
    "CORS": "*" 
  },
  "ConnectionStrings": {
    "SQLConnectionString": "Value"
  }
}

Il indique que vous devez placer les paramètres d'application sous la propriété Values ​​ dans le fichier local.settings.json.

Pour récupérer j'ai utilisé ConfigurationManager.AppSettings["CustomSetting"] car il vous permet de récupérer des chaînes de connexion.

Je viens de jouer avec cela et j'ai découvert que vous devez avoir une clé de chaîne et une valeur de chaîne. J'ai eu une erreur lorsque j'ai essayé d'avoir une sous-section (comme vous le feriez dans un appsettings.json). Je devais avoir le local.settings.json comme ceci:

{
  "IsEncrypted": false,   
  "Values": {
    "AzureWebJobsStorage": "<connection string>", 
    "AzureWebJobsDashboard": "<connection string>" 
    "CustomSetting":"20"
  }
}
19
chris31389

Pour stocker les clés API, vous pouvez utiliser les paramètres d'application. Détails: https://docs.Microsoft.com/en-us/Azure/azure-functions/functions-how-to-use-Azure-function-app-settings#application-settings

Pour obtenir une variable d'environnement ou une valeur de paramètre d'application, utilisez System.Environment.GetEnvironmentVariable, comme indiqué dans l'exemple de code suivant:

public static void Run(TimerInfo myTimer, TraceWriter log)
{
    log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
    log.Info(GetEnvironmentVariable("AzureWebJobsStorage"));
    log.Info(GetEnvironmentVariable("WEBSITE_SITE_NAME"));
}

public static string GetEnvironmentVariable(string name)
{
    return name + ": " + 
        System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);
}

Détails: https://docs.Microsoft.com/en-us/Azure/azure-functions/functions-reference-csharp#environment-variables

Merci, Alexey

6
Alexey Rodionov

Placez les paires clé/valeur dans le fichier appsettings.json sous la propriété "Valeurs".

3
DarthVadar123451

Dans Azure Functions 2, nous sommes passés à la configuration ASP.NET Core et ConfigurationManager n'est plus pris en charge.

J'ai vu de nombreux articles où les gens se font une entorse pour que les installations de ConfigurationBuilder fonctionnent. Le problème est qu'une fois que vous commencez à faire DI, qui a été récemment ajouté, certains scénarios gênants se produisent en raison de ne pas avoir accès à un paramètre de contexte (1). Il est beaucoup plus propre d'utiliser simplement Environment.GetEnvironmentVariable.

Cela correspond parfaitement au modèle de configuration d'Azure Functions: en dev, il récupère les éléments dans le tableau local.settings.json> Values, et en production, il récupère vos variables d'environnement. Ça marche juste.

Je ne vois aucun inconvénient autre que celui différent de ce que nous faisons dans MVC. Mais ce n'est pas MVC, ce sont des fonctions, et jusqu'à ce que MS amène ces plateformes dans un meilleur alignement, nous devrions ouvrir nos esprits à ce qui est le mieux dans les fonctions plutôt que de forcer un paradigme différent à travailler ici.

Votre local.settings.json pourrait ressembler à ceci:

{
    "IsEncrypted": false,
    "Values": {
        "KeystoneDB": "[CONNECTION STRING HERE]"
        "FUNCTIONS_WORKER_RUNTIME": "dotnet"
    }
}

Et en production, vous définissez les variables d'environnement dans le portail.

(1) Il n'y a pas d'autre moyen propre de satisfaire ConfigurationBuilder (). SetBasePath que je connaisse. Voir: Obtenir le répertoire racine de Azure Function App v2

3
Brian MacKay