web-dev-qa-db-fra.com

Azure Fonctions locales.Settings.json représenté dans Appseinttings.json pour un ServiceBust

J'ai actuellement une fonction Azure à l'aide de la liaison ServiceBustrigger

 [ServiceBusTrigger("%TopicName%", "%SubscripionName%", Connection = "MyConnection")]
         string  catclogueEventMsgs, ILogger log, ExecutionContext context)

qui utilise ce fichier local.Settings.json

   "Values": {
             …
    "MyConnection": "Endpoint=sb://testxxxxxxxxxxxxxxxxxx
    "SubscriptionName": "testsubscriptionName"
    "TopicName": "testtopicName",
  }

Comment puis-je représenter cela dans le fichier appsetTes.json. Sera-ce comme ci-dessous?

   "Values": {
    "MyConnection": "Endpoint=sb://testxxxxxxxxxxxxxxxxxx
    "SubscriptionName": "testsubscriptionName"
    "TopicName": "testtopicName",
  }

Au lieu d'utiliser une "valeurs", puis-je utiliser, par exemple, objet "MySubs" comme ci-dessous?

   "MySubs": {
    "MyConnection": "Endpoint=sb://testxxxxxxxxxxxxxxxxxx
    "SubscriptionName": "testsubscriptionName"
    "TopicName": "testtopicName",
  }

Si son possible d'utiliser les paramètres ci-dessus, comment puis-je représenter cela dans la liaison ServiceBgrigger? Est-ce que je changerais ça?

 [ServiceBusTrigger("%MySubs.TopicName%", "%MySubs.SubscripionName%", Connection = "MySubs.MyConnection")]
         string  catclogueEventMsgs, ILogger log, ExecutionContext context)
7
Oneil

Cela ressemble à un hybride de Jason et Oneil/Liam est correct.

  • D'après ce que je peux dire, dans le nom/la déclaration/la définition de la fonction, il doit provenir de la locale.Settings.json lors du développement et du développement de "% theQuename%", puis entré dans la configuration de la fonction -> Paramètres de l'application pour Bleu azur.

  • Dans la fonction actuelle elle-même, vous pouvez exploiter l'injection de fichier JSON via STERTUP.CS, puis inclure les valeurs de la fonction elle-même.

Ceci mérite un poteau de blog totalement séparé (et il y a eu semblable, mais pas tout à fait comme des configurations sophistiquées mentionnées, mais voici ce que j'ai fait et figurant après une année plus et fonctionne de manière fantastique.

Configuration des fichiers :

  1. J'ai un dossier de configuration dans le projet Fonctions qui stocke des fichiers xyz.settings.json. Les fichiers ici sont définis sur le contenu, puis pour créer et publier également dans le fichier .csproj.
  2. Dans le dossier de configuration, j'ai aussi un fichier secrets.json que je stocke tous les secrets que je ne veux pas publié. Ceci est défini sur Construire uniquement, pas publier! Chaque fichier xyz.settings.json a une valeur de "-Secret--" pour les valeurs que je veux secret.
  3. local.Settings.json a la valeur paires de "valeurs" utilisée pour Dev. Ceci est également pour la construction seulement. Ces valeurs sont ensuite ajoutées au portail de la fonction d'Azure pour l'application publiée. Ces valeurs ne sont utilisées que pour le nom de la fonction/la déclaration/la définition.
  4. J'ai créé une classe qui correspond aux valeurs du fichier xyz.settings.json. Cela vous permet d'accéder aux valeurs par injection. En outre, dans les paramètres de fonction de fonction, vous pouvez également faire référence à ces valeurs par XYZSETTINGS: valeur lors de la saisie d'une valeur secrète.

Configuration Configuration : Startup.cs

(Même si cela dit/home/site/wwwroot - les fichiers sont basés sur la racine du projet, lors de la publication de la racine)

public override void Configure(IFunctionsHostBuilder builder)
  {
    var currentDirectory = "/home/site/wwwroot";
    var config = new ConfigurationBuilder()
        .SetBasePath(currentDirectory)
        .AddJsonFile("local.settings.json", optional: false, reloadOnChange: true)
        .AddJsonFile("Config/xyz.settings.json", optional: false, reloadOnChange: true)
        .AddJsonFile("Config/xyz.settings.dev.json", optional: true, reloadOnChange: true)
        .AddJsonFile("Config/secret.settings.json", optional: true, reloadOnChange: true)
        .AddEnvironmentVariables()
        .Build();
    builder.Services.Configure<XyzSettings>(config.GetSection("XyzSettings"));

Ce que cela fait et comment ça marche:

  • Les paramètres d'application sont appliqués dans un ordre très spécifique, avec les fichiers JSON qui s'appliquent dans l'ordre dans lequel elles sont ajoutées. S'il y a des paramètres dupliqués, les fichiers existants sont écrasés.
  • J'ai d'abord local.Settings. Ensuite suivi des fichiers JSON générale (xyz.settings.json), suivi des variantes spécifiques environnementales (Zyx.Settings.dev.json), suivie de Secrets.json
  • Les variables spécifiques à l'environnement vont durer (ce sont soit ce que vous spécifiez sur votre machine - ou l'équivalent sont les paramètres d'application de fonction)
  • Cette approche vous permet d'avoir un ensemble de paramètres vraiment agréable et stable. Ceci est particulièrement utile si vous avez un projet qui possède de nombreuses intégrations différentes, API, etc. Ils peuvent tous être des fichiers différents.
  • Remarquez comment les deux derniers fichiers JSON sont marqués comme facultatifs. Ils doivent être depuis qu'ils ne sont pas inclus lors de la publication. Tous les fichiers JSON requis et non inclus entraîneront l'échec de la fonction.

en parlant de secrets :

  • Les secrets locaux peuvent être stockés dans les secrets.json tant qu'ils ne sont pas définis pour publier.

  • À Azure, il est recommandé de stocker les valeurs dans les paramètres de l'application de fonction qui touchent à Azure Key Vault.

  • Il est brillant comment il est configuré. Tout ce que vous faites dans les paramètres de l'application Fonction consiste à nommer la variable de quoi il est dans les paramètres, tels que XYZSETTINGS: SETNAME, puis se référer à l'emplacement dans la touche Vault comme suit:

    @ Microsoft.KeyVault (Secreturi = https: //yourvalutname.vault.azure.net/secrets/secret-name/auto-generated-keyvaultGuid)

Fichier de fonction : (à l'aide d'une gâchette de files d'attente à titre d'exemple mais fonctionne de la même manière)

namespace Xyz.Functions
{
   public class Azure_Queue_Add_Xyz
   {
        private readonly XyzSettings _xyzSettings = null;

        public Azure_Queue_Add_Xyz(IOptions<AzureSettings> Azure_settings)
        {
            _azureSettings = Azure_settings.Value;
        }

        [FunctionName("Azure_Queue_Add_Xyz")]
      public void Run(
            [HttpTrigger(AuthorizationLevel.Function, "post",
            Route = "HttpTrigger/Azure_Queue_Add_Xyz")] xyzConfig input,
            [Queue("%TheQueueName%"), StorageAccount("StorageAccount")] ICollector<string> msgOutput,
            ILogger logger,
            ExecutionContext context)
      {
            logger.LogError("{0} is processing a request", context.FunctionName);
            logger.LogError("{0} - Queue: {1}", context.FunctionName, _xyzSettings.TheQueueName);
            logger.LogError("{0} - CloudQueueMessage: {1}", context.FunctionName, JsonConvert.SerializeObject(input));

            msgOutput.Add(JsonConvert.SerializeObject(input));
      }
   }
}
0
drewid