Wednesday, November 12, 2008

Windows Azure: How I deployed an existing Silverlight application in 30 minutes

image Almost two weeks ago I posted about my first experiment with Amazon EC2, and how I was able to get an existing application (our Sproodle SaaS offering) up and running on EC2 in a couple of hours. That was the same day as Microsoft announced Windows Azure, and of course I wanted to try the same application to run on Azure as well. Two days later I finally got my Azure account, and to my delight I was able to get our application up and running on Azure in about 30 minutes. Which in my mind seriously rocked. In this post I will explain the steps I went through to deploy an existing application to Azure, and talk a bit about how Azure compares to EC2.

Oh, and I’m pretty sure this was the first real (real as in real application, not a Hello World sample) Windows Azure deployment from Finland (on the 29th of October) :).

Deploying an existing application to EC2

There are a bunch of Hello World-examples for how to create a small app and deploy it to Azure, but when I first did this deployment I couldn’t find a sample that showed how to take an existing application and deploy it. However, the mechanism behind deploying to Azure is pretty simple, and essentially what you need is a deployment project. In Visual Studio you can’t add just the deployment project to an existing solution, you always get a new web application as well. This may not seem that useful at first glance, but it’s actually not that hard to change it to deploy whatever project you want. Below you can find out how. I’m using a sample app for this article, since the project I actually used when I did this at PDC is a pretty large and complex beast.

Step 1. In your existing Silverlight application solution, add a new Cloud Service project

image

My sample application solution contains two projects. The first is the Silverlight application, which in this case just writes “I like clouds! on a blue background. The other project is a web application that shows the Silverlight app. No changes has been made to this project, it’s just straight out of the box.

Now, to add cloud goodness we have to cheat a bit. Currently (as far as I know) Visual Studio won’t let you add a Cloud Service project (which is needed for deploying to Azure) and have that deploy an existing web application. It always wants to create a new application for you. So what you can do is to add a new “Web Cloud Service” to your solution. Let’s call it “CloudService”.

 

 

 

Step 2. Get rid of the generated WebRole-project

imageWhen you add a new “Web Cloud Service”-project Visual Studio actually creates two projects for you. One is the deployment project (“CloudService” in this example), and the other is a web application (“CloudService_WebRole”). As far as I can tell the second one is just a regular web application.

The deployment project is set up to deploy the CloudService_WebRole-project, and I haven’t found a way to change which project it tries to deploy through the Visual Studio UI. So we need to wire it up to deploy our existing  “SilverlightCloudApplication.Web” instead.

 

 

 

Step 3. Use notepad to edit the project file.

This is the scary part. If you’ve poked around in the Visual Studio project files before you know that they are just XML files, and note even very complex ones at that. It turned out that all we need to do in order to make “CloudService” deploy any web project we want is just change which project its deployment point refer to.

So what we first need to figure out is the ID for our “SilverlightCloudApplication.Web”-project. First close Visual Studio. Then open the file “SilverlightCloudApplication.Web.csproj” in notepad (or your favorite text editor). Look for an XML element called “ProjectGuid”, and copy the contents of that element. In my sample project here it was “{61CADBB5-24ED-4F11-848B-7754877F7A06}”, but it will be something different for you project.

Next open the project file for the “CloudService”-project. Look for an XML element called “ItemGroup”, and another called “ProjectReference” below that. You need to edit three things in there. First, change the “Include”-attribute of the “ProjectReference”-element to be the path to the project of the web application you want to deploy. Next, change the contents of the “Name”-element to be the name of your web application. And finally, change the contents of the “Project”-element to be the guid you copied from the web application project file earlier.

Below you can see a screenshot that gives you an idea of what the results of your edits should look like.

image

