This serverless cloud workshop is adapted from the original Microsoft Cloud Workshop that was licensed under MIT and will be retired as of 6/30/2022. For the legacy offering in the original Microsoft Cloud Workshop format, review this repository
The purpose of this workshop is to continue to provide the excellent training mechanism of a cloud workshop for serverless solutions.
This workshop has been updated and enhanced to utilize .Net 6 and to teach additional concepts for serverless development. At the time of development, there are no plans to implement a WDS for this workshop, it is all hands-on work within Azure.
In your quest to learn through this workshop, you may choose to take the 'challenge' approach, or you may just complete the walkthrough. Either way, it is our sincere hope that you will learn through this process and enjoy the activities.
As this training module was adapted from an original MCW, a number of the same concepts will be applied. This training is intended for use to enhance your learning, particularly when studying for the AZ-204 exam or when you just want to become better with serverless technologies at Azure.
As Azure has a number of paths and approaches you can take, it is noted that this workshop only represents one of the possible ways to accomplish tasks with serverless solutions.
This workshop requires at least a year of experience with C# (or another OOP tech, but C# is the focus of this workshop). Additionally, you should be familiar with the concepts of relational and non-relational data, web programming, API interactions, and GitHub Actions.
In the challenge approach, the instructions will only describe the end goal, and you will need to use the references to complete the requirements.
In the guided walkthrough, the exact steps for completion of each activity will be given to you for your convenience. Even with the guided walkthrough, you can find divergence and apply skills in the manner you choose. For example, the guided walkthrough may have imperative commands in a script and you could use ARM or Bicep. Another example will be that a lot of the guides will utilize the portal. Feel free to enhance your learning by attempting to accomplish the tasks of the workshop using CLI commands or PowerShell/BASH scripts.
In this workshop, you have been hired to build a new solution in Azure using various serverless technologies. The solution has been designed by an architect, and your task is to implement the solution to specifications.
The client would like you to build a solution that allows them to upload images which may or may not contain license plates as taken from various IoT cameras at different speed checkpoints on interstates throughout a few states in the United States.
You do not need to determine anything about the speed or intent of the vehicle, the cameras and software on the IoT edge will only load photos from vehicles that are deemed in violation of posted speed limits. The photos will be loaded into an Azure storage container with private access only. Your job will be to pick up the processing from the point of blob creation in storage through identifying and capturing the license plate number.
Of course a number of photos will not be able to be read correctly. When automated processes cannot determine the license plate number, you will need to send the photo in question to a manual review process.
The manual review process should not interfere with typical processing of all photos, and should be able to be completely disconnected from the gathering process, while still interacting with the information provided by the gathering system.
At regular intervals, license plate information that is good will be exported to CSV and you will push that data into a database for use in other systems. Another process will ensure that photos that are not identified will be set for manual review.
You will use other serverless tools to automate some of the workflows and process various pieces of the solution.
The following technologies will be leveraged in this workshop:
Technology | Purpose |
---|---|
Azure Container Storage | Store Images |
Azure Event Grid | Respond to storage creation events, and utilize custom events to trigger processing |
Azure Functions | Handle Processing images from storage, export plate data, parse CSV files and push to SQL Server, get results and push to CosmosDb |
Cosmos Db | Handle the initial screening of images to store good and unknown license plate information |
Logic Apps | Send Emails, Orchestrate the processing of csv files |
SQL Server | Store the finalized data for license plates |
Service Bus | Decouple the serverless workflow from manual user interaction, queue manual plate processing |
GitHub Actions | Automate the deployment of Function Apps to Azure |
Cognitive Services | Use Optical Character Recognition from Computer Vision for images to try to read license plate data |
Computer Vision | Use Optical Character Recognition from Computer Vision for images to try to read license plates. |
Azure DataLake Storage | Typically used for BigData Storage, gain a hierarchical approach to data for csv exports |
Azure KeyVault | Utilize KeyVault to store secrets like connection strings, passwords, certificates, and encryption keys |
The architecture for serverless technologies can be overwhelming, so it's critical to have a diagram to remember how everything works together.
The following image shows the intended architecture for the solution:
Some code will be provided in any path, and sometimes you will need to generate the solutions yourself and write or use the provided code to solve the problems at hand.
There are two approaches.
- Challenge
- WalkThrough
In the Challenge approach, you will be given acceptance criteria and you must meet them to complete the challenges.
In the WalkThrough you will be given step-by-step guidance on one way to implement this solution. In the walk through, you could provision a number of resources up front, or provision them as you need them. The walkthrough will build from the ground up in a 'just-in-time' approach.
It is critical, however, that you group them in a way that allows you to easily manage this solution (typically one resource group and single region provisioning).
To complete this workshop, you should prepare your environment with the following tools:
- Visual Studio Community 2022 or better Get it here
- Visual Studio Code (optional/instead of VS2022) Get it Here
- GIT [&& GIT Bash] Get GIT here
- A GitHub Account where you can create some repositories get one here
- An active Azure subscription get a free Azure Subscription
- .Net 6 SDK get it here
- PostMan get it here
- SendGrid Account get it here
- Experiential and Experimental attitude [if something doesn't work as expected, willing to ensure you've tried everything and taken the chance to learn more while trying to fix the issue]
Note: Please understand that we can't spend time setting up your machine and getting subscriptions as the workshop has too much material to spend time on these tasks. Please try to arrive for the workshop with a machine, Azure subscription, and GitHub account that you can use from the venue WiFi.
The workshop is long, and it could save a lot of time if everyone already has an Azure subscription and GitHub wired up. Additionally, if you are using a work machine, make sure you can connect to your own private GitHub account and/or that it is ok for you to create two repositories and use your github from a free or work-provided azure subscription.
Note: For this workshop, you will use two repositories with actions. To expedite your work, you can optionally create the two repositories and get the sample applications pushed into the two repositories
- LicensePlateProcessingFunctions [Function App .NET 6]
- LicensePlateAdminSystem [App Service web app .NET 6]
Additional Note For reasons of time constraints and to help me stand up a demo environment for future workshops, I've created some bicep templates to deploy the shell of the resources, however many configurations and settings are not connected at this time, but settings are stubbed in for the function/web apps to try to expedite creation of key vault connections. If you want to deploy some or all of the resources via templates rather than via the portal, take a look in the
iac
folder. Note that the following resources will still need to be manually created:
- Cosmos DB account (there was an error in my template and I would rather be in control of the creation of the cosmos resource anyway)
- Computer Vision account (because you must agree to abide by responsible AI ethics with manual agreement in the portal)
- All Event Grid Topic and Subscription entries (don't forget to enable the Microsoft.EventGrid service provider if you are on a new subscription!)
- All secrets will need to be manually entered into KeyVault
- All configuration values will need to be updated for the function and web applications
To ensure you are set up, you could work through the documentation to create your first function in C# using the tool of your choice.
In no way, shape, or form will we be responsible for what you do with this code, nor will we make any guarantees to it's complete accuracy and correct utilization. Therefore, you agree to use what you learn here and any code at your own risk, and completely exonerate the creators and hosts of this repo from any liabilities or damages you incur from utilization of the concepts and code found in this workshop.
The main purposes for these training workshops is to help you engage with the technologies at Azure for learning and study purposes, but we also encourage any speakers to leverage this information for conference workshops and/or talks. Our only ask is that you would let us know if you decide to use this for anything so we can see that it is having a positive impact.