[{"data":1,"prerenderedAt":2310},["Reactive",2],{"navigation":3,"/posts/azure-functions-without-azurewebjobsstorage":204,"/posts/azure-functions-without-azurewebjobsstorage-surround":2282},[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":76,"_dir":205,"_draft":206,"_partial":206,"_locale":207,"title":75,"description":208,"date":209,"image":210,"badge":212,"tags":214,"body":220,"_type":2277,"_id":2278,"_source":2279,"_file":2280,"_extension":2281},"posts",false,"","If you are using Azure Functions chances are you are using the setting AzureWebJobsStorage in your Function App configuration. And it is quite likely that the value of this setting which is a secret is stored in a non-secured way directly in your Function App configuration, available to anyone who has access to this configuration. But do not worry, we will see in this article how we can make your Function App more secure by removing this secret.","2021-09-15T00:00:00.000Z",{"src":211},"/images/lightning_2.jpg",{"label":213},"DevOps",[215,216,217,218,219],"Azure Functions","Pulumi","IaC","Azure Active Directory","Azure",{"type":221,"children":222,"toc":2266},"root",[223,240,245,252,268,280,292,298,303,312,317,323,337,346,359,373,392,398,411,418,423,443,448,454,468,473,607,620,851,856,1135,1147,1834,1856,2084,2092,2111,2125,2131,2136,2174,2183,2196,2201,2231,2236,2244,2250,2255,2260],{"type":224,"tag":225,"props":226,"children":227},"element","p",{},[228,231,238],{"type":229,"value":230},"text","If you are using Azure Functions chances are you are using the setting ",{"type":224,"tag":232,"props":233,"children":235},"code",{"className":234},[],[236],{"type":229,"value":237},"AzureWebJobsStorage",{"type":229,"value":239}," in your Function App configuration. And it is quite likely that the value of this setting which is a secret is stored in a non-secured way directly in your Function App configuration, available to anyone who has access to this configuration. But do not worry, we will see in this article how we can make your Function App more secure by removing this secret.",{"type":224,"tag":225,"props":241,"children":242},{},[243],{"type":229,"value":244},"But first, let's start at the beginning.",{"type":224,"tag":246,"props":247,"children":249},"h2",{"id":248},"what-is-this-azurewebjobsstorage-setting",[250],{"type":229,"value":251},"What is this AzureWebJobsStorage setting?",{"type":224,"tag":225,"props":253,"children":254},{},[255,257,266],{"type":229,"value":256},"As explained in the ",{"type":224,"tag":258,"props":259,"children":263},"a",{"href":260,"rel":261},"https://docs.microsoft.com/en-us/azure/azure-functions/storage-considerations#storage-account-requirements",[262],"nofollow",[264],{"type":229,"value":265},"documentation",{"type":229,"value":267},", Azure Functions \"rely on Azure Storage for operations such as managing triggers and logging function executions\" which explains why you must associate a storage account to your Function App when you create one.",{"type":224,"tag":225,"props":269,"children":270},{},[271,273,278],{"type":229,"value":272},"By default when you create a Function App with its storage account from Azure Portal, the setting ",{"type":224,"tag":232,"props":274,"children":276},{"className":275},[],[277],{"type":229,"value":237},{"type":229,"value":279}," is automatically created in the Function App configuration and its value contains the secret connection string of the storage account. Thanks to that it will allow your Function App to have access to this storage and to work properly.",{"type":224,"tag":225,"props":281,"children":282},{},[283],{"type":224,"tag":284,"props":285,"children":291},"img",{"alt":286,"className":287,"src":290},"AzureWebJobsStorage setting with a secret value in Function App settings.",[288,289],"rounded-lg","mx-auto","/posts/images/functionsidentity_portal_1.png",[],{"type":224,"tag":246,"props":293,"children":295},{"id":294},"why-azurewebjobsstorage-poses-a-security-risk",[296],{"type":229,"value":297},"Why AzureWebJobsStorage poses a security risk?",{"type":224,"tag":225,"props":299,"children":300},{},[301],{"type":229,"value":302},"App settings of your Function App are stored encrypted in Azure so having secrets in a Function App configuration in Azure does not seem a big security threat. Yet,  secrets in Azure application settings will be available to anyone who has access to the configuration screen of your Function App (or to Kudu) which does not seem a great idea. Moreover in the application settings of a Function App, there is no proper access monitoring, alerting, and auditing as you would have in an Azure Key Vault. So your secret is not really \"safe\" there.",{"type":224,"tag":225,"props":304,"children":305},{},[306],{"type":224,"tag":284,"props":307,"children":311},{"alt":308,"className":309,"src":310},"Padlock on a keyboard.",[288,289],"/posts/images/functionsidentity_padlock_1.jpgpng",[],{"type":224,"tag":225,"props":313,"children":314},{},[315],{"type":229,"value":316},"To avoid having someone gaining access to your storage account without you knowing, you probably do not want your storage account connection string to stay in a Function App configuration on Azure Portal.",{"type":224,"tag":246,"props":318,"children":320},{"id":319},"what-can-we-do-about-it",[321],{"type":229,"value":322},"What can we do about it?",{"type":224,"tag":225,"props":324,"children":325},{},[326,328,335],{"type":229,"value":327},"A solution could be to store the AzureWebJobsStorage secret value in an Azure Key Vault and use a ",{"type":224,"tag":258,"props":329,"children":332},{"href":330,"rel":331},"https://docs.microsoft.com/en-us/azure/app-service/app-service-key-vault-references",[262],[333],{"type":229,"value":334},"Key Vault reference",{"type":229,"value":336}," to link the secret in Key Vault to the AzureWebJobsStorage setting like on the example below.",{"type":224,"tag":225,"props":338,"children":339},{},[340],{"type":224,"tag":284,"props":341,"children":345},{"alt":342,"className":343,"src":344},"AzureWebJobsStorage setting as a keyvault reference in Function App settings.",[288,289],"/posts/images/functionsidentity_portal_2.png",[],{"type":224,"tag":225,"props":347,"children":348},{},[349,351,357],{"type":229,"value":350},"Another solution that is far more interesting I think (as it does not require any secret) is to assign the Storage Blob Data Owner role to your Function App identity and to replace the AzureWebJobsStorage connection string setting by the setting ",{"type":224,"tag":232,"props":352,"children":354},{"className":353},[],[355],{"type":229,"value":356},"AzureWebJobsStorage__accountName",{"type":229,"value":358}," that only contains the name of the storage account and no secret value at all.",{"type":224,"tag":225,"props":360,"children":361},{},[362,364,371],{"type":229,"value":363},"If you want more details about connecting to the storage with the Function App identity you can find it ",{"type":224,"tag":258,"props":365,"children":368},{"href":366,"rel":367},"https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference#connecting-to-host-storage-with-an-identity",[262],[369],{"type":229,"value":370},"here",{"type":229,"value":372},". There is no point for me to paraphrase the documentation just to explain how you can set this up. However, I can show you how to implement that using Infrastructure as Code.",{"type":224,"tag":374,"props":375,"children":377},"callout",{"icon":376},"i-heroicons-chat-bubble-left-20-solid",[378],{"type":224,"tag":225,"props":379,"children":380},{},[381,383,390],{"type":229,"value":382},"If you have read ",{"type":224,"tag":258,"props":384,"children":387},{"href":385,"rel":386},"https://www.techwatching.dev/posts/sqlclient-active-directory-authent",[262],[388],{"type":229,"value":389},"my article",{"type":229,"value":391}," about connecting to an Azure SQL Database using Azure AD to authenticate instead of a secret connection, you probably know that I am not a big fan of secrets when we can avoid using them. From a security perspective, I think it is always a gain to remove the need for secrets while ensuring a resource can only be accessed by authorized people/applications.",{"type":224,"tag":246,"props":393,"children":395},{"id":394},"how-to-configure-a-function-app-to-work-with-its-storage-account-without-a-secret-connection-string",[396],{"type":229,"value":397},"How to configure a Function App to work with its storage account without a secret connection string?",{"type":224,"tag":225,"props":399,"children":400},{},[401,403,409],{"type":229,"value":402},"To do that, I will use ",{"type":224,"tag":258,"props":404,"children":407},{"href":405,"rel":406},"https://www.pulumi.com/",[262],[408],{"type":229,"value":216},{"type":229,"value":410}," which is an Infrastructure as Code platform that uses programming languages instead of DSL to deploy infrastructure. As I am usually programming in C# for my application code, I will use C# as well for my infrastructure code.",{"type":224,"tag":412,"props":413,"children":415},"h3",{"id":414},"what-resources-do-we-need-to-create",[416],{"type":229,"value":417},"What resources do we need to create?",{"type":224,"tag":225,"props":419,"children":420},{},[421],{"type":229,"value":422},"We need to create 3 different Azure resources:",{"type":224,"tag":424,"props":425,"children":426},"ul",{},[427,433,438],{"type":224,"tag":428,"props":429,"children":430},"li",{},[431],{"type":229,"value":432},"a consumption App Service Plan",{"type":224,"tag":428,"props":434,"children":435},{},[436],{"type":229,"value":437},"a Function App",{"type":224,"tag":428,"props":439,"children":440},{},[441],{"type":229,"value":442},"a Storage Account",{"type":224,"tag":225,"props":444,"children":445},{},[446],{"type":229,"value":447},"A resource group will also be created to contain these resources.\nAnd we will also need to assign the Storage Blob Data Owner role to the Function App, so to create a Role Assignment \"resource\".",{"type":224,"tag":412,"props":449,"children":451},{"id":450},"what-the-infrastructure-code-looks-like",[452],{"type":229,"value":453},"What the infrastructure code looks like?",{"type":224,"tag":225,"props":455,"children":456},{},[457,459,466],{"type":229,"value":458},"The infrastructure code looks like standard C# code, but it describes the Azure resources we need using the ",{"type":224,"tag":258,"props":460,"children":463},{"href":461,"rel":462},"https://www.pulumi.com/blog/full-coverage-of-azure-resources-with-azure-native/",[262],[464],{"type":229,"value":465},"Azure Native provider",{"type":229,"value":467}," for Pulumi.",{"type":224,"tag":225,"props":469,"children":470},{},[471],{"type":229,"value":472},"Declaring a resource group is quite easy. Here we use C# string interpolation to build the resource group name from the project name and the stack name (two Pulumi notions that correspond to the name of the project and the environment):",{"type":224,"tag":474,"props":475,"children":479},"pre",{"className":476,"code":477,"language":478,"meta":207,"style":207},"language-csharp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","var resourceGroup = new ResourceGroup($\"rg-{Deployment.Instance.ProjectName}-{Deployment.Instance.StackName}\");\n","csharp",[480],{"type":224,"tag":232,"props":481,"children":482},{"__ignoreMap":207},[483],{"type":224,"tag":484,"props":485,"children":488},"span",{"class":486,"line":487},"line",1,[489,495,500,506,511,516,521,526,532,537,543,548,553,557,562,567,572,576,580,584,588,592,597,602],{"type":224,"tag":484,"props":490,"children":492},{"style":491},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[493],{"type":229,"value":494},"var",{"type":224,"tag":484,"props":496,"children":497},{"style":491},[498],{"type":229,"value":499}," resourceGroup",{"type":224,"tag":484,"props":501,"children":503},{"style":502},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[504],{"type":229,"value":505}," =",{"type":224,"tag":484,"props":507,"children":508},{"style":502},[509],{"type":229,"value":510}," new",{"type":224,"tag":484,"props":512,"children":513},{"style":491},[514],{"type":229,"value":515}," ResourceGroup",{"type":224,"tag":484,"props":517,"children":518},{"style":502},[519],{"type":229,"value":520},"(",{"type":224,"tag":484,"props":522,"children":523},{"style":502},[524],{"type":229,"value":525},"$\"",{"type":224,"tag":484,"props":527,"children":529},{"style":528},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[530],{"type":229,"value":531},"rg-",{"type":224,"tag":484,"props":533,"children":534},{"style":502},[535],{"type":229,"value":536},"{",{"type":224,"tag":484,"props":538,"children":540},{"style":539},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[541],{"type":229,"value":542},"Deployment",{"type":224,"tag":484,"props":544,"children":545},{"style":502},[546],{"type":229,"value":547},".",{"type":224,"tag":484,"props":549,"children":550},{"style":539},[551],{"type":229,"value":552},"Instance",{"type":224,"tag":484,"props":554,"children":555},{"style":502},[556],{"type":229,"value":547},{"type":224,"tag":484,"props":558,"children":559},{"style":539},[560],{"type":229,"value":561},"ProjectName",{"type":224,"tag":484,"props":563,"children":564},{"style":502},[565],{"type":229,"value":566},"}",{"type":224,"tag":484,"props":568,"children":569},{"style":528},[570],{"type":229,"value":571},"-",{"type":224,"tag":484,"props":573,"children":574},{"style":502},[575],{"type":229,"value":536},{"type":224,"tag":484,"props":577,"children":578},{"style":539},[579],{"type":229,"value":542},{"type":224,"tag":484,"props":581,"children":582},{"style":502},[583],{"type":229,"value":547},{"type":224,"tag":484,"props":585,"children":586},{"style":539},[587],{"type":229,"value":552},{"type":224,"tag":484,"props":589,"children":590},{"style":502},[591],{"type":229,"value":547},{"type":224,"tag":484,"props":593,"children":594},{"style":539},[595],{"type":229,"value":596},"StackName",{"type":224,"tag":484,"props":598,"children":599},{"style":502},[600],{"type":229,"value":601},"}\"",{"type":224,"tag":484,"props":603,"children":604},{"style":502},[605],{"type":229,"value":606},");\n",{"type":224,"tag":225,"props":608,"children":609},{},[610,612,618],{"type":229,"value":611},"To declare the resource group in which we want to create the storage account, we can use the property name of variable ",{"type":224,"tag":232,"props":613,"children":615},{"className":614},[],[616],{"type":229,"value":617},"resourceGroup",{"type":229,"value":619}," previously declared. We can see that for some arguments like the SKU names, Pulumi has types to help us choose between different possible values instead of specifying a magic string. It is not always the case but it is pretty handy when such things are available.",{"type":224,"tag":474,"props":621,"children":623},{"className":476,"code":622,"language":478,"meta":207,"style":207},"var storageAccount = new StorageAccount($\"stnosecretfun{Deployment.Instance.StackName}\", new StorageAccountArgs\n{\n    ResourceGroupName = resourceGroup.Name,\n    Sku = new SkuArgs\n    {\n        Name = SkuName.Standard_LRS\n    },\n    Kind = Kind.StorageV2\n});\n",[624],{"type":224,"tag":232,"props":625,"children":626},{"__ignoreMap":207},[627,707,716,748,770,779,806,815,842],{"type":224,"tag":484,"props":628,"children":629},{"class":486,"line":487},[630,634,639,643,647,652,656,660,665,669,673,677,681,685,689,693,698,702],{"type":224,"tag":484,"props":631,"children":632},{"style":491},[633],{"type":229,"value":494},{"type":224,"tag":484,"props":635,"children":636},{"style":491},[637],{"type":229,"value":638}," storageAccount",{"type":224,"tag":484,"props":640,"children":641},{"style":502},[642],{"type":229,"value":505},{"type":224,"tag":484,"props":644,"children":645},{"style":502},[646],{"type":229,"value":510},{"type":224,"tag":484,"props":648,"children":649},{"style":491},[650],{"type":229,"value":651}," StorageAccount",{"type":224,"tag":484,"props":653,"children":654},{"style":502},[655],{"type":229,"value":520},{"type":224,"tag":484,"props":657,"children":658},{"style":502},[659],{"type":229,"value":525},{"type":224,"tag":484,"props":661,"children":662},{"style":528},[663],{"type":229,"value":664},"stnosecretfun",{"type":224,"tag":484,"props":666,"children":667},{"style":502},[668],{"type":229,"value":536},{"type":224,"tag":484,"props":670,"children":671},{"style":539},[672],{"type":229,"value":542},{"type":224,"tag":484,"props":674,"children":675},{"style":502},[676],{"type":229,"value":547},{"type":224,"tag":484,"props":678,"children":679},{"style":539},[680],{"type":229,"value":552},{"type":224,"tag":484,"props":682,"children":683},{"style":502},[684],{"type":229,"value":547},{"type":224,"tag":484,"props":686,"children":687},{"style":539},[688],{"type":229,"value":596},{"type":224,"tag":484,"props":690,"children":691},{"style":502},[692],{"type":229,"value":601},{"type":224,"tag":484,"props":694,"children":695},{"style":502},[696],{"type":229,"value":697},",",{"type":224,"tag":484,"props":699,"children":700},{"style":502},[701],{"type":229,"value":510},{"type":224,"tag":484,"props":703,"children":704},{"style":491},[705],{"type":229,"value":706}," StorageAccountArgs\n",{"type":224,"tag":484,"props":708,"children":710},{"class":486,"line":709},2,[711],{"type":224,"tag":484,"props":712,"children":713},{"style":502},[714],{"type":229,"value":715},"{\n",{"type":224,"tag":484,"props":717,"children":719},{"class":486,"line":718},3,[720,725,730,734,738,743],{"type":224,"tag":484,"props":721,"children":722},{"style":539},[723],{"type":229,"value":724},"    ResourceGroupName ",{"type":224,"tag":484,"props":726,"children":727},{"style":502},[728],{"type":229,"value":729},"=",{"type":224,"tag":484,"props":731,"children":732},{"style":539},[733],{"type":229,"value":499},{"type":224,"tag":484,"props":735,"children":736},{"style":502},[737],{"type":229,"value":547},{"type":224,"tag":484,"props":739,"children":740},{"style":539},[741],{"type":229,"value":742},"Name",{"type":224,"tag":484,"props":744,"children":745},{"style":502},[746],{"type":229,"value":747},",\n",{"type":224,"tag":484,"props":749,"children":751},{"class":486,"line":750},4,[752,757,761,765],{"type":224,"tag":484,"props":753,"children":754},{"style":539},[755],{"type":229,"value":756},"    Sku ",{"type":224,"tag":484,"props":758,"children":759},{"style":502},[760],{"type":229,"value":729},{"type":224,"tag":484,"props":762,"children":763},{"style":502},[764],{"type":229,"value":510},{"type":224,"tag":484,"props":766,"children":767},{"style":491},[768],{"type":229,"value":769}," SkuArgs\n",{"type":224,"tag":484,"props":771,"children":773},{"class":486,"line":772},5,[774],{"type":224,"tag":484,"props":775,"children":776},{"style":502},[777],{"type":229,"value":778},"    {\n",{"type":224,"tag":484,"props":780,"children":782},{"class":486,"line":781},6,[783,788,792,797,801],{"type":224,"tag":484,"props":784,"children":785},{"style":539},[786],{"type":229,"value":787},"        Name ",{"type":224,"tag":484,"props":789,"children":790},{"style":502},[791],{"type":229,"value":729},{"type":224,"tag":484,"props":793,"children":794},{"style":539},[795],{"type":229,"value":796}," SkuName",{"type":224,"tag":484,"props":798,"children":799},{"style":502},[800],{"type":229,"value":547},{"type":224,"tag":484,"props":802,"children":803},{"style":539},[804],{"type":229,"value":805},"Standard_LRS\n",{"type":224,"tag":484,"props":807,"children":809},{"class":486,"line":808},7,[810],{"type":224,"tag":484,"props":811,"children":812},{"style":502},[813],{"type":229,"value":814},"    },\n",{"type":224,"tag":484,"props":816,"children":818},{"class":486,"line":817},8,[819,824,828,833,837],{"type":224,"tag":484,"props":820,"children":821},{"style":539},[822],{"type":229,"value":823},"    Kind ",{"type":224,"tag":484,"props":825,"children":826},{"style":502},[827],{"type":229,"value":729},{"type":224,"tag":484,"props":829,"children":830},{"style":539},[831],{"type":229,"value":832}," Kind",{"type":224,"tag":484,"props":834,"children":835},{"style":502},[836],{"type":229,"value":547},{"type":224,"tag":484,"props":838,"children":839},{"style":539},[840],{"type":229,"value":841},"StorageV2\n",{"type":224,"tag":484,"props":843,"children":845},{"class":486,"line":844},9,[846],{"type":224,"tag":484,"props":847,"children":848},{"style":502},[849],{"type":229,"value":850},"});\n",{"type":224,"tag":225,"props":852,"children":853},{},[854],{"type":229,"value":855},"This is the way of declaring a consumption App Service Plan:",{"type":224,"tag":474,"props":857,"children":859},{"className":476,"code":858,"language":478,"meta":207,"style":207},"var appServicePlan = new AppServicePlan($\"plan-{Deployment.Instance.ProjectName}-{Deployment.Instance.StackName}\", new AppServicePlanArgs\n{\n    ResourceGroupName = resourceGroup.Name,\n    Kind = \"Windows\",\n    Sku = new SkuDescriptionArgs\n    {\n        Tier = \"Dynamic\",\n        Name = \"Y1\"\n    }\n});\n",[860],{"type":224,"tag":232,"props":861,"children":862},{"__ignoreMap":207},[863,974,981,1008,1038,1058,1065,1094,1119,1127],{"type":224,"tag":484,"props":864,"children":865},{"class":486,"line":487},[866,870,875,879,883,888,892,896,901,905,909,913,917,921,925,929,933,937,941,945,949,953,957,961,965,969],{"type":224,"tag":484,"props":867,"children":868},{"style":491},[869],{"type":229,"value":494},{"type":224,"tag":484,"props":871,"children":872},{"style":491},[873],{"type":229,"value":874}," appServicePlan",{"type":224,"tag":484,"props":876,"children":877},{"style":502},[878],{"type":229,"value":505},{"type":224,"tag":484,"props":880,"children":881},{"style":502},[882],{"type":229,"value":510},{"type":224,"tag":484,"props":884,"children":885},{"style":491},[886],{"type":229,"value":887}," AppServicePlan",{"type":224,"tag":484,"props":889,"children":890},{"style":502},[891],{"type":229,"value":520},{"type":224,"tag":484,"props":893,"children":894},{"style":502},[895],{"type":229,"value":525},{"type":224,"tag":484,"props":897,"children":898},{"style":528},[899],{"type":229,"value":900},"plan-",{"type":224,"tag":484,"props":902,"children":903},{"style":502},[904],{"type":229,"value":536},{"type":224,"tag":484,"props":906,"children":907},{"style":539},[908],{"type":229,"value":542},{"type":224,"tag":484,"props":910,"children":911},{"style":502},[912],{"type":229,"value":547},{"type":224,"tag":484,"props":914,"children":915},{"style":539},[916],{"type":229,"value":552},{"type":224,"tag":484,"props":918,"children":919},{"style":502},[920],{"type":229,"value":547},{"type":224,"tag":484,"props":922,"children":923},{"style":539},[924],{"type":229,"value":561},{"type":224,"tag":484,"props":926,"children":927},{"style":502},[928],{"type":229,"value":566},{"type":224,"tag":484,"props":930,"children":931},{"style":528},[932],{"type":229,"value":571},{"type":224,"tag":484,"props":934,"children":935},{"style":502},[936],{"type":229,"value":536},{"type":224,"tag":484,"props":938,"children":939},{"style":539},[940],{"type":229,"value":542},{"type":224,"tag":484,"props":942,"children":943},{"style":502},[944],{"type":229,"value":547},{"type":224,"tag":484,"props":946,"children":947},{"style":539},[948],{"type":229,"value":552},{"type":224,"tag":484,"props":950,"children":951},{"style":502},[952],{"type":229,"value":547},{"type":224,"tag":484,"props":954,"children":955},{"style":539},[956],{"type":229,"value":596},{"type":224,"tag":484,"props":958,"children":959},{"style":502},[960],{"type":229,"value":601},{"type":224,"tag":484,"props":962,"children":963},{"style":502},[964],{"type":229,"value":697},{"type":224,"tag":484,"props":966,"children":967},{"style":502},[968],{"type":229,"value":510},{"type":224,"tag":484,"props":970,"children":971},{"style":491},[972],{"type":229,"value":973}," AppServicePlanArgs\n",{"type":224,"tag":484,"props":975,"children":976},{"class":486,"line":709},[977],{"type":224,"tag":484,"props":978,"children":979},{"style":502},[980],{"type":229,"value":715},{"type":224,"tag":484,"props":982,"children":983},{"class":486,"line":718},[984,988,992,996,1000,1004],{"type":224,"tag":484,"props":985,"children":986},{"style":539},[987],{"type":229,"value":724},{"type":224,"tag":484,"props":989,"children":990},{"style":502},[991],{"type":229,"value":729},{"type":224,"tag":484,"props":993,"children":994},{"style":539},[995],{"type":229,"value":499},{"type":224,"tag":484,"props":997,"children":998},{"style":502},[999],{"type":229,"value":547},{"type":224,"tag":484,"props":1001,"children":1002},{"style":539},[1003],{"type":229,"value":742},{"type":224,"tag":484,"props":1005,"children":1006},{"style":502},[1007],{"type":229,"value":747},{"type":224,"tag":484,"props":1009,"children":1010},{"class":486,"line":750},[1011,1015,1019,1024,1029,1034],{"type":224,"tag":484,"props":1012,"children":1013},{"style":539},[1014],{"type":229,"value":823},{"type":224,"tag":484,"props":1016,"children":1017},{"style":502},[1018],{"type":229,"value":729},{"type":224,"tag":484,"props":1020,"children":1021},{"style":502},[1022],{"type":229,"value":1023}," \"",{"type":224,"tag":484,"props":1025,"children":1026},{"style":528},[1027],{"type":229,"value":1028},"Windows",{"type":224,"tag":484,"props":1030,"children":1031},{"style":502},[1032],{"type":229,"value":1033},"\"",{"type":224,"tag":484,"props":1035,"children":1036},{"style":502},[1037],{"type":229,"value":747},{"type":224,"tag":484,"props":1039,"children":1040},{"class":486,"line":772},[1041,1045,1049,1053],{"type":224,"tag":484,"props":1042,"children":1043},{"style":539},[1044],{"type":229,"value":756},{"type":224,"tag":484,"props":1046,"children":1047},{"style":502},[1048],{"type":229,"value":729},{"type":224,"tag":484,"props":1050,"children":1051},{"style":502},[1052],{"type":229,"value":510},{"type":224,"tag":484,"props":1054,"children":1055},{"style":491},[1056],{"type":229,"value":1057}," SkuDescriptionArgs\n",{"type":224,"tag":484,"props":1059,"children":1060},{"class":486,"line":781},[1061],{"type":224,"tag":484,"props":1062,"children":1063},{"style":502},[1064],{"type":229,"value":778},{"type":224,"tag":484,"props":1066,"children":1067},{"class":486,"line":808},[1068,1073,1077,1081,1086,1090],{"type":224,"tag":484,"props":1069,"children":1070},{"style":539},[1071],{"type":229,"value":1072},"        Tier ",{"type":224,"tag":484,"props":1074,"children":1075},{"style":502},[1076],{"type":229,"value":729},{"type":224,"tag":484,"props":1078,"children":1079},{"style":502},[1080],{"type":229,"value":1023},{"type":224,"tag":484,"props":1082,"children":1083},{"style":528},[1084],{"type":229,"value":1085},"Dynamic",{"type":224,"tag":484,"props":1087,"children":1088},{"style":502},[1089],{"type":229,"value":1033},{"type":224,"tag":484,"props":1091,"children":1092},{"style":502},[1093],{"type":229,"value":747},{"type":224,"tag":484,"props":1095,"children":1096},{"class":486,"line":817},[1097,1101,1105,1109,1114],{"type":224,"tag":484,"props":1098,"children":1099},{"style":539},[1100],{"type":229,"value":787},{"type":224,"tag":484,"props":1102,"children":1103},{"style":502},[1104],{"type":229,"value":729},{"type":224,"tag":484,"props":1106,"children":1107},{"style":502},[1108],{"type":229,"value":1023},{"type":224,"tag":484,"props":1110,"children":1111},{"style":528},[1112],{"type":229,"value":1113},"Y1",{"type":224,"tag":484,"props":1115,"children":1116},{"style":502},[1117],{"type":229,"value":1118},"\"\n",{"type":224,"tag":484,"props":1120,"children":1121},{"class":486,"line":844},[1122],{"type":224,"tag":484,"props":1123,"children":1124},{"style":502},[1125],{"type":229,"value":1126},"    }\n",{"type":224,"tag":484,"props":1128,"children":1130},{"class":486,"line":1129},10,[1131],{"type":224,"tag":484,"props":1132,"children":1133},{"style":502},[1134],{"type":229,"value":850},{"type":224,"tag":225,"props":1136,"children":1137},{},[1138,1140,1145],{"type":229,"value":1139},"In Azure APIs, a FunctionApp is just a WebApp of a special kind \"FunctionApp\". You can notice that we enabled the System Managed Identity on the Function App by setting the Identity property. And as expected we added an app setting ",{"type":224,"tag":232,"props":1141,"children":1143},{"className":1142},[],[1144],{"type":229,"value":356},{"type":229,"value":1146}," whose value is the name of the storage account.",{"type":224,"tag":474,"props":1148,"children":1150},{"className":476,"code":1149,"language":478,"meta":207,"style":207},"var functionApp = new WebApp($\"func-nosecret-{Deployment.Instance.StackName}\", new WebAppArgs\n{\n    Kind = \"FunctionApp\",\n    ResourceGroupName = resourceGroup.Name,\n    ServerFarmId = appServicePlan.Id,\n    Identity = new ManagedServiceIdentityArgs\n    {\n        Type = Pulumi.AzureNative.Web.ManagedServiceIdentityType.SystemAssigned\n    },\n    SiteConfig = new SiteConfigArgs\n    {\n        AppSettings = new[]\n        {\n            new NameValuePairArgs\n            {\n                Name = \"runtime\",\n                Value = \"dotnet\",\n            },\n            new NameValuePairArgs\n            {\n                Name = \"FUNCTIONS_WORKER_RUNTIME\",\n                Value = \"dotnet\",\n            },\n            new NameValuePairArgs\n            {\n                Name = \"FUNCTIONS_EXTENSION_VERSION\",\n                Value = \"~4\"\n            },\n            new NameValuePairArgs\n            {\n                Name = \"AzureWebJobsStorage__accountName\",\n                Value = storageAccount.Name\n            }\n        },\n    },\n});\n",[1151],{"type":224,"tag":232,"props":1152,"children":1153},{"__ignoreMap":207},[1154,1233,1240,1268,1295,1324,1345,1352,1405,1412,1433,1441,1459,1468,1482,1491,1521,1551,1560,1572,1580,1609,1637,1645,1657,1665,1694,1719,1727,1739,1747,1775,1800,1809,1818,1826],{"type":224,"tag":484,"props":1155,"children":1156},{"class":486,"line":487},[1157,1161,1166,1170,1174,1179,1183,1187,1192,1196,1200,1204,1208,1212,1216,1220,1224,1228],{"type":224,"tag":484,"props":1158,"children":1159},{"style":491},[1160],{"type":229,"value":494},{"type":224,"tag":484,"props":1162,"children":1163},{"style":491},[1164],{"type":229,"value":1165}," functionApp",{"type":224,"tag":484,"props":1167,"children":1168},{"style":502},[1169],{"type":229,"value":505},{"type":224,"tag":484,"props":1171,"children":1172},{"style":502},[1173],{"type":229,"value":510},{"type":224,"tag":484,"props":1175,"children":1176},{"style":491},[1177],{"type":229,"value":1178}," WebApp",{"type":224,"tag":484,"props":1180,"children":1181},{"style":502},[1182],{"type":229,"value":520},{"type":224,"tag":484,"props":1184,"children":1185},{"style":502},[1186],{"type":229,"value":525},{"type":224,"tag":484,"props":1188,"children":1189},{"style":528},[1190],{"type":229,"value":1191},"func-nosecret-",{"type":224,"tag":484,"props":1193,"children":1194},{"style":502},[1195],{"type":229,"value":536},{"type":224,"tag":484,"props":1197,"children":1198},{"style":539},[1199],{"type":229,"value":542},{"type":224,"tag":484,"props":1201,"children":1202},{"style":502},[1203],{"type":229,"value":547},{"type":224,"tag":484,"props":1205,"children":1206},{"style":539},[1207],{"type":229,"value":552},{"type":224,"tag":484,"props":1209,"children":1210},{"style":502},[1211],{"type":229,"value":547},{"type":224,"tag":484,"props":1213,"children":1214},{"style":539},[1215],{"type":229,"value":596},{"type":224,"tag":484,"props":1217,"children":1218},{"style":502},[1219],{"type":229,"value":601},{"type":224,"tag":484,"props":1221,"children":1222},{"style":502},[1223],{"type":229,"value":697},{"type":224,"tag":484,"props":1225,"children":1226},{"style":502},[1227],{"type":229,"value":510},{"type":224,"tag":484,"props":1229,"children":1230},{"style":491},[1231],{"type":229,"value":1232}," WebAppArgs\n",{"type":224,"tag":484,"props":1234,"children":1235},{"class":486,"line":709},[1236],{"type":224,"tag":484,"props":1237,"children":1238},{"style":502},[1239],{"type":229,"value":715},{"type":224,"tag":484,"props":1241,"children":1242},{"class":486,"line":718},[1243,1247,1251,1255,1260,1264],{"type":224,"tag":484,"props":1244,"children":1245},{"style":539},[1246],{"type":229,"value":823},{"type":224,"tag":484,"props":1248,"children":1249},{"style":502},[1250],{"type":229,"value":729},{"type":224,"tag":484,"props":1252,"children":1253},{"style":502},[1254],{"type":229,"value":1023},{"type":224,"tag":484,"props":1256,"children":1257},{"style":528},[1258],{"type":229,"value":1259},"FunctionApp",{"type":224,"tag":484,"props":1261,"children":1262},{"style":502},[1263],{"type":229,"value":1033},{"type":224,"tag":484,"props":1265,"children":1266},{"style":502},[1267],{"type":229,"value":747},{"type":224,"tag":484,"props":1269,"children":1270},{"class":486,"line":750},[1271,1275,1279,1283,1287,1291],{"type":224,"tag":484,"props":1272,"children":1273},{"style":539},[1274],{"type":229,"value":724},{"type":224,"tag":484,"props":1276,"children":1277},{"style":502},[1278],{"type":229,"value":729},{"type":224,"tag":484,"props":1280,"children":1281},{"style":539},[1282],{"type":229,"value":499},{"type":224,"tag":484,"props":1284,"children":1285},{"style":502},[1286],{"type":229,"value":547},{"type":224,"tag":484,"props":1288,"children":1289},{"style":539},[1290],{"type":229,"value":742},{"type":224,"tag":484,"props":1292,"children":1293},{"style":502},[1294],{"type":229,"value":747},{"type":224,"tag":484,"props":1296,"children":1297},{"class":486,"line":772},[1298,1303,1307,1311,1315,1320],{"type":224,"tag":484,"props":1299,"children":1300},{"style":539},[1301],{"type":229,"value":1302},"    ServerFarmId ",{"type":224,"tag":484,"props":1304,"children":1305},{"style":502},[1306],{"type":229,"value":729},{"type":224,"tag":484,"props":1308,"children":1309},{"style":539},[1310],{"type":229,"value":874},{"type":224,"tag":484,"props":1312,"children":1313},{"style":502},[1314],{"type":229,"value":547},{"type":224,"tag":484,"props":1316,"children":1317},{"style":539},[1318],{"type":229,"value":1319},"Id",{"type":224,"tag":484,"props":1321,"children":1322},{"style":502},[1323],{"type":229,"value":747},{"type":224,"tag":484,"props":1325,"children":1326},{"class":486,"line":781},[1327,1332,1336,1340],{"type":224,"tag":484,"props":1328,"children":1329},{"style":539},[1330],{"type":229,"value":1331},"    Identity ",{"type":224,"tag":484,"props":1333,"children":1334},{"style":502},[1335],{"type":229,"value":729},{"type":224,"tag":484,"props":1337,"children":1338},{"style":502},[1339],{"type":229,"value":510},{"type":224,"tag":484,"props":1341,"children":1342},{"style":491},[1343],{"type":229,"value":1344}," ManagedServiceIdentityArgs\n",{"type":224,"tag":484,"props":1346,"children":1347},{"class":486,"line":808},[1348],{"type":224,"tag":484,"props":1349,"children":1350},{"style":502},[1351],{"type":229,"value":778},{"type":224,"tag":484,"props":1353,"children":1354},{"class":486,"line":817},[1355,1360,1364,1369,1373,1378,1382,1387,1391,1396,1400],{"type":224,"tag":484,"props":1356,"children":1357},{"style":539},[1358],{"type":229,"value":1359},"        Type ",{"type":224,"tag":484,"props":1361,"children":1362},{"style":502},[1363],{"type":229,"value":729},{"type":224,"tag":484,"props":1365,"children":1366},{"style":539},[1367],{"type":229,"value":1368}," Pulumi",{"type":224,"tag":484,"props":1370,"children":1371},{"style":502},[1372],{"type":229,"value":547},{"type":224,"tag":484,"props":1374,"children":1375},{"style":539},[1376],{"type":229,"value":1377},"AzureNative",{"type":224,"tag":484,"props":1379,"children":1380},{"style":502},[1381],{"type":229,"value":547},{"type":224,"tag":484,"props":1383,"children":1384},{"style":539},[1385],{"type":229,"value":1386},"Web",{"type":224,"tag":484,"props":1388,"children":1389},{"style":502},[1390],{"type":229,"value":547},{"type":224,"tag":484,"props":1392,"children":1393},{"style":539},[1394],{"type":229,"value":1395},"ManagedServiceIdentityType",{"type":224,"tag":484,"props":1397,"children":1398},{"style":502},[1399],{"type":229,"value":547},{"type":224,"tag":484,"props":1401,"children":1402},{"style":539},[1403],{"type":229,"value":1404},"SystemAssigned\n",{"type":224,"tag":484,"props":1406,"children":1407},{"class":486,"line":844},[1408],{"type":224,"tag":484,"props":1409,"children":1410},{"style":502},[1411],{"type":229,"value":814},{"type":224,"tag":484,"props":1413,"children":1414},{"class":486,"line":1129},[1415,1420,1424,1428],{"type":224,"tag":484,"props":1416,"children":1417},{"style":539},[1418],{"type":229,"value":1419},"    SiteConfig ",{"type":224,"tag":484,"props":1421,"children":1422},{"style":502},[1423],{"type":229,"value":729},{"type":224,"tag":484,"props":1425,"children":1426},{"style":502},[1427],{"type":229,"value":510},{"type":224,"tag":484,"props":1429,"children":1430},{"style":491},[1431],{"type":229,"value":1432}," SiteConfigArgs\n",{"type":224,"tag":484,"props":1434,"children":1436},{"class":486,"line":1435},11,[1437],{"type":224,"tag":484,"props":1438,"children":1439},{"style":502},[1440],{"type":229,"value":778},{"type":224,"tag":484,"props":1442,"children":1444},{"class":486,"line":1443},12,[1445,1450,1454],{"type":224,"tag":484,"props":1446,"children":1447},{"style":539},[1448],{"type":229,"value":1449},"        AppSettings ",{"type":224,"tag":484,"props":1451,"children":1452},{"style":502},[1453],{"type":229,"value":729},{"type":224,"tag":484,"props":1455,"children":1456},{"style":502},[1457],{"type":229,"value":1458}," new[]\n",{"type":224,"tag":484,"props":1460,"children":1462},{"class":486,"line":1461},13,[1463],{"type":224,"tag":484,"props":1464,"children":1465},{"style":502},[1466],{"type":229,"value":1467},"        {\n",{"type":224,"tag":484,"props":1469,"children":1471},{"class":486,"line":1470},14,[1472,1477],{"type":224,"tag":484,"props":1473,"children":1474},{"style":502},[1475],{"type":229,"value":1476},"            new",{"type":224,"tag":484,"props":1478,"children":1479},{"style":491},[1480],{"type":229,"value":1481}," NameValuePairArgs\n",{"type":224,"tag":484,"props":1483,"children":1485},{"class":486,"line":1484},15,[1486],{"type":224,"tag":484,"props":1487,"children":1488},{"style":502},[1489],{"type":229,"value":1490},"            {\n",{"type":224,"tag":484,"props":1492,"children":1494},{"class":486,"line":1493},16,[1495,1500,1504,1508,1513,1517],{"type":224,"tag":484,"props":1496,"children":1497},{"style":539},[1498],{"type":229,"value":1499},"                Name ",{"type":224,"tag":484,"props":1501,"children":1502},{"style":502},[1503],{"type":229,"value":729},{"type":224,"tag":484,"props":1505,"children":1506},{"style":502},[1507],{"type":229,"value":1023},{"type":224,"tag":484,"props":1509,"children":1510},{"style":528},[1511],{"type":229,"value":1512},"runtime",{"type":224,"tag":484,"props":1514,"children":1515},{"style":502},[1516],{"type":229,"value":1033},{"type":224,"tag":484,"props":1518,"children":1519},{"style":502},[1520],{"type":229,"value":747},{"type":224,"tag":484,"props":1522,"children":1524},{"class":486,"line":1523},17,[1525,1530,1534,1538,1543,1547],{"type":224,"tag":484,"props":1526,"children":1527},{"style":539},[1528],{"type":229,"value":1529},"                Value ",{"type":224,"tag":484,"props":1531,"children":1532},{"style":502},[1533],{"type":229,"value":729},{"type":224,"tag":484,"props":1535,"children":1536},{"style":502},[1537],{"type":229,"value":1023},{"type":224,"tag":484,"props":1539,"children":1540},{"style":528},[1541],{"type":229,"value":1542},"dotnet",{"type":224,"tag":484,"props":1544,"children":1545},{"style":502},[1546],{"type":229,"value":1033},{"type":224,"tag":484,"props":1548,"children":1549},{"style":502},[1550],{"type":229,"value":747},{"type":224,"tag":484,"props":1552,"children":1554},{"class":486,"line":1553},18,[1555],{"type":224,"tag":484,"props":1556,"children":1557},{"style":502},[1558],{"type":229,"value":1559},"            },\n",{"type":224,"tag":484,"props":1561,"children":1563},{"class":486,"line":1562},19,[1564,1568],{"type":224,"tag":484,"props":1565,"children":1566},{"style":502},[1567],{"type":229,"value":1476},{"type":224,"tag":484,"props":1569,"children":1570},{"style":491},[1571],{"type":229,"value":1481},{"type":224,"tag":484,"props":1573,"children":1575},{"class":486,"line":1574},20,[1576],{"type":224,"tag":484,"props":1577,"children":1578},{"style":502},[1579],{"type":229,"value":1490},{"type":224,"tag":484,"props":1581,"children":1583},{"class":486,"line":1582},21,[1584,1588,1592,1596,1601,1605],{"type":224,"tag":484,"props":1585,"children":1586},{"style":539},[1587],{"type":229,"value":1499},{"type":224,"tag":484,"props":1589,"children":1590},{"style":502},[1591],{"type":229,"value":729},{"type":224,"tag":484,"props":1593,"children":1594},{"style":502},[1595],{"type":229,"value":1023},{"type":224,"tag":484,"props":1597,"children":1598},{"style":528},[1599],{"type":229,"value":1600},"FUNCTIONS_WORKER_RUNTIME",{"type":224,"tag":484,"props":1602,"children":1603},{"style":502},[1604],{"type":229,"value":1033},{"type":224,"tag":484,"props":1606,"children":1607},{"style":502},[1608],{"type":229,"value":747},{"type":224,"tag":484,"props":1610,"children":1612},{"class":486,"line":1611},22,[1613,1617,1621,1625,1629,1633],{"type":224,"tag":484,"props":1614,"children":1615},{"style":539},[1616],{"type":229,"value":1529},{"type":224,"tag":484,"props":1618,"children":1619},{"style":502},[1620],{"type":229,"value":729},{"type":224,"tag":484,"props":1622,"children":1623},{"style":502},[1624],{"type":229,"value":1023},{"type":224,"tag":484,"props":1626,"children":1627},{"style":528},[1628],{"type":229,"value":1542},{"type":224,"tag":484,"props":1630,"children":1631},{"style":502},[1632],{"type":229,"value":1033},{"type":224,"tag":484,"props":1634,"children":1635},{"style":502},[1636],{"type":229,"value":747},{"type":224,"tag":484,"props":1638,"children":1640},{"class":486,"line":1639},23,[1641],{"type":224,"tag":484,"props":1642,"children":1643},{"style":502},[1644],{"type":229,"value":1559},{"type":224,"tag":484,"props":1646,"children":1648},{"class":486,"line":1647},24,[1649,1653],{"type":224,"tag":484,"props":1650,"children":1651},{"style":502},[1652],{"type":229,"value":1476},{"type":224,"tag":484,"props":1654,"children":1655},{"style":491},[1656],{"type":229,"value":1481},{"type":224,"tag":484,"props":1658,"children":1660},{"class":486,"line":1659},25,[1661],{"type":224,"tag":484,"props":1662,"children":1663},{"style":502},[1664],{"type":229,"value":1490},{"type":224,"tag":484,"props":1666,"children":1668},{"class":486,"line":1667},26,[1669,1673,1677,1681,1686,1690],{"type":224,"tag":484,"props":1670,"children":1671},{"style":539},[1672],{"type":229,"value":1499},{"type":224,"tag":484,"props":1674,"children":1675},{"style":502},[1676],{"type":229,"value":729},{"type":224,"tag":484,"props":1678,"children":1679},{"style":502},[1680],{"type":229,"value":1023},{"type":224,"tag":484,"props":1682,"children":1683},{"style":528},[1684],{"type":229,"value":1685},"FUNCTIONS_EXTENSION_VERSION",{"type":224,"tag":484,"props":1687,"children":1688},{"style":502},[1689],{"type":229,"value":1033},{"type":224,"tag":484,"props":1691,"children":1692},{"style":502},[1693],{"type":229,"value":747},{"type":224,"tag":484,"props":1695,"children":1697},{"class":486,"line":1696},27,[1698,1702,1706,1710,1715],{"type":224,"tag":484,"props":1699,"children":1700},{"style":539},[1701],{"type":229,"value":1529},{"type":224,"tag":484,"props":1703,"children":1704},{"style":502},[1705],{"type":229,"value":729},{"type":224,"tag":484,"props":1707,"children":1708},{"style":502},[1709],{"type":229,"value":1023},{"type":224,"tag":484,"props":1711,"children":1712},{"style":528},[1713],{"type":229,"value":1714},"~4",{"type":224,"tag":484,"props":1716,"children":1717},{"style":502},[1718],{"type":229,"value":1118},{"type":224,"tag":484,"props":1720,"children":1722},{"class":486,"line":1721},28,[1723],{"type":224,"tag":484,"props":1724,"children":1725},{"style":502},[1726],{"type":229,"value":1559},{"type":224,"tag":484,"props":1728,"children":1730},{"class":486,"line":1729},29,[1731,1735],{"type":224,"tag":484,"props":1732,"children":1733},{"style":502},[1734],{"type":229,"value":1476},{"type":224,"tag":484,"props":1736,"children":1737},{"style":491},[1738],{"type":229,"value":1481},{"type":224,"tag":484,"props":1740,"children":1742},{"class":486,"line":1741},30,[1743],{"type":224,"tag":484,"props":1744,"children":1745},{"style":502},[1746],{"type":229,"value":1490},{"type":224,"tag":484,"props":1748,"children":1750},{"class":486,"line":1749},31,[1751,1755,1759,1763,1767,1771],{"type":224,"tag":484,"props":1752,"children":1753},{"style":539},[1754],{"type":229,"value":1499},{"type":224,"tag":484,"props":1756,"children":1757},{"style":502},[1758],{"type":229,"value":729},{"type":224,"tag":484,"props":1760,"children":1761},{"style":502},[1762],{"type":229,"value":1023},{"type":224,"tag":484,"props":1764,"children":1765},{"style":528},[1766],{"type":229,"value":356},{"type":224,"tag":484,"props":1768,"children":1769},{"style":502},[1770],{"type":229,"value":1033},{"type":224,"tag":484,"props":1772,"children":1773},{"style":502},[1774],{"type":229,"value":747},{"type":224,"tag":484,"props":1776,"children":1778},{"class":486,"line":1777},32,[1779,1783,1787,1791,1795],{"type":224,"tag":484,"props":1780,"children":1781},{"style":539},[1782],{"type":229,"value":1529},{"type":224,"tag":484,"props":1784,"children":1785},{"style":502},[1786],{"type":229,"value":729},{"type":224,"tag":484,"props":1788,"children":1789},{"style":539},[1790],{"type":229,"value":638},{"type":224,"tag":484,"props":1792,"children":1793},{"style":502},[1794],{"type":229,"value":547},{"type":224,"tag":484,"props":1796,"children":1797},{"style":539},[1798],{"type":229,"value":1799},"Name\n",{"type":224,"tag":484,"props":1801,"children":1803},{"class":486,"line":1802},33,[1804],{"type":224,"tag":484,"props":1805,"children":1806},{"style":502},[1807],{"type":229,"value":1808},"            }\n",{"type":224,"tag":484,"props":1810,"children":1812},{"class":486,"line":1811},34,[1813],{"type":224,"tag":484,"props":1814,"children":1815},{"style":502},[1816],{"type":229,"value":1817},"        },\n",{"type":224,"tag":484,"props":1819,"children":1821},{"class":486,"line":1820},35,[1822],{"type":224,"tag":484,"props":1823,"children":1824},{"style":502},[1825],{"type":229,"value":814},{"type":224,"tag":484,"props":1827,"children":1829},{"class":486,"line":1828},36,[1830],{"type":224,"tag":484,"props":1831,"children":1832},{"style":502},[1833],{"type":229,"value":850},{"type":224,"tag":225,"props":1835,"children":1836},{},[1837,1839,1846,1848,1854],{"type":229,"value":1838},"The last thing to do is to assign the role Storage Blob Data Owner to the Function App. To find the resource id I needed I looked at ",{"type":224,"tag":258,"props":1840,"children":1843},{"href":1841,"rel":1842},"https://docs.microsoft.com/en-us/azure/role-based-access-control/built-in-roles",[262],[1844],{"type":229,"value":1845},"this page of the Microsoft documentation",{"type":229,"value":1847}," but I hope that in the future Pulumi will provide an ",{"type":224,"tag":232,"props":1849,"children":1851},{"className":1850},[],[1852],{"type":229,"value":1853},"enum",{"type":229,"value":1855}," or something like that with the possible values to make that easier to find and assign.",{"type":224,"tag":474,"props":1857,"children":1859},{"className":476,"code":1858,"language":478,"meta":207,"style":207},"var storageBlobDataOwnerRole = new RoleAssignment(\"storageBlobDataOwner\", new RoleAssignmentArgs\n{\n    PrincipalId = functionApp.Identity.Apply(i => i.PrincipalId),\n    PrincipalType = PrincipalType.ServicePrincipal,\n    RoleDefinitionId = \"/providers/Microsoft.Authorization/roleDefinitions/b7e6dc6d-f1e8-4753-8033-0f276bb0955b\",\n    Scope = storageAccount.Id\n});\n",[1860],{"type":224,"tag":232,"props":1861,"children":1862},{"__ignoreMap":207},[1863,1918,1925,1993,2023,2052,2077],{"type":224,"tag":484,"props":1864,"children":1865},{"class":486,"line":487},[1866,1870,1875,1879,1883,1888,1892,1896,1901,1905,1909,1913],{"type":224,"tag":484,"props":1867,"children":1868},{"style":491},[1869],{"type":229,"value":494},{"type":224,"tag":484,"props":1871,"children":1872},{"style":491},[1873],{"type":229,"value":1874}," storageBlobDataOwnerRole",{"type":224,"tag":484,"props":1876,"children":1877},{"style":502},[1878],{"type":229,"value":505},{"type":224,"tag":484,"props":1880,"children":1881},{"style":502},[1882],{"type":229,"value":510},{"type":224,"tag":484,"props":1884,"children":1885},{"style":491},[1886],{"type":229,"value":1887}," RoleAssignment",{"type":224,"tag":484,"props":1889,"children":1890},{"style":502},[1891],{"type":229,"value":520},{"type":224,"tag":484,"props":1893,"children":1894},{"style":502},[1895],{"type":229,"value":1033},{"type":224,"tag":484,"props":1897,"children":1898},{"style":528},[1899],{"type":229,"value":1900},"storageBlobDataOwner",{"type":224,"tag":484,"props":1902,"children":1903},{"style":502},[1904],{"type":229,"value":1033},{"type":224,"tag":484,"props":1906,"children":1907},{"style":502},[1908],{"type":229,"value":697},{"type":224,"tag":484,"props":1910,"children":1911},{"style":502},[1912],{"type":229,"value":510},{"type":224,"tag":484,"props":1914,"children":1915},{"style":491},[1916],{"type":229,"value":1917}," RoleAssignmentArgs\n",{"type":224,"tag":484,"props":1919,"children":1920},{"class":486,"line":709},[1921],{"type":224,"tag":484,"props":1922,"children":1923},{"style":502},[1924],{"type":229,"value":715},{"type":224,"tag":484,"props":1926,"children":1927},{"class":486,"line":718},[1928,1933,1937,1941,1945,1950,1954,1960,1964,1969,1974,1979,1983,1988],{"type":224,"tag":484,"props":1929,"children":1930},{"style":539},[1931],{"type":229,"value":1932},"    PrincipalId ",{"type":224,"tag":484,"props":1934,"children":1935},{"style":502},[1936],{"type":229,"value":729},{"type":224,"tag":484,"props":1938,"children":1939},{"style":539},[1940],{"type":229,"value":1165},{"type":224,"tag":484,"props":1942,"children":1943},{"style":502},[1944],{"type":229,"value":547},{"type":224,"tag":484,"props":1946,"children":1947},{"style":539},[1948],{"type":229,"value":1949},"Identity",{"type":224,"tag":484,"props":1951,"children":1952},{"style":502},[1953],{"type":229,"value":547},{"type":224,"tag":484,"props":1955,"children":1957},{"style":1956},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[1958],{"type":229,"value":1959},"Apply",{"type":224,"tag":484,"props":1961,"children":1962},{"style":502},[1963],{"type":229,"value":520},{"type":224,"tag":484,"props":1965,"children":1966},{"style":491},[1967],{"type":229,"value":1968},"i",{"type":224,"tag":484,"props":1970,"children":1971},{"style":502},[1972],{"type":229,"value":1973}," =>",{"type":224,"tag":484,"props":1975,"children":1976},{"style":539},[1977],{"type":229,"value":1978}," i",{"type":224,"tag":484,"props":1980,"children":1981},{"style":502},[1982],{"type":229,"value":547},{"type":224,"tag":484,"props":1984,"children":1985},{"style":539},[1986],{"type":229,"value":1987},"PrincipalId",{"type":224,"tag":484,"props":1989,"children":1990},{"style":502},[1991],{"type":229,"value":1992},"),\n",{"type":224,"tag":484,"props":1994,"children":1995},{"class":486,"line":750},[1996,2001,2005,2010,2014,2019],{"type":224,"tag":484,"props":1997,"children":1998},{"style":539},[1999],{"type":229,"value":2000},"    PrincipalType ",{"type":224,"tag":484,"props":2002,"children":2003},{"style":502},[2004],{"type":229,"value":729},{"type":224,"tag":484,"props":2006,"children":2007},{"style":539},[2008],{"type":229,"value":2009}," PrincipalType",{"type":224,"tag":484,"props":2011,"children":2012},{"style":502},[2013],{"type":229,"value":547},{"type":224,"tag":484,"props":2015,"children":2016},{"style":539},[2017],{"type":229,"value":2018},"ServicePrincipal",{"type":224,"tag":484,"props":2020,"children":2021},{"style":502},[2022],{"type":229,"value":747},{"type":224,"tag":484,"props":2024,"children":2025},{"class":486,"line":772},[2026,2031,2035,2039,2044,2048],{"type":224,"tag":484,"props":2027,"children":2028},{"style":539},[2029],{"type":229,"value":2030},"    RoleDefinitionId ",{"type":224,"tag":484,"props":2032,"children":2033},{"style":502},[2034],{"type":229,"value":729},{"type":224,"tag":484,"props":2036,"children":2037},{"style":502},[2038],{"type":229,"value":1023},{"type":224,"tag":484,"props":2040,"children":2041},{"style":528},[2042],{"type":229,"value":2043},"/providers/Microsoft.Authorization/roleDefinitions/b7e6dc6d-f1e8-4753-8033-0f276bb0955b",{"type":224,"tag":484,"props":2045,"children":2046},{"style":502},[2047],{"type":229,"value":1033},{"type":224,"tag":484,"props":2049,"children":2050},{"style":502},[2051],{"type":229,"value":747},{"type":224,"tag":484,"props":2053,"children":2054},{"class":486,"line":781},[2055,2060,2064,2068,2072],{"type":224,"tag":484,"props":2056,"children":2057},{"style":539},[2058],{"type":229,"value":2059},"    Scope ",{"type":224,"tag":484,"props":2061,"children":2062},{"style":502},[2063],{"type":229,"value":729},{"type":224,"tag":484,"props":2065,"children":2066},{"style":539},[2067],{"type":229,"value":638},{"type":224,"tag":484,"props":2069,"children":2070},{"style":502},[2071],{"type":229,"value":547},{"type":224,"tag":484,"props":2073,"children":2074},{"style":539},[2075],{"type":229,"value":2076},"Id\n",{"type":224,"tag":484,"props":2078,"children":2079},{"class":486,"line":808},[2080],{"type":224,"tag":484,"props":2081,"children":2082},{"style":502},[2083],{"type":229,"value":850},{"type":224,"tag":374,"props":2085,"children":2086},{"icon":376},[2087],{"type":224,"tag":225,"props":2088,"children":2089},{},[2090],{"type":229,"value":2091},"Because the Azure provider is auto-generated from the Azure Resource Manager APIs, it is not always obvious to figure out what object and properties we should use to implement the infrastructure we want. Hopefully, because we are using a programming language in an IDE (C# in Visual Studio in my case), IntelliSense can help us.",{"type":224,"tag":225,"props":2093,"children":2094},{},[2095,2097,2102,2104,2109],{"type":229,"value":2096},"And that's just it, with this code the Function App will go well without needing the secret connection string of the storage in the AzureWebJobsStorage setting. Everything works fine thanks to the Managed Identity, the assignment of the correct role, and the setting ",{"type":224,"tag":232,"props":2098,"children":2100},{"className":2099},[],[2101],{"type":229,"value":356},{"type":229,"value":2103},". One thing we could do is to remove the ",{"type":224,"tag":232,"props":2105,"children":2107},{"className":2106},[],[2108],{"type":229,"value":356},{"type":229,"value":2110}," setting from the configuration to observe that without it, the Function App will not work properly: for instance, we would not be able to create function keys as a storage is needed to store them.",{"type":224,"tag":225,"props":2112,"children":2113},{},[2114,2116,2123],{"type":229,"value":2115},"You can find all this code on ",{"type":224,"tag":258,"props":2117,"children":2120},{"href":2118,"rel":2119},"https://github.com/TechWatching/FunctionAppWithoutSecretConnectionString",[262],[2121],{"type":229,"value":2122},"this GitHub repository",{"type":229,"value":2124}," if you want to test it by yourself. You will also find an HttpTrigger Azure Function created from the templates in Visual Studio that I only used to have something deployed on my Function App.",{"type":224,"tag":246,"props":2126,"children":2128},{"id":2127},"how-can-we-remove-the-azurewebjobsstorage-secret-setting-using-terraform",[2129],{"type":229,"value":2130},"How can we remove the AzureWebJobsStorage secret setting using Terraform?",{"type":224,"tag":225,"props":2132,"children":2133},{},[2134],{"type":229,"value":2135},"I am a big fan of Pulumi's approach to build and deploy infrastructure but as Terraform is pretty popular for doing Infrastructure as Code, I thought it might be a good idea to explain how to solve the same issue using Terraform instead of Pulumi.",{"type":224,"tag":225,"props":2137,"children":2138},{},[2139,2141,2148,2150,2156,2158,2164,2166,2172],{"type":229,"value":2140},"Well, in fact, you can't. 🤔 Currently there is no way to remove AzureWebJobsStorage secret using Terraform. Indeed as you can see in the ",{"type":224,"tag":258,"props":2142,"children":2145},{"href":2143,"rel":2144},"https://www.pulumi.com/blog/pulumiup-native-providers/",[262],[2146],{"type":229,"value":2147},"Terraform documentation of a Function App resource",{"type":229,"value":2149}," ",{"type":224,"tag":232,"props":2151,"children":2153},{"className":2152},[],[2154],{"type":229,"value":2155},"azurerm_function_app",{"type":229,"value":2157},", the AzureWebJobsStorage setting is automatically filled based on the ",{"type":224,"tag":232,"props":2159,"children":2161},{"className":2160},[],[2162],{"type":229,"value":2163},"storage_account_name",{"type":229,"value":2165}," and ",{"type":224,"tag":232,"props":2167,"children":2169},{"className":2168},[],[2170],{"type":229,"value":2171},"storage_account_access_key",{"type":229,"value":2173}," parameters which are required. So not only you can't use the Managed Identity access to storage as we did in Pulumi but also you can't use a key vault reference for the AzureWebJobsStorage setting (see the documentation screenshot below).",{"type":224,"tag":225,"props":2175,"children":2176},{},[2177],{"type":224,"tag":284,"props":2178,"children":2182},{"alt":2179,"className":2180,"src":2181},"Azure RM provider for Terraform documentation about AzureWebJobsStorage.",[288,289],"/posts/images/functionsidentity_terraform_1.png",[],{"type":224,"tag":225,"props":2184,"children":2185},{},[2186,2188,2194],{"type":229,"value":2187},"The only possibility right now is to use an ARM template in your Terraform project thanks to the ",{"type":224,"tag":232,"props":2189,"children":2191},{"className":2190},[],[2192],{"type":229,"value":2193},"azurerm_resource_group_template_deployment",{"type":229,"value":2195}," resource but that defeats the whole point of using Terraform especially for a major resource like a Function App.",{"type":224,"tag":225,"props":2197,"children":2198},{},[2199],{"type":229,"value":2200},"In the GitHub repository of the Terraform provider for Azure RM there are 2 issues relative to this problem (do not hesitate to vote for them):",{"type":224,"tag":424,"props":2202,"children":2203},{},[2204,2218],{"type":224,"tag":428,"props":2205,"children":2206},{},[2207,2209,2216],{"type":229,"value":2208},"the ",{"type":224,"tag":258,"props":2210,"children":2213},{"href":2211,"rel":2212},"https://github.com/hashicorp/terraform-provider-azurerm/issues/8977",[262],[2214],{"type":229,"value":2215},"8977 issue",{"type":229,"value":2217}," that aims at supporting a KeyVault reference for the AzureWebJobsStorage setting",{"type":224,"tag":428,"props":2219,"children":2220},{},[2221,2222,2229],{"type":229,"value":2208},{"type":224,"tag":258,"props":2223,"children":2226},{"href":2224,"rel":2225},"https://github.com/hashicorp/terraform-provider-azurerm/issues/13240",[262],[2227],{"type":229,"value":2228},"13240 issue",{"type":229,"value":2230}," that aims at supporting the Managed Identity access to storage",{"type":224,"tag":225,"props":2232,"children":2233},{},[2234],{"type":229,"value":2235},"I guess this will be implemented someday in Terraform provider for Azure RM, so that may not be a big deal but that clearly shows the limitations of Terraform providers.",{"type":224,"tag":374,"props":2237,"children":2238},{"icon":376},[2239],{"type":224,"tag":225,"props":2240,"children":2241},{},[2242],{"type":229,"value":2243},"Because Terraform provider for Azure RM is manually implemented using the Azure SDK, it does not match Azure APIs hence not all new resources and features are available (they have to be implemented in the provider as new features in Azure are released and it can take time). It's something that is not a problem with Pulumi Azure Native provider as the SDKs are generated automatically from the Azure API specifications which makes Pulumi Azure Native provider always up-to-date.",{"type":224,"tag":246,"props":2245,"children":2247},{"id":2246},"final-thoughts",[2248],{"type":229,"value":2249},"Final thoughts",{"type":224,"tag":225,"props":2251,"children":2252},{},[2253],{"type":229,"value":2254},"I hope that after reading this article if you are working on a Function App with an AzureWebJobsStorage setting you will take the time to replace it with an access to storage through the Managed Identity of your Function. One question you could ask me is why this is not the default behavior when creating a new Function App instead of using the AzureWebJobsStorage. And that would be an excellent question... for the Azure Functions team 😀.",{"type":224,"tag":225,"props":2256,"children":2257},{},[2258],{"type":229,"value":2259},"If you did not know Pulumi before reading this article, I hope it made you want to give it a try.\nHappy learning.",{"type":224,"tag":2261,"props":2262,"children":2263},"style",{},[2264],{"type":229,"value":2265},"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":709,"depth":709,"links":2267},[2268,2269,2270,2271,2275,2276],{"id":248,"depth":709,"text":251},{"id":294,"depth":709,"text":297},{"id":319,"depth":709,"text":322},{"id":394,"depth":709,"text":397,"children":2272},[2273,2274],{"id":414,"depth":718,"text":417},{"id":450,"depth":718,"text":453},{"id":2127,"depth":709,"text":2130},{"id":2246,"depth":709,"text":2249},"markdown","content:1.posts:23.azure-functions-without-azurewebjobsstorage.md","content","1.posts/23.azure-functions-without-azurewebjobsstorage.md","md",[2283,2297],{"_path":79,"_dir":205,"_draft":206,"_partial":206,"_locale":207,"title":78,"description":2284,"lead":2285,"date":2286,"image":2287,"badge":2289,"tags":2291,"_type":2277,"_id":2295,"_source":2279,"_file":2296,"_extension":2281},"Have you ever felt a bit overwhelmed by the configuration in a project, not knowing where to look for the settings between the command line parameters, the environment variables, the configuration files in code, the configuration in Azure, ... ? When developing an ASP.NET Core application there are many places where you can put your configuration which makes it difficult to know where you should put it. Even if the official documentation about configuration in ASP.NET Core is very complete and well written, it only describes what you can use and how to use it, not what you should use and when. In this article,     I will try to answer these questions and give you my opinion about how we should use configuration providers in ASP.NET Core.","How should you use configuration providers in ASP.NET Core?","2021-09-27T00:00:00.000Z",{"src":2288},"/images/tokyo.jpg",{"label":2290},"Development",[2292,2293,2294,219],"ASP.NET Core","configuration","Azure Key Vault","content:1.posts:24.lost-in-configuration.md","1.posts/24.lost-in-configuration.md",{"_path":73,"_dir":205,"_draft":206,"_partial":206,"_locale":207,"title":72,"description":2298,"date":2299,"image":2300,"badge":2302,"tags":2304,"_type":2277,"_id":2308,"_source":2279,"_file":2309,"_extension":2281},"I recently played a bit with GitHub Actions and as I have spent some time running, again and again, my workflows to understand what was going wrong I thought it could be interesting to share what I have learned especially concerning environment variables and contexts.","2021-09-06T00:00:00.000Z",{"src":2301},"/images/github-figurine_1.jpg",{"label":2303},"Tips",[2305,2306,2307],"PowerShell","GitHub Actions","jq","content:1.posts:22.github-actions-var-and-context.md","1.posts/22.github-actions-var-and-context.md",1716749601624]