- Let's get started why Azure static web apps (John Papa): https://c5m.ca/aaa-ep15
- Mixed Reality QnA Bot (April): https://c5m.ca/aaa-ep16
- Why it's not working?! Investigating login Azure AD Token with Blazor WebAssembly: https://c5m.ca/stream-ep113
- ARM Series #4: Template Functions (Abel): https://c5m.ca/learn-arm-ep4
- Learning Node js: Serializing and deserializing an object to a file: https://c5m.ca/stream-ep114
Recap/ Summary of Week #30
Reading Notes #435
Cloud
- Introducing Azure CLI v2.9 with improved performance and user experience (Lomis Chen) - Awesome news more performance and quiet mode.
Programming
- How to Serve Static Files (CSS, JS, Images) in Express JS? (Digamber Rawat) - I just recently start using Express.js and it's been a joy. A very well done package. This post explains a way to structure your server for static content.
- New experimental Razor editor for Visual Studio | ASP.NET Blog (Daniel Roth) - That looks interesting... I will definitely give it a try.
- Read Configuration values in ASP.NET Core - A great little tutorial that shows a way to have different config files by environments.
- Splitting the Windows Terminal into multiple panes (Guy Barette) - Short and sweet. Quick tip about tmux.
Podcast
- Spider Web Effect on YouTube – Should you implement it now? (Your Thriving Side Hustle) - It's the second time I here Meredith talking about the "spider web effect", and I think it's a nice and honest strategy.
- Austin Evans - Tech YouTuber Starts a New Channel After 11 Years & 4.5 Million Subscribers (That Creative Life) - Just an awesome discussion between to YouTube/ content creator. How they grow and worked over the years.
- SPI 431: Is Writing Still a Viable Content Platform? Medium, Copywriting Tips, and More, with Dr. Benjamin Hardy (Smart Passive Income Podcast with Pat Flynn) - A very interesting episode talking about the written content. Is it still popular today, and a few simple strategies to help getting started.
- The DevOps Handbook - The Technical Practices of Flow (Coding Blocks) - A very long but funny and interesting episode about DevOps. They will review The DevOps Handbook, sharing some experiences, and explaining why they like dislike agree or disagree.
Recap / Summary of the week #29
Every Friday, I will share a recap of the week and at the same time a summary of my streams. Those videos are at least two hour longs, so I thought a short summary to know if topic interest you could be useful.
Useful Links:
- Stream 111 - Back to TinyBlazorAdmin: c5m.ca/stream-ep111
- Stream112 Learning Node.js for the first time: c5m.ca/stream-ep112
- 5 ways to Manage Azure Resources: c5m.ca/ep-61
- My Twitch: twitch.tv/fboucheros
- Microsoft DeveloperTwitch: twitch.tv/microsoftdeveloper
How to Manage Azure Resources
What ever you are on running on Linux, Mac or Windows that you are on the road or in the comfort of your office there is many different ways to manage your Azure resources. In this video I will show you five ways to do it and explain the pros and cons of each:
There is also an excellent Microsoft Learn module that will teach you how to use the Azure portal efficiently.
References
- Azure Portal: https://portal.azure.com
- Learn Module: https://c5m.ca/azFun-portal
- Azure PowerShell: https://c5m.ca/azPS
- Azure CLI: https://c5m.ca/azCLI
- Azure Mobile App: https://c5m.ca/azMobileApp
- Azure Cloud Shell: https://shell..azure.com
Reading Notes #434
Cloud
- One Ops Question: What are Azure Blueprints? (Pierre Roman) - For post and nice little video that gives you everything you need a clear explanation and steps to get started.
- Using External Inputs in Azure Durable functions (Damien Bod) - A very nice tutorial with all the code we need, just as we all like.
Programming
- Always Use the for…of loop to iterate in JavaScript (Dhananjay Kumar) - I thought I knew how to loop in JavaScript, apparently, I didn't.
- Exciting new updates to the Git experience in Visual Studio | Visual Studio Blog (Pratik) - Wow, that nice update. Good tools are important when moving and merging code... We don't want to make mistakes.
- Getting Started With Kubernetes: Application Basics (Sophia Parafina) - A nice second post in a series on kubernetes. Learning layer by layer.awesome.
- How to Create and Delete Branches in Visual Studio Code (Jason N. Gaylord) - Nice quick tips. I didn't know how to delete it.
Podcasts
- AsapSCIENCE - YouTubers on Building a Creative Team, USA vs Canada and the Crossover of Art & Science (That Creative Life) - Cool podcast talking about sooo many things... like sciences, politics, and hangover...
- DOs and DON'Ts of your First 100 YouTube Subscribers (Your Thriving Side Hustle) - A nice little episode about the rebranding of the podcast, and some good tips for YouTubers who, are starting their channel.
- #164 – Facing Down an Existential Threat to Your Business with Scott Keyes of Scotts Cheap Flights (The Indie Hackers Podcast) - Interesting story about how an enterprise was built and adapted to the current time in a very difficult period in its market.
- 082: Starting Your DevOps Career from Scratch (CloudSkills.fm) - Discussion questions about DevOps, answering auditor questions: how to prepare, what to expect... very interesting.
- SPI 430: Passive Income Success Story: How Jacques Hopkins Finally Made (Significant) Money Online (The Smart Passive Income Online Business and Blogging Podcast) - Amazing episode once again, about an electric engineer that became an online piano teacher and live from it happy and nicely.
Miscellaneous
- Backing up an Azure database : Algorithms for the masses - julian m bucknall (Julian M Bucknall) - Just a reference to the Azure tips and tricks, but it still very worth it. Do your backups
- Best Markdown Editor (Jimmy McBride) - Nice cool project. As a markdown user, I will definitely have a look.
- How we launched docs.github.com (Sarah Schneider) - Wow, a very interesting story, and all that in one year.Impressive.
Recap / Summary of the week #28
This is some basic, sample markdown. Every Friday, starting now, I will share a recap of the week and at the same time a summary of my streams. Those videos are at least two hour longs, so I thought a short summary to know if topic interest you could be useful.
Useful Links:
- Learning how to use a Blazor WebAssembly with Azure AD Token c5m.ca/stream-ep109
- Learning JavaScript Building Twitch chatbot c5m.ca/stream-ep110
- Demystifying ARM Templates: Parameters c5m.ca/learn-arm-ep3
- MicrosoftDeveloper Twitch channel twitch.tv/microsoftdeveloper
Reading Notes #433
Cloud
- Azure Active Directory login extensions and errors you can come across (Dominique St-Amand) - An excellent post that regroups a few problems you may encounter when using the AAD extension with your VMs.
- Dependency Injection on Azure Functions: 5 Ways Selecting Instance from Instances of Same Interface (justin Yoo) - A very complete tutorial with all the code you need.
- How to incrementally update KeyVault access policies with ARM templates (Stephane Lapointe) - A nice ARM template sample to save our time.
- Implementing Multi-region Deployment and Disaster Recovery in Azure (wely lau) - A nice series of video tutorial that covers multiple different scenarios for our disaster recovery.
Programming
- Add Storage Queue Message (Paul Michaels) - Simple but efficient storage queue wrapper class.
- Do you know the differences between var, let and const in JavaScript? (Casimir) - A great little post that explains very clearly that feature.
- How To Setup Your Local Node.js Development Environment Using Docker (Peter MCKee) - The first part of a series to create a dev environment using Docker.
Podcast
- How Design Makes The World with Scott Berkun (Hanselminutes with Scott Hanselman) - An interesting discussion about design books and how this are thought then built.
- Elise Swopes - iPhone ONLY Artist w/ an UNBELIEVABLE Portfolio (Adobe, Nike, Google AND MORE) (That Creative Life) - So much talent, inspiring podcast... WHen you remove the barriers, we can do so much.
- Digital Security for Humans with Jessy Irwin (Screaming in the Cloud) - Security is so important and this podcast will present this topic in a different and interesting way.
- 476: How to Pivot Quickly, with Steve Blank (Coaching for Leaders) - With 2020, comes a new erra of businesses... True or dare?!
- All Things Azure with Dwayne Monroe (Screaming in the Cloud) - People asked me those questions very often: Why Azure? How did you start? Dwayne's answer is excellent... Great podcast honest and true.
Miscellaneous
- You're tired because your lizard brain knows that Zoom meetings aren't natural (Scott Hanselman) - Yes its a thing, and not just because Scott said so.
- 15 Statistics You Should Know About A Career In UX Design (Ben Aston) - Interesting post that does the tour of the UX job. I wished I had that kind of information on all types of jobs back in the day. If you are considering UX its a must.
- 3 Ways to Customize Your Windows Terminal - Windows Developer Blog (Windows Developer Team) - What!? You are not using the new terminal already... simple, clean, efficient, and easy.
- Windows Terminal Preview 1.1 Release | Windows Command Line (Kayla) - Nice few updates coming our way.
Reading Notes #432
You think you may have interesting content, share it!
Cloud
- Simplifying declarative deployments in Azure (Mark Russinovich) - Great new features that will speed up and simplify our writing time.
Programming
- Parse Markdown Front Matter With C# (Khalid Abuhakmeh) - A nice post that shows the code to parse a Jekyll blob post file in c#
- Learning and relearning Docker commands (Mark Downie) - A nice short post that lists common commands.
- Run Azure Container Instances from the Docker CLI (Thomas Maurer) - Wow, that kind of crazy cool! Pulling and a container instant directly from the native CLI...I love it.
- Using the Blockly visual programming editor to call a .NET Core WebAPI (Scott Hanselman) - Really cool open source project on GitHub.
Podcasts
- 205: Monetization (Merge Conflict) - Nice discussion about the ads in an APP, why we want them why we don't...
- #44: Jen Looper - Women in Tech and Developer Evangelism (The Solo Coder Podcast) - Another great episode of Solo Coder. This time I new the guest, but nevertheless I learn something.
- How to Think Like a Boss with Kate Crocco (Influencer Entrepreneurs with Jenny Melrose) - Creating, building feeling good in a business while being a parent is hard.
- .NET Multi-Platform App UI with Scott Hunter (.NET Rocks!) - Great episode that summarize, tease, and share about everything dotnet.
- 081: Microsoft Certified DevOps Engineer (AZ-400) (CloudSkills.fm) - After the revamping of the exams, it was very interesting to ear about Az400. I like DevOps, so that an exam on that path.
- Inside Doist - The Bootstrapped Market Leader (Software Engineering Unlocked) - A very interesting discussion with a an great creator.
Books
![]() |
| Add caption |
Author: Kathy Sierra
ISBN: 9781491919019
I took me about one year to read that book. Way longer then it should. It was a good book and it is really easy to read. Maybe it's the fact that it was a "real" book and not in my kindle? But I think it was the format. This book look like a comic book with a director cut. There those little story bubbles and there is the text. The content is amazing, but I felt like I was always losing the vibe while transitioning to the text, or the bubbles.
However, the book is really great
Reading Notes #431
Every Monday, I share my "reading notes". Those are a curated list of all the articles, blog posts, podcast episodes, and books that catch my interest during the week and that I found interesting.
It's a mix of the actuality and what I consumed.
You think you may have interesting content, share it!
Cloud
- 5 Things to Know about Serverless in 2020 (Andrew Tunall) - Interesting post about Lambda services.
- Hosting Blazor Web Assembly App on Azure Static Web App (Justin Yoo) - Very interesting post with a lot of information and great code examples.
- Hosting Blazor WebAssembly in Azure Static Web Apps (Preview) (Tim Heuer) - Another great post that explores the possibilities of using Blazor web assembly with some C# Azure functions inside the new Azure Static Web App.
Programming
- Getting Value from appsettings.json in .NET Core (Jeetendra Gund ) - Nice little quick tutorial the read values in an MVC structured app.
- Building a notifications client with Xamarin and Azure (Laurent Bugnion) - A very nice post that describe how Laurent started to build his cross platforms tools. Sharing the gotchas and a few tips along this first post of the series.
Databases
- Which Database should I use in my Azure Serverless App? (Mark Heath) - Nice overview of the type of data storage in Azure.
Miscellaneous
- 7 principles for modern tech leaders (William Peachey) - Nice post about the evolution of roles in our field of expertise and what could/ should be a a leader roles.
- Do I need to code in my free time to be a good developer? (Maxim Chechenev) - Interesting point of view about a trend. I personally think the answer is not yes or no... But its depends or it required more details.
Reading Notes #430
Cloud
- Introducing live video analytics from Azure Media Services—now in preview | Azure blog and updates | Microsoft Azure (Milan Gada) - Interesting new azure services and IoT.
Programming
- 7 Essential Best Practices to Follow When Adopting a DevOps Model (Gregory Chapman) - A nice reflection about devops and the impact it will have on your teams.
- Easily rename your Git default branch from master to main (Scott Hanselman) - So simple why not doing it!?
- How To Detect Unsupported Browsers Under a Blazor WebAssembly Application? (Wael Kdouh) - Oh I love it. Simple and efficient!
Podcast
- Episode 51 - Extensions, Home automation and Remoulade sauce with Mads Kristensen (Coding After Work Podcast) - And awesome episode with the legend... Creator of so many extensions.
- Testing Blazor Apps with Egil Hansen (.NET Rocks!) - A very interesting episode about a unit testing framework build by the community for Blazor!
- Gerald Undone - MAJOR Gear Talk: Custom PCs, Sony vs Canon and Cinema Cameras (That Creative Life) - Two greate creator met again to talk cameras, laptop, and some much good stuff.
- Red Teaming with Leron Gray (Hanselminutes with Scott Hanselman) - A quite interesting episode about playing the bad guys for the good cause. I enjoyed each second of this episode. I new those them existed, but it's great to learn more about them.
- Baking Bread with Eric Wolfinger (Wild Ideas Worth Living) - I've been doing my bread for probably fifteen years, and just recently start messing around with sourdoughs... I'm not crazy.. Making bread is both simple and complex... and of course so fun.
Miscellaneous
- My Windows Terminal Color Schemes (Thomas Maurer) - Cool windows terminal themes.
- The idea that making code open-source won't cost a company anything (Matt Lacey) - Totally agree maintaining a project open source or not required time and effort... Therefore cost money.
Reading Notes #429
Suggestion of the week
- Git Tag Based Released Process Using GitHub Actions (Calvin A. Allen) - An awesome tutorial to deploy automatically IF certain conditions are met. Plus we got the yaml file.
Cloud
- Building an Azure Static Web App With GraphQL | LINQ to Fail (Aaron Powell) - Oh! Interesting... Reading this you probably, like me, missed the live version. But there is always the video on demand.
Programming
- Download a whole YouTube Playlist at one go - DEV Community 👩💻👨💻 (Trideep Barik) - Nice little python tutorial to automate tasks.
- GitKraken Git GUI How-To: Add & Remove Files (Calvin A. Allen) - Nice post that describes some very useful operation on git using the graphic interface provided by Git Kraken.
- Login and use an ASP.NET Core API with Azure AD Auth and user access tokens (Damien Bowden) - Nice tutorial to use Azure AD between an Asp.Net App and an API.
- OAuth 2.0 with GitHub in ASP.NET Core - Simple Talk (Diogo Souza) - A nice tutorial that guides us in a complex world.
- Remote Debugging .NET Containers (Karol Deland) - A nice tutorial that explains clearly first the difference between remote and local debugging and then explains how to do it.
- Using MongoDB With ASP.NET Core Web API (Munib Butt) - A great tutorial from .Net Core to Mongo in a snap
Podcast
- Social Friendships and Internet Creativity with Cassidy Williams (Hanselminutes with Scott Hanselman) - A refreshing episode, simple and true. Isn't it the base of a real friendship?!
- 472: How to Run an Online Meeting, with Bonni Stachowiak (Coaching for Leaders) - I'm always surprised and a bit disappointed when I realize that this topic or those best practices are not well known. An episode to share :)
Miscellaneous
- Screen Sharing with an Ultrawide Monitor (Kenny Lowe) - Really interesting post.As I think about getting a new screen and heard bad experiences sharing ultrawide screens this look like a nice solution.
Book
Vlog Like a Boss - How to Kill It Online with Video Blogging
Author: Amy Schmittauer Landino
An interesting book that shares the best practices about making videos today. How to plan, record, edit... What to do and not do. A quick, direct to the point and complete tutorial to get started. This book was done like today's videos.
~enjoy.
Reading Notes #428
Every Monday, I share my "reading notes". Those are a curated list of all the articles, blog posts, podcast episodes, and books that catch my interest during the week and that I found interesting.
It's a mix of the actuality and what I consumed.
You think you may have interesting content, share it!
Cloud
- Azure AD Secured Serverless Cosmos DB from Blazor WebAssembly ( Jeremy Likness) - Great post that really explains how those pieces can work very well together.
- Creating an Azure Function from the Command Line (Jason N. Gaylord) - A nice tutorial that helps us to get started.
Programming
- Multiple Environments in ASP.NET Core (Code Maze) - Nice Asp.Net MVC tutorial.
- ASP.NET Core Series: Blazor (Jeremy Likness, Dan Roth) - Nice video to get started with Blazor.
- Developing on Docker with the new and improved Visual Studio Container Tools (and WSL2) (Scott Hanselman) - A great example that shows how easier it is now to start working with containers on Windows.
- Unit Testing in ASP .NET Core 3.1 (Shahed C) - A nice post that shows how to get started with xUnit the voted most popular test framework.
Miscellaneous
- APIs in the 2020s Panel (.NET Rocks!) - A virtual panel of awesome speakers that talked about API, REST, GraphQL, oData and so more. Lovely episode.
- 471: How to Say No Without Saying No, with Lois Frankel (Coaching for Leaders) - Saying No... being open. Really interesting topic. I put Lois Frankel: Nice Girls Don’t Speak Up or Stand Out in my to read list, that book maybe written for women in mind, but I think it is really interesting.
- Leveraging Our Emotional Goals (Developer Tea) - An interesting episode that talk about goals and what we need to do (or not) to achieved them.
- 203: Updating Open Source Projects (https://castbox.fm/episode/203%3A-Updating-Open-Source-Projects-id2117504-id267802246) - As I just create my first version in one of my open-source project I found the topic more than interesting... Thank you, great show.
Miscellaneous
- 20 productivity tools for the Linux terminal (Alan Smithee) - Cool app to try for our terminal.
- How to Stop Windows 10 Updates (5 Methods) (Mohammed Siddiqui) - I think you should only prevent auto-update when you really know what you are doing. Updates are easy to forget and therefore your PC could be at risk. That said, sometime it could really be a must.5misc.windows.update]
- Mirroring your Presence Status from the Microsoft Graph in Teams to LIFX or Hue bias lighting (Scott Hanselman) - Did this post just created new needs?! And you should check the keynote video linked to this post it was really a good one.
Books
The Impossible First: From Fire to Ice—Crossing Antarctica AloneAn incredible adventure yes around the globe, but more important over the personal limits. I found this book very inspiring. I felt following him across the Antarctica... In the blizzard or in those deep moment. Great memoir, great adventure.
Reading Notes #427
It's a mix of the actuality and what I consumed. As you will quickly see This week is heavily tinted by the Microsoft Build event. I still have tons of videos to watch since I was was busy monitoring the chat during most of the performances.
You think you may have interesting content, share it!
Cloud
- 10 Tips for Building and Deploying Hugo Websites on Azure Static Web Apps (Jason Hand) - A very nice blog post that shares tons of gotcha and will make you save a ton of time.
- Deploy Blazor WebAssembly apps to Azure Static Web Apps (Christopher Maneu) - That seems really cool and easy.... Very interesting.
- Getting Started with Azure Static Web Apps (Dan Wahlin) - Another great post that helps us to get started with the new SWA announced earlier this week.
- I Built a Simple Serverless Storage Solution (Eldad Bercovici) - Pretty cool personal project and definitely useful.
- Static Web Apps - First Look (John Papa) - Awesome get started blog post about the new SWA.
Programming
- Blazor WebAssembly 3.2.0 now available | ASP.NET Blog (Daniel Roth) - Finally here, I mean officially since it was available for many months. It's now more than ever time to start playing.
- Using Visual Studio Codespaces with .NET Core | .NET Blog ( Tim Heuer) - Codespace can simplify so much your dev or testing experience!
Podcast
- Chocolatey with Rob Reynolds (.NET Rocks!) - Awesome episode talking about all the good and the great of Chocolatey that awesome package manager.
- A path to technical leadership with Keavy McMinn (Hanselminutes with Scott Hanselman) - Because the most interesting path are more then often not the straight one... Great talk about the choice we make in our lives...
- #41: Scott Hanselman - A Few Minutes of Wisdom and Technology [S02-E20] (The Solo Coder Podcast) - Just great. Yeah, listen to it... I just wish it was longer ;p
Miscellaneous
- What’s New in Microsoft Teams | Build Edition 2020 - A lot of nice new features added to Teams. Looking forward to try them.
- Windows PowerToys FancyZones is the essential window manager for Windows 10 (Scott Hanselman) - In this short post Scott gives more details about how he was managing his windows during MS Build and how you can also do it.
Reading Notes #426
It's a mix of the actuality and what I consumed. You think you may have interesting content, share it!
- Free Certs for Azure App Services (Mark Downie, Ray Fan) - Marvelous! Perfect timing. All documented, a nice step by step.
- May 2020 Azure SDK Release (@Adrian Hall) - Nice new update coming on the Azure SDK.
- Migrate to Azure: Save now, be future ready (Julia White) - Nice little post that explains some reasons to migrate to the cloud and gives a few links to get started.
Programming
- Different ways to host Blazor WebAssembly (Wasm) (Tim Heuer) - A really interesting post with a lot of little gems.
- Announcing Blazm (Grid component) (Jimmy Engström) - Nice I think I just found the grid I was looking for...
- Git Branching Strategies (Chris Ayers) - Nice post that describes 3 popular solutions base on your teams' skills and experience.
Podcasts
- Making Docker lovely for Developers with Simon Ferquel (Hanselminutes with Scott Hanselman) - Incredibly interesting podcast episode where they discuss about Docker on Windows. How it was working before and how it works with WSL2. A must.
- SPI 422: Email Marketing Audit: Which of These Email Marketing Strategies Are You Actually Doing? (The Smart Passive Income Online Business and Blogging Podcast) - I don't have an email list, I don't have anything to sell. However, sometimes I wish I had one to share some event coming, or new videos/post/live... I really like the respectful approach.
- 5 Reasons It's Better to Be A Small Streamer - Twitch Tips (Stream Coach: Twitch Stream Tips | Partner Interviews | Pro Advice) - A nice episode that list some advantages of being a smaller streamer. I've been streaming for one year now, I'm pretty happy with my journey, learned a lot, and still learn so much. I don't feel disadvantaged, but that's maybe just because I don't really focus on growth.
- 469: See What Really Matters, with Greg McKeown (Coaching for Leaders) - Nice episode that talks about the essential, how to find it, how to not pass over it. Very interesting. The book, Essentialism, from seems interesting too... And hop! On the to-read list.
Miscellaneous
- Whiteboarding for Developers: Yes, You Have To ( Chris Gustafson) - An excellent post that will help you to remember why whiteboarding is important. It will also provide nice guidance to restart doing it efficiently.
- Why to OneNote instead of Whiteboard? (Vesa Nopanen) - I love OneNote ...but strangely never draw inside of it... I'll definitely give it a try.
Reading Notes #425
It's a mix of the actuality and what I consumed. You think you may have interesting content, share it!
Cloud
- Configuring Azure Services and emulators using Visual Studio (Angelos Petropoulos) - Pretty nice feature coming up our way in Visual Studio.
Programming
- New from Satellite 2020: GitHub Codespaces, GitHub Discussions, securing code in private repositories, and more (Shanku Niyogi) - If like me you missed this amazing event, this post is a nice recap.
- All about Github Satellite 2020 - Codespaces, Discussions & More (Saad) - Another great summary of the GitHub event.Nice.
- Is Asynchronous The Best Way To Go in ASP.NET Core? (David Grace) - Awesome post that explains very clearly the difference between the two types of processes.
- Working with GitHub Issues in Visual Studio Code ( Alex Ross) - A very interesting extension. I will need to check that one.
Shameless Plugs
- How to make your deployment simple and flexible with nested Azure Resource Manager (ARM) template (Frank Boucher) - Short video that explains how you can deploy all the pieces of a solution individually, or altogether without writing more deployment. They're also a blog post if you prefer, all links are in the description.
Podcast
- 070: Securing DevOps in the Cloud (CloudSkills.fm) - Great episode talking about security yes but also best practices and to change mindsets. Love it.
- Running a successful dev shop with Martin Gratzer (Software Engineering Unlocked) - This show is one of my new favorites. Always interesting and very dynamic. This time it was about the hard reality of "dev shop". Very interesting, so true!
- The Overreaction Paradox (Developer Tea) - I never thought about it that way... But it's so true. Are we celebrating the wrong things?
- #34: Michael Jolley - The Fresh Prince of Live Coding [S02-E13] (The Solo Coder Podcast) - Okay, I'm a total fanboy of Michael... but how can you resist?! If you feel the passion inside you... Don't way, share, create, enjoy! Another great episode.
- 197: I Need a Website (Merge Conflict) - They got me 50% of the time... I think they are talking to me: 'Frank we are ....'. Nice episode sharing some dreams about a perfect tool (aka website) for apps developers.
Simplify your deployment with nested Azure Resource Manager (ARM) templates
Most solutions, if not all, are composed of multiple parts: backend, frontend, services, APIs, etc. Because all parts could have a different life-cycle it's important to be able to deploy them individually. However, sometimes we would like to deploy everything at once. It's exactly the scenario I had in a project I'm working on where with backend and one frontend.
In this post, I will explain how I use nested Azure Resource Manager (ARM) templates and conditions to let the user decide if he wants to deploy only the backend or the backend with a frontend of his choice. All the code will be available in GitHub and if you prefer, a video version is available below.
(This post is also available in French)
The Context
The project used in this post my open-source budget-friendly Azure URL Shortener. Like mentioned previously the project is composed of two parts. The backend leverage Microsoft serverless Azure Functions, it a perfect match in this case because it will only run when someone clicks a link. The second part is a frontend, and it's totally optional. Because the Azure Functions are HTTP triggers they act as an API, therefore, they can be called from anything able to do an HTTP call. Both are very easily deployable using an ARM template by a PowerShell or CLI command or by a one-click button directly from GitHub.
The Goal
At the end of this post, we will be able from one-click to deploy just the Azure Functions or to deploy them with a frontend of our choice (I only have one right now, but more will come). To do this, we will modify the "backend" ARM template using condition and nest the ARM template responsible for the frontend deployment.
The ARM templates are available here in there [initial](https://github.com/FBoucher/AzUrlShortener/tree/master/tutorials/optional-arm/before) and [final](https://github.com/FBoucher/AzUrlShortener/tree/master/tutorials/optional-arm/before/after) versions.
Adding New Inputs
We will nest the ARM templates, this means that our backend template (azureDeploy.json) will call the frontend template (adminBlazorWebsite-deployAzure.json). Therefore we need to add all the required information to
azureDeploy.json to make sure it's able to deploy adminBlazorWebsite-deployAzure.json successfully. Looking at the parameter required for the second template, we only two need values AdminEMail and AdminPassword. All the other can be generated or we already have them.We will need also another parameter the will act as our selection option. So let's add a parameter named
frontend and allowed only two values: none and adminBlazorWebsite. If the value is none we only deploy the Azure Function. When the value is adminBlazorWebsite we will deploy the Azure Function, of course, but we will also deploy an admin website to go with it.Following the best practices, we add clear detail and add those three parameters in the parameters section of the ARM template
"frontend": {
"type": "string",
"allowedValues": [
"none",
"adminBlazorWebsite"
],
"defaultValue": "adminBlazorWebsite",
"metadata": {
"description": "Select the frontend that will be deploy. Select 'none', if you don't want any. Frontend available: adminBlazorWebsite, none. "
}
},
"frontend-AdminEMail": {
"type": "string",
"defaultValue": "",
"metadata": {
"description": "(Required only if frontend = adminBlazorWebsite) The EMail use to connect into the admin Blazor Website."
}
},
"frontend-AdminPassword": {
"type": "securestring",
"defaultValue": "",
"metadata": {
"description": "(Required only if frontend = adminBlazorWebsite) Password use to connect into the admin Blazor Website."
}
}
Nested Templates
Let's assume for now that we always deploy the website when we deploy the Azure Function, to keep things simple. What we need now is to used nested ARM template, and that when you deploy an ARM template from inside another ARM template. This is done with a
Microsoft.Resources/deployments node. Let's look at the code:{
"name": "FrontendDeployment",
"type": "Microsoft.Resources/deployments",
"dependsOn": [
"[resourceId('Microsoft.Web/sites/', variables('funcAppName'))]",
"[resourceId('Microsoft.Web/sites/sourcecontrols', variables('funcAppName'), 'web')]"
],
"resourceGroup": "[resourceGroup().name]",
"apiVersion": "2019-10-01",
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "[variables('frontendInfo')[parameters('frontend')].armTemplateUrl]"
},
"parameters": {
"basename": {
"value" : "[concat('adm', parameters('baseName'))]"
},
"AdminEMail": {
"value" : "[parameters('frontend-AdminEMail')]"
},
"AdminPassword": {
"value" : "[parameters('frontend-AdminPassword')]"
},
"AzureFunctionUrlListUrl": {
"value" : "[concat('https://', reference(resourceId('Microsoft.Web/sites/', variables('funcAppName')), '2018-02-01').hostNames[0], '/api/UrlList?code=', listkeys(concat(resourceId('Microsoft.Web/sites/', variables('funcAppName')), '/host/default/'),'2016-08-01').functionKeys.default)]"
},
"AzureFunctionUrlShortenerUrl": {
"value" : "[concat('https://', reference(resourceId('Microsoft.Web/sites/', variables('funcAppName')), '2018-02-01').hostNames[0], '/api/UrlShortener?code=', listkeys(concat(resourceId('Microsoft.Web/sites/', variables('funcAppName')), '/host/default/'),'2016-08-01').functionKeys.default)]"
},
"GitHubURL": {
"value" : "[parameters('GitHubURL')]"
},
"GitHubBranch": {
"value" : "[parameters('GitHubBranch')]"
},
"ExpireOn": {
"value" : "[parameters('ExpireOn')]"
},
"OwnerName": {
"value" : "[parameters('OwnerName')]"
}
}
}
}
If we examine this node, we have the classic: name, type, dependsOn, resourceGroup, apiVersion. Here We really want the Azure Functions to be fully deployed so we need the FunctionApp to be created AND the GitHub sync to be complete, this is why there is also a dependency on
Microsoft.Web/sites/sourcecontrols.In properties we will pass the mode as Incremental as it will leave unchanged resources that exist in the resource group but aren't specified in the template.
Learn more about the Azure Resource Manager deployment modes here as they are very powerful.
The second property is templateLink. This is really important as it's the URL to the other ARM template. That URI must not be a local file or a file that is only available on your local network. You must provide a URI value that downloadable as HTTP or HTTPS. In this case, it's a variable that contains the GitHub URL where the template is available.
Finally, we have the parameters, and this is how we pass the values to the second template. Let's skip those where I just pass the parameter value from the caller to the called, and focus on basename, AzureFunctionUrlListUrl, and AzureFunctionUrlShortenerUrl.
For basename I just add a prefix to the parameter basename received, this way the resource names will be different but we can still see the "connection". That's purely optional, you could have added this value in a parameter to
azureDeploy.json, I prefer keeping the parameters a minimum as possible as I think it simplifies the deployment for the users.Finally for AzureFunctionUrlListUrl, and AzureFunctionUrlShortenerUrl I needed to retrieve the URL of the Azure Function with the security token because they are secured. I do that by concatenating different parts.
| Component | Value |
|---|---|
| Beginning of the URL | 'https://' |
| Reference the Function App, return the value of hostname | reference(resourceId('Microsoft.Web/sites/', variables('funcAppName')), '2018-02-01').hostNames[0] |
| Specify the Function targeted in this case UrlList. And starting the querystring to pass the code (aka. security token) | '/api/UrlList?code=' |
Using the new listkeys function to retrieve the default Function key. | listkeys(concat(resourceId('Microsoft.Web/sites/', variables('funcAppName')), '/host/default/'),'2016-08-01').functionKeys.default |
Conditional parts
Now that the second ARM template can be deployed, let's add a condition so it gets, indeed, deploy only when we desire. To do this it's very simple, we need to add a property
condition.{
"name": "FrontendDeployment",
"type": "Microsoft.Resources/deployments",
"condition": "[not(equals(parameters('frontend'), 'none'))]",
"dependsOn": [
"[resourceId('Microsoft.Web/sites/', variables('funcAppName'))]",
"[resourceId('Microsoft.Web/sites/sourcecontrols', variables('funcAppName'), 'web')]"
]
}
In this case, is the value of the parameter is different then none, the nested template will be deployed. When a condition end-up being "false", the entire resource will be ignored during the deployment. How simple or complex are your conditions... that's your choice!
Happy deployment. :)
Reading Notes #424
Suggestion of the week
- Microsoft Build 2020 registration is not only open, it's FREE, it's LIVE, it's VIRTUAL, and it is all FOR YOU (Scott Hanselman) - Amazing news right?! Who doesn't needs some good news... I will see you there!
Cloud
- Microsoft’s Making Azure AD SSO “Free” (Brad Sams ) - That's an excellent news Azure Active Directory for everyone!
Programming
- Blazor WebAssembly 3.2.0 Release Candidate now available (Daniel Ruth) - We are getting closer now... I didn't have the time to try the last preview!
- Announcing Entity Framework Core 5.0 Preview 3 | .NET Blog (Jeremy Likness) - Awesome I'm looking forward to trying the final version. But in the meantime... why not try it.
- Blazor - Changing the title without JavaScript (Jimmy Engström) - A nice tutorial that shows how to go over certain boundaries in Blazor.
- Clean Coding in C# - Part I (Calvin A. Allen) - A great little post packed with 200% of wisdom.
- How to Integrate Unit Testing with ASP.NET Core 3.1 (Vijayaraj Angappan) - A very clear tutorial that explains how to use Moq and NUnit 2 great tools.
- Markdown .NET Core Library (Jason N. Gaylord) - That looks nice! And it's in .Net!
- Tips, tricks, hacks, and secrets from Alyson La (Alyson La) - A nice little list of pro tips...perfect to get started, or push forward if you are already a git user.
Podcasts
- 465: How to Lead a Virtual Team, with Susan Gerke (Coaching for Leaders) - Nice show. It doesn't matter if you are a manager or just that you work in a remote team, there nice tips.
Miscellaneous
- Visual Studio Codespaces (Nik Molnar) - I really like the new name I think it says more about what it is. And seriously how can I not like the new price! Less than 2$/day for a machine!













