The scope of Microsoft Azure is massive in terms of huge number of solutions that it offers, number of features that it offers, the number of functions that it encompasses and so on. For me one of the biggest challenge was to simply get my head around all the new product names as well as all the new terminology, all the new concepts and how it all interrelates to one another. Every Microsoft Azure service and every feature that Microsoft implemented is there for a specific reason. It is there to address a common business problem or a common IT problem. For an example, let’s start with a common public facing website scenario. Let’s say it is an eCommerce website where I am selling books. At a bare minimum, every web application is going to need a web server that will host the web application. It is going to need a place to store data. To improve the performance, we need to cache parts of the application. I need to add a blog as it is not already a part of the application. I don’t need to create that blog by myself. I should just be able to point a sub domain to a WordPress blog. I want a content delivery network that can ensure that assets like images are available around the globe as quickly as possible wherever somebody’s requesting them.
I will need a backup and a disaster recovery plan. I will need a scaling strategy, a way to handle seasonal traffic, heavy traffic or unexpected spike in traffic without having to maintain hardware. I am going to want to monitor the performance of the web application on the hardware to decide when it’s time to scale. I want some good logging support and a way to collect telemetry about a user session to determine what exactly went wrong for them. So, that’s a very basic set of features that I am going to need but depending on the application, I might also need a way to manage logins, authentication for web applications so ideally it would support something like multi-factor authentication. It will enable users to create accounts using their existing social logins like Facebook, Twitter etc. To reduce the friction in signing up for the web site, I might prefer to authenticate and authorize using existing investments that I already have in active directory. I might need a way to guarantee that the users’ input won’t be lost as they attempt to save it into my database. Even under tremendous load I don’t want a users’ purchase to be lost. So, I am going to want to write to the database and make sure that it does not slow the database and application down.
I want a way to expose web services to my partners so that they can build on top of my platform and extend my reach. And maybe from a more strategic perspective I will need to take all the metrics that I gather about site usage, about what people are hovering their mouse cursors over, what are the customers’ geographical locations, what products are getting views but not sales. I want to take all that data to predict customer behavior for future demand of certain products and certain services. That is the web scenario. There’s also the mobile development scenario. I may need to expose a set of publicly available web services that are consumed by mobile or desktop clients, even IOS or Android. From an enterprise perspective, I want to be able to quickly provision new machines and data storage mechanisms as needed to keep with the changes in my business. I should be able to quickly configure those newly provisioned machines. Let’s assume they are virtual machines. Here also I am going to need off site backups and a failover strategy for my applications. I want my users around the globe to access the servers and the network resources in a secure manner. That’s from enterprise perspective.
From a developer perspective, as a team lead I want my team to use Agile processes to match requirements to monitor the progress of those assignments, to track any change requests that come in, to track issues and to provide reporting to the team and to the upper management. I need a development and staging strategy for changes in application so that I can deploy them, test them, then deploy them and make them available to the public. You can fulfill every requirement mentioned above through Azure. As you can see there are an enormous number of Azure service offerings. If there is a business-related technology need, it probably can be addressed by some Azure services. Now, the real problem is not having many options but which of these options do I choose for my specific situation. It depends on how much responsibility and how much control that I really need. There are three basic levels of control and responsibility that you can choose in most cases. They are Infrastructure as a Service(IaaS), Platform as a Service(PaaS) and Software as a Service(SaaS). If you need full control and you are willing to take all the responsibility that comes with essentially owning that server, that includes patches, maintenance, installing the software and etc. These are usually in the form of virtual machines that you can manage down to the last detail. So, Azure services used in this capacity are known as Infrastructure as a Service or IaaS. If you want to build on top of Microsoft Azure platform of developer friendly APIs and you want to let Microsoft to manage other areas, then in Azure you will go with Platform as a Service or PaaS.
There are applications that have been configured and deployed from Microsoft or from other third party vendor and all you need to do is creating an account for yourself. In this case, you have almost no responsibilities inside of that system. You don’t have to patch or maintain anything. You don’t even have to worry about maintaining the actual software itself. But you also have no control either. So, in this scenario you typically term that as software as a service or SaaS. This is also like owning your own car versus renting out a car versus hiring a taxi. You get to choose the right mix from a system and an application architecture perspective and from a cost perspective and from a maintenance perspective and so on. Do I want to keep some of these pieces in house and only delegate some of the responsibilities up to some Azure services or do I want to load it all up there? You can mix and match as you will.