image Save the file, and restart Visual Studio. When you open the solution you will see that the CloudService now refers to your web application (in this case “SilverlightCloudApplication.Web"). At this point you can safely delete the “CloudService_WebRole”-project, as it is no longer needed.

 

Now you should be able to build and publish your application to Azure. Happy cloud computing.

 

 

 

Comparing Azure to Amazon EC2

A lot of people have asked me which is better, Azure or Amazon EC2? First I want to point out that this is a bit of an apples to oranges-comparison. Sure, they both are part of that fuzzy bag of stuff called “cloud services”, but from a (service) perspective they are quite different. What Amazon does is give you virtual servers that you can use to run whatever you want on, and what Azure does is give you the ability to deploy web applications to the cloud. The difference is primarily that with Amazon you still have to operate and maintain the environment your application runs in, and with Azure Microsoft is taking care of all of that for you. And they seem to do it in a very impressive way. Their environment even takes care of staging for you, so that you can test your new deployment before you switch out the currently live one.

So which one do I prefer? I really like Windows Azure. I also like Amazon EC2. I think there’s room for them both. Currently I think Azure is the better choice if what you want to do is run a web application in the cloud. Most software developers do not want to have to operate the environment, for many reasons (cost being one of the most popular ones).

If you need full control over the environment your application runs in, you probably cant use Azure (at least not in its current state). For example, I have to admit that I ended up cheating a bit when I deployed Sproodle to Azure. Because it has a database and a bunch of WCF services on top of that database I couldn’t deploy those to Azure, since it doesn’t supply you with a SQL Server. I would have had to re-architect the services so that they can run in Azure on top of SQL Services (which is a completely different animal from SQL Server). My kung fu may be strong, but not strong enough to do that in half an hour. :) So what I did was keep the services in the EC2-environment I’d set up a couple of days earlier, and set up my Silverlight app to call them from there instead. So I ended up being double-clouded, the front end running on Azure and the back-end on EC2. Not ideal, but hey, it worked! :)

Thursday, October 30, 2008

PDC is not all work and no play

photo (3) Even though the days are pretty long, and there’s a lot of sessions squeezed in and new information to absorb, there’s still some time to see a bit of LA.

Last night we made it to the rooftop of The Standard, where there was a Halloween party going on. Great place, great mood, great view, great drinks. I didn’t bring my camera, therefore all you get is a blurry mobile photo. Lots of funky costumes and I have to say that the view of the skyscrapers of downtown LA was really stunning.

Though, being geeks, we ended up talking a bit about Azure, Silverlight and stuff like that...

 

 

 

 

 

 

image The night before we went to the attendee party at Universal Studios, where they also had a Halloween-thing going on. Even though I’ve been to Universal Studios a couple of time (it’s the standard attendee party venue at TechEd and PDC) the Halloween stuff made it more fun than I expected.

They had a special Halloween show, “Bill & Ted’s Excellent Halloween Adventure”, and since I expected it to be rather stupid it ended up being quite entertaining. Definitely aimed at a mature audience, and it poked a lot of fun at celebrities and movie characters. Highlights included Sarah Palin showing her best side (pictured on the right) and Indiana Jones saying “Skanks. Why does it always have to be skanks?” in reference to the girls from Sex in the City entering the stage.

My cloud experience during the Ray Ozzie PDC Keynote

image A lot of people have already blogged about the keynote and commented on the applications shown, so I won’t go into that, apart from saying that I really believe in the model, but I wish they’d found better examples to illustrate it. However, the technology looks fantastic and I’m a big believer in cloud computing. But that’s not the topic of this post. I’ll post more about that later.

Anyway, I was having my own pretty good cloud experience during the keynote, but not on Microsoft Azure. For a while now we’ve been trying to figure out how we want to host our new Sproodle SaaS offering. We’ve been looking into different options ranging from hosting it ourselves (not a good idea) to hosting it as an application somewhere (now we’re getting into Azure-territory, but more on that in another post). One option we’ve explored is using one of several hosting companies that offer you virtual machines in their own hardware, thus saving you from having to invest in that yourself. One such company is Amazon, with their Elastic Compute Cloud (EC2) service. They recently started offering Windows-based virtual machines, which certainly is very interesting.

Amazon Web ServicesOn Sunday we decided we’d try to deploy our Sproodle product into EC2. We were all fired up and ready to go, but unfortunately our plan was foiled because the hotel bar didn’t have a wireless network. It’s kind of hard to put something up in the cloud without a network connection…

So, on Monday, before and during the Ray Ozzie keynote, I set up an EC2 account, created a Windows Server 2003 virtual machine with SQL Server, and deployed our application to it. Creating this machine in the cloud and getting our software up and running on it took 2,5 hours. Getting the Windows Server 2003 virtual box up and running took about 30 minutes. The reason deploying the software took 2 hours had more to do with having to mess around with some nasty config file insanity than with Amazon. Although having to copy files over a remote desktop connection is not exactly the fastest thing in the world. I should have set up some other deployment method, but since this was more of a trial than a real world deployment I decided not to bother with it.

To summarize I think it’s pretty cool to be able to set up a hosted virtual machine complete with our application in less than three hours. EC2 is a pretty cool service, very much oriented around pay-as-you-go (they charge for how long you have your machine running and for how much data you transfer).

Later you’ll find out how long it took us to deploy Sproodle on Microsoft Azure. Yes, we did it already :).