[{"data":1,"prerenderedAt":663},["Reactive",2],{"navigation":3,"/posts/azure-functions-custom-configuration":204,"/posts/azure-functions-custom-configuration-surround":640},[4,192,200],{"title":5,"_path":6,"children":7,"icon":191},"Blog","/posts",[8,11,14,17,20,23,26,29,32,35,38,41,44,47,50,53,56,59,62,65,68,71,74,77,80,83,86,89,92,95,98,101,104,107,110,113,116,119,122,125,128,131,134,137,140,143,146,149,152,155,158,161,164,167,170,173,176,179,182,185,188],{"title":9,"_path":10},"Testing your API with REST Client","/posts/testing-your-api-with-rest-client",{"title":12,"_path":13},"HTML templating in Xamarin","/posts/html-templating-in-xamarin",{"title":15,"_path":16},"Goodbye Azure Portal, Welcome Azure CLI","/posts/welcome-azure-cli",{"title":18,"_path":19},"Coming across Gitpod","/posts/gitpod",{"title":21,"_path":22},"Handle token retrieval while querying an API","/posts/delegating-handler",{"title":24,"_path":25},"Clean up your local git branches.","/posts/cleaning-git-branches",{"title":27,"_path":28},"Automate configuration of Teams Tab SSO with PowerShell.","/posts/teams-sso-powershell",{"title":30,"_path":31},"How to do a technology watch? - Part 1","/posts/technology-watch-part1",{"title":33,"_path":34},"How to do a technology watch? - Part 2","/posts/technology-watch-part2",{"title":36,"_path":37},"You almost no longer need Key Vault references for Azure Functions.","/posts/azure-functions-custom-configuration",{"title":39,"_path":40},"How to do a technology watch? - Part 3","/posts/technology-watch-part3",{"title":42,"_path":43},"Forget DevOps, the future is already here!","/posts/devops-future",{"title":45,"_path":46},"Week 9, 2021 - Tips I learned this week","/posts/w09-2021-tips-learned-this-week",{"title":48,"_path":49},"Week 12, 2021 - Tips I learned this week","/posts/w12-2021-tips-learned-this-week",{"title":51,"_path":52},"Week 14, 2021 - Tips I learned this week","/posts/w14-2021-tips-learned-this-week",{"title":54,"_path":55},"Once upon a time in .NET","/posts/once-upon-a-time-in-dotnet",{"title":57,"_path":58},"Install your applications with winget","/posts/winget-import",{"title":60,"_path":61},"Customize your applications when installing them with winget","/posts/winget-override",{"title":63,"_path":64},"Week 22, 2021 - Tips I learned this week","/posts/w22-2021-tips-learned-this-week",{"title":66,"_path":67},"How to connect to an Azure SQL Database from C# using Azure AD","/posts/sqlclient-active-directory-authent",{"title":69,"_path":70},"Producing packages for Windows Package Manager","/posts/wingetcreate",{"title":72,"_path":73},"4 tips about GitHub Actions environment variables and contexts","/posts/github-actions-var-and-context",{"title":75,"_path":76},"AzureWebJobsStorage, the secret you don't need in your Function App.","/posts/azure-functions-without-azurewebjobsstorage",{"title":78,"_path":79},"ASP.NET Core - Lost in configuration","/posts/lost-in-configuration",{"title":81,"_path":82},"Week 39, 2021 - Tips I learned this week","/posts/w39-2021-tips-learned-this-week",{"title":84,"_path":85},"Week 41, 2021 - Tips I learned this week","/posts/w41-2021-tips-learned-this-week",{"title":87,"_path":88},"Migrating and open-sourcing my blog","/posts/migrating-blog",{"title":90,"_path":91},"Week 45, 2021 - Tips I learned this week","/posts/w45-2021-tips-learned-this-week",{"title":93,"_path":94},"Organize your GitHub stars with Astral","/posts/astral",{"title":96,"_path":97},"Pulumi with an Azure Blob Storage backend","/posts/pulumi-azure-backend",{"title":99,"_path":100},"IaC Hot Reload with Pulumi Watch","/posts/pulumi-watch",{"title":102,"_path":103},"Week 2, 2022 - Tips I learned this week","/posts/w02-2022-tips-learned-this-week",{"title":105,"_path":106},"Week 3, 2022 - Tips I learned this week","/posts/w03-2022-tips-learned-this-week",{"title":108,"_path":109},"Week 5, 2022 - Tips I learned this week","/posts/w05-2022-tips-learned-this-week",{"title":111,"_path":112},"How to provision an Azure SQL Database with Active Directory authentication","/posts/sqldatabase-active-directory-authent",{"title":114,"_path":115},"Why will I choose Pulumi over Terraform for my next project?","/posts/pulumi-vs-terraform",{"title":117,"_path":118},"Week 19, 2022 - Tips I learned this week","/posts/w19-2022-tips-learned-this-week",{"title":120,"_path":121},"Week 20, 2022 - Tips I learned this week","/posts/w20-2022-tips-learned-this-week",{"title":123,"_path":124},"Keeping secrets secure when using API Clients","/posts/http-clients-secrets",{"title":126,"_path":127},"What made me want to be a developer?","/posts/be-a-developer",{"title":129,"_path":130},"What can we do when stuck with a programming problem?","/posts/get-unstuck",{"title":132,"_path":133},"How did I automate the setup of my developer Windows laptop?","/posts/automate-developer-machine",{"title":135,"_path":136},"Discussion about API clients","/posts/http-clients",{"title":138,"_path":139},"Week 46, 2022 - Tips I learned this week","/posts/w46-2022-tips-learned-this-week",{"title":141,"_path":142},"When Pulumi met Nuke: a .NET love story","/posts/when-pulumi-met-nuke",{"title":144,"_path":145},"A year of learning and sharing - Dev Retro 2022","/posts/2022-retro",{"title":147,"_path":148},"Perform Dynamic Execution of an npm Package","/posts/pnpm-dlx",{"title":150,"_path":151},"Manage multiple Node.js versions","/posts/pnpm-env",{"title":153,"_path":154},"Introducing the Vue.js CI/CD series","/posts/vuecicd-introduction",{"title":156,"_path":157},"Execute commands using your project dependencies","/posts/pnpm-exec",{"title":159,"_path":160},"Vue.js CI/CD: Continuous Integration","/posts/vuecicd-ci",{"title":162,"_path":163},"Who is using pnpm?","/posts/pnpm-who-is-using",{"title":165,"_path":166},"Create an Azure-Ready GitHub Repository using Pulumi","/posts/azure-ready-github-repository",{"title":168,"_path":169},"Deploying to Azure from Azure DevOps without secrets","/posts/ado-workload-identity-federation",{"title":171,"_path":172},"Effortlessly Configure GitHub Repositories for Azure Deployment via OIDC","/posts/scripting-azure-ready-github-repository",{"title":174,"_path":175},"Playing with the .NET 8 Web API template","/posts/playing-with-dotnet8",{"title":177,"_path":178},"Another year of sharing and learning - Dev Retro 2023","/posts/2023-retro",{"title":180,"_path":181},"Week 4, 2024 - Tips I learned this week","/posts/w04-2024-tips-learned-this-week",{"title":183,"_path":184},"Using dependency injection with Azure .NET SDK","/posts/azure-sdk-di",{"title":186,"_path":187},"Having Fun With IT Event Calendars","/posts/it-event-calendars",{"title":189,"_path":190},"Call your Azure AD B2C protected API with authenticated HTTP requests from your JetBrains IDE","/posts/http-clients-oauth2","i-heroicons-newspaper",{"title":193,"_path":194,"children":195,"icon":199},"Goodies","/goodies",[196],{"title":197,"_path":198},"My Git Cheat Sheet","/goodies/gitcheatsheet","i-heroicons-gift-solid",{"title":201,"_path":202,"icon":203},"About","/about","i-heroicons-user-circle-solid",{"_path":37,"_dir":205,"_draft":206,"_partial":206,"_locale":207,"title":36,"description":208,"lead":209,"date":210,"image":211,"badge":213,"tags":215,"body":220,"_type":635,"_id":636,"_source":637,"_file":638,"_extension":639},"posts",false,"","The possibility to add configuration sources in Azure Functions has just been released with the latest version of Microsoft.Azure.Functions.Extensions NuGet package. I have been waiting for this feature for a long time (like many people I think) because it brings to Azure Functions all the things we are used to with configuration in ASP.NET Core 😻. But that is not the only reason, it is also because with this feature you almost don't need to use key vault references!","Talking about how to manage configuration secrets in Azure Functions.","2020-09-21T00:00:00.000Z",{"src":212},"/images/lightning_1.jpg",{"label":214},"Development",[216,217,218,219],"Azure Functions","Azure Key Vault","Azure","Configuration",{"type":221,"children":222,"toc":627},"root",[223,251,256,263,290,302,316,325,330,336,348,353,362,367,429,441,450,455,469,481,525,534,539,548,553,559,595,605,610,616,621],{"type":224,"tag":225,"props":226,"children":227},"element","p",{},[228,231,238,240,249],{"type":229,"value":230},"text","The possibility to add configuration sources in Azure Functions has just been released with the latest version of ",{"type":224,"tag":232,"props":233,"children":235},"code",{"className":234},[],[236],{"type":229,"value":237},"Microsoft.Azure.Functions.Extensions",{"type":229,"value":239}," ",{"type":224,"tag":241,"props":242,"children":246},"a",{"href":243,"rel":244},"https://www.nuget.org/packages/Microsoft.Azure.Functions.Extensions/1.1.0",[245],"nofollow",[247],{"type":229,"value":248},"NuGet package",{"type":229,"value":250},". I have been waiting for this feature for a long time (like many people I think) because it brings to Azure Functions all the things we are used to with configuration in ASP.NET Core 😻. But that is not the only reason, it is also because with this feature you almost don't need to use key vault references!",{"type":224,"tag":225,"props":252,"children":253},{},[254],{"type":229,"value":255},"But before deep dive into this topic, let's give a bit of context about configuration and secrets in Azure Functions (just skip the next section if you already are familiar with all that).",{"type":224,"tag":257,"props":258,"children":260},"h2",{"id":259},"a-quick-reminder-about-configuration-and-secrets-in-azure-functions",[261],{"type":229,"value":262},"A quick reminder about configuration and secrets in Azure Functions",{"type":224,"tag":225,"props":264,"children":265},{},[266,268,273,275,281,283,288],{"type":229,"value":267},"Configuration used by functions in a Function App is stored in settings that can be set in the ",{"type":224,"tag":232,"props":269,"children":271},{"className":270},[],[272],{"type":229,"value":219},{"type":229,"value":274}," section of a Function App in Azure Portal. When developing locally you have to use a ",{"type":224,"tag":232,"props":276,"children":278},{"className":277},[],[279],{"type":229,"value":280},"local.settings.json",{"type":229,"value":282}," file that will contain copies of the settings stored in Azure portal. The settings from ",{"type":224,"tag":232,"props":284,"children":286},{"className":285},[],[287],{"type":229,"value":280},{"type":229,"value":289}," will be loaded as environment variables when debugging locally. But as its name suggests, the purpose of this file is to be used for local development only: its settings are not used when the function runs on Azure. Furthermore, this file should never be committed to avoid putting settings corresponding to secrets in source control.",{"type":224,"tag":225,"props":291,"children":292},{},[293],{"type":224,"tag":294,"props":295,"children":301},"img",{"alt":296,"className":297,"src":300},"Azure Function local settings file.",[298,299],"rounded-lg","mx-auto","/posts/images/functionssecrets_localsettings_1.png",[],{"type":224,"tag":225,"props":303,"children":304},{},[305,307,314],{"type":229,"value":306},"Speaking of secrets, they should never be directly stored in the application settings of a Function App (the same goes for App Services by the way). Why not? Because secrets would be available to  anyone who has access to the Function App in the Azure Portal. The right way is to use an Azure Key Vault which is the Azure component for securely storing and accessing secrets 🔒. Once your secrets are in the key vault, you have to grant the Key Vault access to the identity of your Function App and you can then reference the secrets you need directly in your application settings. These are called ",{"type":224,"tag":241,"props":308,"children":311},{"href":309,"rel":310},"https://docs.microsoft.com/en-us/azure/app-service/app-service-key-vault-references",[245],[312],{"type":229,"value":313},"Key Vault references",{"type":229,"value":315}," because an application setting does not contain directly the value of a secret but a reference to the secret which is stored in Key Vault. When running, your function will automatically have access to the secret and its value as an environment variable, as if it was a normal application setting.",{"type":224,"tag":225,"props":317,"children":318},{},[319],{"type":224,"tag":294,"props":320,"children":324},{"alt":321,"className":322,"src":323},"Function App application settings in Azure portal.",[298,299],"/posts/images/functionssecrets_portal_1.png",[],{"type":224,"tag":225,"props":326,"children":327},{},[328],{"type":229,"value":329},"Key Vault references work for both App Services and Function Apps and are particularly useful for existing applications that have their secrets stored in settings because securing the secrets with Azure Key Vault references does not require any code change.",{"type":224,"tag":257,"props":331,"children":333},{"id":332},"the-downside-of-key-vault-references-the-local-debugging-experience",[334],{"type":229,"value":335},"The downside of Key Vault references: the local debugging experience",{"type":224,"tag":225,"props":337,"children":338},{},[339,341,346],{"type":229,"value":340},"Do you remember when I told you that the local settings file should not be committed to your git repository? Well, what you might not have realized is that it means when someone from your team clones the git repository containing your function he won't have this ",{"type":224,"tag":232,"props":342,"children":344},{"className":343},[],[345],{"type":229,"value":280},{"type":229,"value":347}," file which is mandatory to run your function app locally. And even if he creates manually the file, he will not necessarily know which settings to put in it. But we want to avoid him manually copying all the settings from the Azure portal or asking a colleague to send his local settings file by email (which is a really bad practice if it contains secrets). Hopefully, there are some ways to fill or generate this file.",{"type":224,"tag":225,"props":349,"children":350},{},[351],{"type":229,"value":352},"If you use Visual Studio there is a GUI that will help you compare/modify local settings and Azure settings.",{"type":224,"tag":225,"props":354,"children":355},{},[356],{"type":224,"tag":294,"props":357,"children":361},{"alt":358,"className":359,"src":360},"Function App application settings in Visual Studio.",[298,299],"/posts/images/functionssecrets_vs_1.png",[],{"type":224,"tag":225,"props":363,"children":364},{},[365],{"type":229,"value":366},"And whether or not you are using Visual Studio, you can generate the local settings file filled with Azure settings with a few Azure Functions CLI commands:",{"type":224,"tag":368,"props":369,"children":373},"pre",{"className":370,"code":371,"language":372,"meta":207,"style":207},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","func azure functionapp fetch-app-settings $FUNCTION_APP_NAME\nfunc settings decrypt\n","bash",[374],{"type":224,"tag":232,"props":375,"children":376},{"__ignoreMap":207},[377,411],{"type":224,"tag":378,"props":379,"children":382},"span",{"class":380,"line":381},"line",1,[383,389,395,400,405],{"type":224,"tag":378,"props":384,"children":386},{"style":385},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[387],{"type":229,"value":388},"func",{"type":224,"tag":378,"props":390,"children":392},{"style":391},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[393],{"type":229,"value":394}," azure",{"type":224,"tag":378,"props":396,"children":397},{"style":391},[398],{"type":229,"value":399}," functionapp",{"type":224,"tag":378,"props":401,"children":402},{"style":391},[403],{"type":229,"value":404}," fetch-app-settings",{"type":224,"tag":378,"props":406,"children":408},{"style":407},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[409],{"type":229,"value":410}," $FUNCTION_APP_NAME\n",{"type":224,"tag":378,"props":412,"children":414},{"class":380,"line":413},2,[415,419,424],{"type":224,"tag":378,"props":416,"children":417},{"style":385},[418],{"type":229,"value":388},{"type":224,"tag":378,"props":420,"children":421},{"style":391},[422],{"type":229,"value":423}," settings",{"type":224,"tag":378,"props":425,"children":426},{"style":391},[427],{"type":229,"value":428}," decrypt\n",{"type":224,"tag":225,"props":430,"children":431},{},[432,434,439],{"type":229,"value":433},"This is an example of a generated ",{"type":224,"tag":232,"props":435,"children":437},{"className":436},[],[438],{"type":229,"value":280},{"type":229,"value":440}," file:",{"type":224,"tag":225,"props":442,"children":443},{},[444],{"type":224,"tag":294,"props":445,"children":449},{"alt":446,"className":447,"src":448},"Generated local settings file.",[298,299],"/posts/images/functionssecrets_localsettings_2.png",[],{"type":224,"tag":225,"props":451,"children":452},{},[453],{"type":229,"value":454},"However, as you can see, the settings corresponding to secrets contain the Key Vault reference values that are used by Azure to link the settings to the secrets. But this is an Azure mechanism, locally the true secrets value won't be loaded into configuration. So you will have to manually retrieve the value of the secrets in your key vault and set them manually in your local settings file. That may be okay for one secret but that gets quickly annoying when you have many secrets. You don't want your team members to constantly lose time copying secret values from the key vault on their local environment. I don't even talk about the loss of time understanding what is wrong when a secret value has changed and you did not realize it or the bad habits it could lead to like sending secrets by email or chat messages.",{"type":224,"tag":225,"props":456,"children":457},{},[458,460,467],{"type":229,"value":459},"This is a terrible local debugging experience and honestly, you don't want that. What you want is that your function code just works when you or one of your colleagues clones or pulls a new version of the function app code. When debugging locally the code of an ASP.NET Core application deployed in an App Service you don't have this kind of problem because usually your code directly loads the secrets from the Key Vault thanks to ",{"type":224,"tag":241,"props":461,"children":464},{"href":462,"rel":463},"https://docs.microsoft.com/en-us/aspnet/core/security/key-vault-configuration?view=aspnetcore-3.1",[245],[465],{"type":229,"value":466},"Key Vault configuration provider",{"type":229,"value":468},".",{"type":224,"tag":257,"props":470,"children":472},{"id":471},"here-comes-ifunctionsconfigurationbuilder",[473,475],{"type":229,"value":474},"Here comes ",{"type":224,"tag":232,"props":476,"children":478},{"className":477},[],[479],{"type":229,"value":480},"IFunctionsConfigurationBuilder",{"type":224,"tag":225,"props":482,"children":483},{},[484,486,491,493,499,501,508,510,515,517,523],{"type":229,"value":485},"If you are already familiar with dependency injection in Azure Functions, you already know the ",{"type":224,"tag":232,"props":487,"children":489},{"className":488},[],[490],{"type":229,"value":237},{"type":229,"value":492}," NuGet package that allows you to inherit from the ",{"type":224,"tag":232,"props":494,"children":496},{"className":495},[],[497],{"type":229,"value":498},"FunctionStartup",{"type":229,"value":500}," abstract class and register the different services you want to inject into your functions (you can find more about that in the ",{"type":224,"tag":241,"props":502,"children":505},{"href":503,"rel":504},"https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection",[245],[506],{"type":229,"value":507},"documentation",{"type":229,"value":509},"). In the latest version of this NuGet package, a new virtual method has been added to ",{"type":224,"tag":232,"props":511,"children":513},{"className":512},[],[514],{"type":229,"value":498},{"type":229,"value":516},": ",{"type":224,"tag":232,"props":518,"children":520},{"className":519},[],[521],{"type":229,"value":522},"ConfigureAppConfiguration",{"type":229,"value":524},". It allows you to specify additional configuration sources you would need in your functions.",{"type":224,"tag":225,"props":526,"children":527},{},[528],{"type":224,"tag":294,"props":529,"children":533},{"alt":530,"className":531,"src":532},"FunctionsStartup abstract class.",[298,299],"/posts/images/functionssecrets_vs_2.png",[],{"type":224,"tag":225,"props":535,"children":536},{},[537],{"type":229,"value":538},"What is awesome is that you can use all the configuration providers you are used to in ASP.NET Core and that includes the Key Vault Configuration provider. I think you understand what I am getting at 😉: instead of using key vault references in your function app settings, you can simply retrieve the secrets from your key vault thanks to the configuration provider.",{"type":224,"tag":225,"props":540,"children":541},{},[542],{"type":224,"tag":294,"props":543,"children":547},{"alt":544,"className":545,"src":546},"Debugging configuration in Startup file in Visual Studio.",[298,299],"/posts/images/functionssecrets_vs_3.png",[],{"type":224,"tag":225,"props":549,"children":550},{},[551],{"type":229,"value":552},"This way, no more copying secret, no more storing secrets values locally, no more wondering if you have the latest version of a secret. Say goodbye to key vault references, pull the latest version of your code, press F5 and it will work!",{"type":224,"tag":257,"props":554,"children":556},{"id":555},"the-triggers-case",[557],{"type":229,"value":558},"The triggers case",{"type":224,"tag":225,"props":560,"children":561},{},[562,564,578,580,584,586,593],{"type":229,"value":563},"Well in my title I said ",{"type":224,"tag":565,"props":566,"children":567},"em",{},[568,570,576],{"type":229,"value":569},"\"you ",{"type":224,"tag":571,"props":572,"children":573},"strong",{},[574],{"type":229,"value":575},"almost",{"type":229,"value":577}," no longer need key vault references\"",{"type":229,"value":579}," and the ",{"type":224,"tag":571,"props":581,"children":582},{},[583],{"type":229,"value":575},{"type":229,"value":585}," is important. As the ",{"type":224,"tag":241,"props":587,"children":590},{"href":588,"rel":589},"https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection#customizing-configuration-sources",[245],[591],{"type":229,"value":592},"Azure Functions documentation",{"type":229,"value":594}," about customizing configuration sources mentions:",{"type":224,"tag":596,"props":597,"children":599},"callout",{"icon":598},"i-heroicons-light-bulb",[600],{"type":224,"tag":225,"props":601,"children":602},{},[603],{"type":229,"value":604},"For function apps running in the Consumption or Premium plans, modifications to configuration values used in triggers can cause scaling errors. Any changes to these properties by the FunctionsStartup class result in a function app startup error.",{"type":224,"tag":225,"props":606,"children":607},{},[608],{"type":229,"value":609},"Therefore, if you use a trigger that needs a secret (the connection string of an EventHub trigger for instance), you have no other choice than to use a key vault reference. But for everything else you are good to go with Azure Key Vault configuration provider.",{"type":224,"tag":257,"props":611,"children":613},{"id":612},"to-conclude",[614],{"type":229,"value":615},"To conclude",{"type":224,"tag":225,"props":617,"children":618},{},[619],{"type":229,"value":620},"To summarize, after a quick recall of how Azure Functions configuration works we have seen how Key Vault references can help to avoid having secret values in settings. We talked about the downside of this approach for the local development experience and how using the Azure Key Vault configuration provider solved that except when a secret is needed in a trigger.",{"type":224,"tag":622,"props":623,"children":624},"style",{},[625],{"type":229,"value":626},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":207,"searchDepth":413,"depth":413,"links":628},[629,630,631,633,634],{"id":259,"depth":413,"text":262},{"id":332,"depth":413,"text":335},{"id":471,"depth":413,"text":632},"Here comes IFunctionsConfigurationBuilder",{"id":555,"depth":413,"text":558},{"id":612,"depth":413,"text":615},"markdown","content:1.posts:10.azure-functions-custom-configuration.md","content","1.posts/10.azure-functions-custom-configuration.md","md",[641,653],{"_path":40,"_dir":205,"_draft":206,"_partial":206,"_locale":207,"title":39,"description":642,"lead":643,"date":644,"image":645,"badge":647,"tags":649,"_type":635,"_id":651,"_source":637,"_file":652,"_extension":639},"When I started writing this article I did not realize it would be so long so I decided afterward to split it into three parts that will each talk about an aspect of doing a technology watch:","Be part of the community","2020-10-29T00:00:00.000Z",{"src":646},"/images/passion_1.jpg",{"label":648},"Essay",[650],"learning","content:1.posts:11.technology-watch-part3.md","1.posts/11.technology-watch-part3.md",{"_path":34,"_dir":205,"_draft":206,"_partial":206,"_locale":207,"title":33,"description":654,"lead":655,"date":656,"image":657,"badge":659,"tags":660,"_type":635,"_id":661,"_source":637,"_file":662,"_extension":639},"Learn tech efficiently: blogs, docs, videos, interactive sites.","Where to learn?","2020-09-18T00:00:00.000Z",{"src":658},"/images/classroom_1.jpg",{"label":648},[650],"content:1.posts:9.technology-watch-part2.md","1.posts/9.technology-watch-part2.md",1716749601693]