Cloud computing is a term that has risen to the top of application development discussions in a very short period of time. Amazon, Google, and Microsoft (among many others), all offer cloud-computing services and are not shy about touting its benefits. If you believe the marketing hype, cloud computing ranks somewhere between revolutionary and the second coming of your favorite prophet. But what exactly is cloud computing, and how does it play into the daily lives of enterprise developers? Let's now try and find some answers.
Before we hop into the cloud, let's talk about who this book is for. Who are "enterprise developers"? In the United States, over half of the economy is small businesses, usually privately owned, with a couple dozen of employees and revenues up to the millions of dollars. The applications that run these businesses have lower requirements because of smaller data volumes and a low number of application users. A single server may host several applications. Many of the business needs for these companies can be met with off-the-shelf software requiring little to no modification.
The minority of the United States economy is made up of huge publicly owned corporations–think Microsoft, Apple, McDonald's, Coca-Cola, Best Buy, and so on. These companies have thousands of employees and revenues in the billions of dollars. Because these companies are publicly owned, they are subject to tight regulatory scrutiny. The applications utilized by these companies must faithfully keep track of an immense amount of data to be utilized by hundreds or thousands of users, and must comply with all matters of regulations. The infrastructure for a single application may involve dozens of servers. A team of consultants is often retained to install and maintain the critical systems of a business, and there is often an ecosystem of internal applications built around the enterprise systems that are just as critical. These are the applications we consider to be "enterprise applications", and the people who develop and extend them are "enterprise developers". The high availability of cloud platforms makes them attractive for hosting these critical applications, and there are many options available to the enterprise developer. This books focuses on Microsoft's cloud development platform named Azure. Throughout this book, we'll develop a simple example application as an introduction to the different facets of Microsoft's Windows Azure platform, and we'll also discuss concepts useful to the enterprise developer, including security and costs, during the course of our application's development.
At its most basic, cloud computing is moving applications accessible from our internal network onto an internet (cloud)-accessible space. We're essentially renting virtual machines in someone else's data center, with the capabilities for immediate scale-out, failover, and data synchronization. In the past, having an Internet-accessible application meant we were building a website with a hosted database. Cloud computing changes that paradigm–our application could be a website, or it could be a client installed on a local PC accessing a common data store from anywhere in the world. The data store could be internal to our network or itself hosted in the cloud. The following diagram outlines three ways in which cloud computing can be utilized for an application. In option 1, both data and application have been hosted in the cloud, the second option is to host our application in the cloud and our data locally, and the third option is to host our data in the cloud and our application locally.
The expense (or cost) model is also very different. In our local network, we have to buy the hardware and software licenses, install and configure the servers, and finally we have to maintain them. All this counts in addition to building and maintaining the application! In cloud computing, the host usually handles all the installation, configuration, and maintenance of the servers, allowing us to focus mostly on the application. The direct costs of running our application in the cloud are only for each machine-hour of use and storage utilization.
The individual pieces of cloud computing have all been around for some time. Shared mainframes and supercomputers have for a long time billed the end users based on that user's resource consumption. Space for websites can be rented on a monthly basis. Providers offer specialized application hosting and, relatively recently, leased virtual machines have also become available. If there is anything revolutionary about cloud computing, then it is its ability to combine all the best features of these different components into a single affordable service offering.
Low up-front cost:
At the top of the benefits list is probably the low up-front cost. With cloud computing, someone else is buying and installing the servers, switches, and firewalls, among other things. In addition to the hardware, software licenses and assurance plans are also expensive on the enterprise level, even with a purchasing agreement. In most cloud services, including Microsoft's Azure platform, we do not need to purchase separate licenses for operating systems or databases. In Azure, the costs include licenses for Windows Azure OS and SQL Azure. As a corollary, someone else is responsible for the maintenance and upkeep of the servers – no more tape backups that must be rotated and sent to off-site storage, no extensive strategies and lost weekends bringing servers up to the current release level, and no more counting the minutes until the early morning delivery of a hot swap fan to replace the one that burned out the previous afternoon.
Easier disaster recovery and storage management:
With synchronized storage across multiple data centers, located in different regions in the same country or even in different countries, disaster recovery planning becomes significantly easier.
If capacity needs to be increased, it can be done quite easily by logging into a control panel and turning on an additional VM. It would be a rare instance indeed when our provider doesn't sell us additional capacity. When the need for capacity passes, we can simply turn off the VMs we no longer need and pay only for the uptime and storage utilization.
Migration from a test to a production environment is greatly simplified. In Windows Azure, we can test an updated version of our application in a local sandbox environment. When we're ready to go live, we deploy our application to a staged environment in the cloud and, with a few mouse clicks in the control panel, we turn off the live virtual machine and activate the staging environment as the live machine – we barely miss a beat! The migration can be performed well in advance of the cut-over, so daytime migrations and midnight cut-overs can become routine. Should something go wrong, the environments can be easily reversed and the issues analyzed the following day.
Finally, the environment we're working on is very familiar. In Azure's case, the environment can include the capabilities of IIS and .NET (or Java or PHP and Apache), with Windows and SQL Server or MySQL. One of the great features of Windows is that it can be configured in so many ways, and to an extent, Azure can also be configured in many ways, supporting a rich and familiar application environment.
Cloud computing sounds wonderful so far, but nothing is perfect. There are aspects of cloud computing that will involve compromising, and in some cases, may make cloud computing infeasible for a company; let's have a look at a few of those:
Less control on application environment:
One of the biggest concerns is that we are no longer in control of our application environment. Giving up control over the maintenance of the firewalls, servers, and operating system can be troubling, especially for sensitive institutions such as health or banking. We are now storing data and our application in a publicly accessible space. There is the possibility of a data breach through some means other than our application. To address these two concerns, services and plans calling themselves "private clouds" are beginning to enter the marketplace. These private clouds will partition our space in a secure way from prying eyes but still allow us the level of access, uptime, and backup we desire from the cloud.
With someone else in control of the patch level of the operating system, testing against new updates becomes an ongoing process. None of us have ever had application issues resulting from a security update, right? The good news is, we can have snapshots of production environments, which can be used to test patches. This makes it significantly easier to have a test system that replicates production.
For many web-based applications, the costs for a cloud application are probably higher than standard shared hosting. Based on the pricing announced at PDC 2009, a simple website application with a single instance would cost around $100/month to host, compared to around $5-$20/month for standard shared hosting.
Difficulty with hosting:
Finally, in most cases, hosting an application in the cloud is not as simple as just deploying to a remote server. For existing applications, there may be some significant changes, such as replacing local connection strings with a service-oriented architecture, or utilizing high-performance storage such as tables and blobs rather than file system storage. Hopefully, the rest of this book will help diminish any differences between a local and a cloud application.
Cloud computing requires more than just a server room, and the different providers employ different technologies. In all cases, cloud computing relies on data centers in multiple geographic locations, with multiple redundancies of everything. It's quite a challenge to locate an area that is geologically stable and relatively free from severe weather events or other natural disasters, making redundancies of locations, in addition to redundancies of utilities, a necessity.
Cloud data centers have moved away from the "racks-in-a-room" or "raised floor" design of traditional data centers. One of the more common designs for cloud data centers is to modify a shipping container to hold racks of servers, and then linking multiple containers together into a large center. The container-based design is used more for stability, space efficiency, and physical isolation of machines. A forty-foot tall rack of servers would be highly unstable and extremely difficult to manage. But a stack of four containers is very stable, and each container is as easy to manage as a small server room. It's also more efficient to cool a number of small rooms as compared to a giant warehouse.
For Azure, Microsoft has taken the container concept a little farther. Microsoft's Azure containers (called Generation 4 Modular Data Centers or G4MDC) are not based on a shipping container, although the end design resembles one. Technically, Microsoft's containers are classified as air handling units and the servers as heaters. Cooling is achieved by pulling outside air through filters, into the container, and around the servers at high velocity. In fact, some of Microsoft's new data centers won't even have roofs! Each G4MDC unit is completely self-contained with airflow regulation, and its own connections for power and bandwidth. Each 40-foot unit can accommodate up to 2,000 servers, and some of Microsoft's facilities will house 400,000 to 500,000 servers.
Usually, cloudy skies are a bad thing–many a day at the beach has been ruined by an abundance of clouds. But in the case of cloud computing, the more clouds, the better! The number of providers of cloud computing services is increasing, but for the enterprise developer, the three major options at the time of writing are from Google, Amazon, and Microsoft.
Google's cloud offering is named the Google AppEngine, and currently supports Python and Java languages. Data are stored in the Google AppEngine data store, a proprietary database utilizing Google Query Language (GQL). For the interested developer, Google offers a free plan with multiple applications.
Amazon has several cloud offerings, all under the Amazon Web Services umbrella, including Simple DB, Elastic Compute Cloud (EC2), Simple Storage Service (S3), and Amazon Virtual Private Cloud (VPC). Simple DB and S3 are data-storage options that are used for everything from compressed backup locations to simple content delivery networks. EC2 is a service that allows us to create a virtual machine to our specifications, and upload it to our cloud-hosting account. We are still completely responsible for the care and feeding of our VM, but Amazon provides the hosting infrastructure. The Amazon VPC is our own private IP block carved out of Amazon's Web Services. The Amazon VPC can be made part of our local network by means of VPN from our firewall to our isolated cloud storage, gaining much of the benefits of cloud storage with the convenience of a local network resource.
Last but not least (and the star of this book) is Microsoft's Azure. Azure actually comprises three services, each of which can be used independently or combined into a completely cloud-based application. When most people speak of Azure, they're speaking of Windows Azure, which is the operating system, application hosting as well as simple storage services. The second piece of Azure is one that has generated a great deal of excitement—SQL Azure. SQL Azure is an almost feature complete version of SQL Server 2008. The final piece of the Windows Azure platform is the
There have been many products and services making great promises to the enterprise developer, and a lot of the chatter about cloud computing at times makes it seem like this is yet another buzzword that will pass. Looking at the companies that have made the move to the various cloud platforms makes us think otherwise. Even before its official release, companies such as Domino's, Kelly Blue Book, and Coca-Cola Enterprises had already adapted applications for Azure, and many more case studies were posted from PDC 2009. To underscore the flexibility of the Azure platform, Domino's application is written in Java and served by Tomcat.
No cloud computing platform can be all things to all people. Each platform differs in its capabilities and service offerings, and price can be a factor as well. Enterprise applications typically include a database back end, and Google's lack of a relational database and limited language support (Python and some flavors of Java) make it a tough sell for enterprises that require a full database and use .NET technologies. With Amazon's services, we need to build our own virtual machine (or start with a pre-built one), but we are still responsible for licensing costs, removing the price advantage. Microsoft's Azure platform is designed to be a very happy medium–a wide range of languages can be used, there are no licensing costs, and Azure has some advanced features such as Access Control and Service Bus not found in other cloud offerings. One thing is for sure–with three big players in the cloud computing game, the services will become more feature rich, less expensive, and in the end, the consumers will benefit greatly.
The presence of so many large applications in the cloud is not proof positive enough to conclude that cloud computing is the way of the future, but such rapid adoption speaks well of the advantages of cloud-based applications, especially the time to develop them. The promise of cloud computing platforms is that they are stable, scalable, easy to develop, and are cost effective. Time will tell which providers perform the best, but even at this early stage there are plenty of case studies to observe.
This chapter served as an overview of cloud computing, from a definition to covering a few advantages and disadvantages. We delved a little into the physical infrastructure of a cloud data center and finished up with a brief overview of the three main enterprise providers (Google, Amazon, and Microsoft). The cloud computing offerings have emerged and grown in a very short period of time, sparking not only a great deal of conversation, but also a fair amount of adoption.