What is "the cloud?"
Recently, I had the great opportunity to speak on Azure Storage at the North Dallas .NET User Group in Dallas, Texas to a group of about 60 developers. Before I begin a session I always like to open up with a question in order to both get the audience’s attention and gauge their knowledge level with the material that I’m about to cover.
“By a show of hands, how many out there are currently using Azure?”
As I expected one or two hands went up.
“How many of you are currently using any kind of cloud platform be it Azure, Amazon Web Services or Rackspace?”
This time, I saw four or five hands.
“OK. How many of you have heard about ‘the cloud’ and would like to know what it’s all about?”
Almost every person in the room raised their hand. I think that the majority of the software development community is in the same position. Honestly, it’s where I was a year ago. I think this is a question that is not asked nearly enough because of a variety of reasons. I think a lot of developers are embarrassed to admit that they have no idea what it is. It’s a shame, too, because, leveraged properly, the cloud has the power to revolutionize the way that we think about building and deploying software. Just like any tool in our industry, the more that developers know about it the more that they can leverage it to build awesome software.
The confusion around this emerging technology is completely intentional and finds its roots in the very word “cloud.” The word itself is ethereal. It’s actively marketed as a magical place where you can host your applications, data and, well, just about anything all without having to worry about the restrictions of scalability, security and space that we’ve all become accustomed to over the years. However, there is more to the cloud than a clever buzzword. Much more.
In its physical form, at least from a public perspective, the cloud is primarily a collection of cloud providers, mainly Microsoft’s Azure, Amazon Web Services and Rackspace’s Open Cloud and their network of massive dedicated data centers sprinkled across the globe. These are no normal data centers. These data centers span hundreds of acres, are extremely modular and, besides a proportionally small group of on-site administrators, are largely autonomous. These ginormous data centers are further scaled out by rolling into place and installing specially configured shipping containers loaded with servers and independent power and environmental systems. This is the man behind the curtain. In the physical sense, “the cloud” is almost a misnomer. There are actually many clouds. In the logical sense, “the cloud” is the network that allows you to share resources between these different providers and on-premises systems.
The difference between the cloud and traditional “brick and mortar” data centers can be boiled down to the difference between products and services. Ten years ago “scaling out” involved purchasing and installing physical hardware. It was expensive and, for many organizations, mired down in bureaucracy. It was the antithesis of agile. It involved purchasing licenses for operating systems, middleware and other server software. It involved building data centers and hiring a staff of administrators to maintain those data centers. All of these things are physical products that must be purchased or leased and, unfortunately, tend to depreciate in value over time.
In recent years the enterprise has moved further and further toward virtualization. With virtualization developers can spin up and shut down cheap virtual server instances in order to accomplish very specific goals. Instances are no longer synonymous with the hardware that they run on. This is a big step in the right direction but the responsibility of purchasing, maintaining and dealing with the ROI associated with the physical hardware still falls on the shoulders of the enterprise. Moving this infrastructure to the cloud is the next logical step.
With the cloud, servers (IaaS), platforms (PaaS) and software (SaaS) are all exposed as services. From the perspective of the consumer everything is virtual which means that, besides the cost of using these cloud services, your ability to scale out is limited only to the physical limitations of the massive data centers that power the public cloud. There is no physical hardware to purchase and maintain. You pay only for what you use. With the cloud, this means paying for hard drive space that you consume within these data centers, often measure in fractions of cents, and the physical clock time that you have virtual machine instances running. This is an incredibly powerful advantage when it comes to enterprise computing and a major step forward in how we as developers and IT professionals think about infrastructure.
Imagine being able to spin up not just virtual machines but entire environments complete with load balancers, databases and storage instantly without having responsibility over any physical hardware. Imagine being able to spin up these environments automatically as part of a test script. Even further, imagine being able to seamlessly interconnect resources in the cloud with on-premises hardware. Whereas in the past any of these things would have no doubt involved an endless chain of purchase orders, approvals and work orders they can now be accomplished with a small shell script. This is why the cloud is so important.
Cloud services can be divided into three different discrete categories: Infrastructure as a Service or IaaS, Platform as a Service or PaaS and Software as a Service or SaaS. Most cloud providers provide some level of each of these services. These different services vary mainly in the balance of responsibility and control that is shared between the user and the cloud provider. For instance, IaaS allows you “bare metal” access to the underlying cloud platform and permits you to create, provision and spin up virtual machine instances “on the fly”. This is the “programmable data center” model that Amazon has made very popular. In this arrangement, the cloud provider is responsible primarily for the hardware, load balancing, and, in some cases, operating system licensing while the bulk of the administrative responsibility including configuration, maintenance and patching falls on the user. In situations where the user needs to have ultimate control over their environment this service may work best. The other end of the spectrum is SaaS. In this scenario, the cloud provider is responsible for not only maintaing the environment in which applications run but also providing and maintaining the platform (.NET, Java, etc.) and the software (Apache, IIS, etc.) in which they are hosted. The downside to this approach, of course, is that the user has limited control over the environment. In some cases, however, this may be more than appropriate. The point is that you as the user can decide to what degree you wish to take advantage of cloud services regardless of the provider that you choose. Keep in mind, as well, that it may make sense to use a combination of these services in order to create a solid architecture. This hybrid approach is not only advantageous to cloud computing but is also in general a cornerstone of service oriented architecture.
While the power of the cloud may seem overwhelming it is important to remember that in software development there are no “silver bullets.” These tools can help but the onus is still on the developer to build scalable applications that take advantage of the benefits that the cloud inherently provides. In the past it may have been enough to store files on a local disk. In the past it may have made sense to lump disparate services together. In the past it made sense to store session state in memory locally on individual web servers. These designs don’t scale. Taking legacy applications and moving them to a cloud provider without considering the ramifications and potential opportunities of doing so is one of the most common mistakes I see. In a truly distributed world single responsibility and separation of concerns are of critical importance. It’s important to build for the cloud and take advantage of the tremendous power and scalability that these public cloud providers offer. It’s not enough to upload your applications, spin around three times and shout “to the cloud!”
Hopefully this post has shed some light on what the cloud is and why it has become so important over the last few years. Adopting the cloud requires not just a fresh understanding of how to build and deploy applications to achieve maximum scalability but also a complete shift in thinking from viewing computing resources as products and more as services. In reality, the cloud is just the next logical step in a movement that has been going on for quite some while.
If you’re interested in starting to work with Microsoft Azure please visit http://aka.ms/thecloud for a free 90-day trial. As always, stay cloudy my friends!