One of my goals this past year has been to get more hands-on with respects to real-world cloud applications. Working for Aditi has provided many opportunities to dig into some interesting cloud workloads. In addition to building all kinds of applications running in Windows Azure, I’ve learned a lot working with Ryan Dunn and Raghu Rajagopalan on building products (like Scheduler) that run in the cloud.

Coming from a Windows Azure focus at Microsoft my natural tendency has been to approach most problems with solutions in Windows Azure. It’s amazing how versatile Windows Azure is as a platform; with a little bit of elbow grease there are few problems you can’t solve. That said, what I’ve come to release is, regardless of any platforms merits, there are always cases when you need to leave your comfort zone. For me, this has manifested itself with customers that – for a great many reasons – look to either Amazon Web Services or SalesForce.com for solutions.

Don’t get me wrong. I’m still a huge fan of Windows Azure and incredibly excited by what the platform offers. (And not just because I spent five years of my life working on it!) Just look at the evolution Windows Azure has taken over the last year:

  • Introduced IaaS capabilities last year
  • Introduced Windows Azure Websites
  • Introduced Windows Azure Mobile Services
  • Introduced Media Services

… and so much more. There’s never been a better time to build on Windows Azure.

That said, it’s interesting to talk to CIOs and technology leaders at various companies. I’ve found a great many different mental models people have for the cloud. Generally speaking, it appears that when talking to a technical person the cloud is synonymous with AWS; when talking to a businessperson the cloud is synonymous with SalesForce.com. We all ignore these platforms at our own peril. The same can be said for folks focused entirely on AWS or SalesForce.com – you ignore Windows Azure at your own peril.

At the end of the day, no one platform ever has all the answers. If we’re honest with ourselves we have to admit that it’s both worthwhile and important to understand other platforms as well. The desire to learn and to branch out into new areas is natural; furthermore, and most importantly, the needs of customers comes first.

All of this is a way of saying that you’ll start to see me blog more about other cloud platforms – certainly AWS and SalesForce.com, but it’s possible I’ll go even beyond these two. There’s a lot to learn from platforms like Heroku, Google Cloud, and others.

None of this is surprising or revolutionary. Consequently, you may ask yourself, why a long blog post? Well, primarily it’s because I don’t want to give the impression that I’ve given up on Windows Azure. In fact, I’m more excited about the future of Windows Azure than ever before. There’s a lot of opportunity just around the corner.

So … to the cloud(s)!

Lately I’ve been attempting to try out a number of different techniques for publishing web applications – both websites and web APIs – to the cloud. I’m being purposely vague when saying “the cloud” – it could be Windows Azure, AWS, or even a traditional hosting provider. It’s likely you saw a great post by Michael Washam that provides a solution for using Windows Azure virtual machines along with Web Deploy and a few PowerShell scripts. What’s below is a technique adapted from Michael’s post and detailed for each of the steps. What I like about this approach is that, aside from the machine preparation, the deployment technique is consistent across different platforms.

There are certainly a few things missing below: scripts for scaling up/down, scripts for running Windows update, and so forth. I’ll tackle these in future posts. My point here is to highlight a different way to look at tackling a common problem.

What are some of the advantages to this approach?

  • Near instant deployment.
  • Fully automated.
  • Consistent development model with other platforms.
  • Consistent deployment model with other platforms.

I’m sure there are more. There are some limitations as well – in particular, you’re bound by the number of roles you can have in your Cloud Service, which today is (I think) 25. This means that, at most, you can only scale out to 25 virtual machines. I imagine this limitation will be removed at some point (or perhaps you could get around it by using virtual networks).

Regardless, give it a try.

Note: You can find the PowerShell scripts used below in this gist here: https://gist.github.com/wadewegner/5080142.

Image Preparation

In this first step you’ll create and customize a virtual machine that you’ll then sysprep and turn into a disk that we’ll use later on.

Create the Base Virtual Machine

This first part takes the longest. This is because you’re preparing the disk you’ll use moving forward. Note that you only do it once – this is not something you have to do over and over again.

1. Create a Virtual Machine.
 WAIIASImage1

2. Enter the VM information. Use the default “Windows Server 2012 Datacenter” image. Size doesn’t matter. This VM will sysprepped and used as a disk image for creating future virtual machines.
WAIIASImage2

  • Be sure to note the location you use.
  • Be sure and remember the password. You’ll need it.

3. Start the VM.

  • Note: Notice that VMs create a Cloud Service. Each VM is actually a role within

4. RDP into the VM once it has provisioned and started.
WAIIASImage3

5. Click to Add roles and features.
image

6. Leave defaults and click Next until you get to Server Roles.

7. Choose Application Server and Web Server (IIS). Click Next.
image

8. Under Features be sure to select ASP.NET 4.5.
image

9. Click Next until you get to Role Services under Web Server Role (IIS).

10. Add ASP.NET 4.5 under Application Development. This will add the other default values.
image

11. Click Next until you get to the last step. Click Install. Wait until the operation completes.

Install and Use Windows Azure PowerShell Cmdlets

12. From the machine, download the Windows Azure PowerShell Cmdlets. These can be found at: http://www.windowsazure.com/en-us/downloads/.

13. Install the cmdlets. This can take 5-15 minutes.
image

14. Create the folder c:\\Scripts.

15. Run the following script in Windows PowerShell ISE to download your publish settings file:

Get-AzurePublishSettingsFile

16. Save or move this file into the c:\\Scripts folder and rename to credentials.publishsettings.

17. Run the following script in Windows PowerShell ISE to change the execution policy:
Set-ExecutionPolicy Unrestricted

Setup Web Deploy

18. Download Web Deploy 3.0 from the following link: http://download.microsoft.com/download/1/B/3/1B3F8377-CFE1-4B40-8402-AE1FC6A0A8C3/WebDeploy_amd64_en-US.msi. Do not install. To simplify, download to C:\\.

19. Open a Command Prompt.

20. Run the following command:

C:\\>msiexec /I webdeploy_amd64_en-us.msi /passive ADDLOCAL=ALL LISTENURL=http://+:8080/
image

Configure Firewall Settings

21. Run Windows Firewall with Advanced Security.

22. Select Inbound Rules and click New Rule.

23. Select Port and click Next.

24. Level TCP selected and enter 8080 for the Specific local ports.
image

25. Keep the defaults and click Next until prompted to give a name. Choose a name (e.g. Web Deploy Port) and click Finish.

System Preparation

26. Open a Command Prompt as an administrator.

27. Change the directory to: %windir%\\system32\\sysprep

28. Run sysprep.exe.
image

29. Ensure the following options are selected:

  • Enter System Out-of-Box Experience (OOBE)
  • Generalize
  • Shutdown
    image

Capture the Virtual Machine

30. Return to your Virtual Machine Instances tab in the portal: https://manage.windowsazure.com/#Workspace/VirtualMachineExtension/vms.

31. Wait until you see that the status of your virtual machine is Stopped.
image

32. Capture the image by clicking the CAPTURE button below.
clip_image024

33. Select an image name (e.g. WS2012-WebFarmImage) and check that you have sysprepped the machine. Click the button.
image

34. When the capture operation completes you’ll see the disk image available under Images in the portal: https://manage.windowsazure.com/#Workspaces/VirtualMachineExtension/images

image

Virtual Machine Deployment

You’ll run these steps from your own PC.

1. Open the Windows PowerShell ISE to run the following scripts. It’s always a good idea to save them somewhere to use later.

2. You might need to import your publish settings. If so, download your publish settings file, save it, then import it.

Get-AzurePublishSettingsFile

Import-AzurePublishSettingsFile C:\\credentials.publishsettings

3. Get the subscription name to which you’ll deploy. Run the following script:

Get-AzureSubscription -Current
image

4. You need to get the storage account that contains your disk image. You’ll need to use the same storage account for the disks attached to the web servers in your web farm. Select the Images tab under Virtual Machines on the portal. Find your image and look at the location. The first part of the URL is the storage account name.
image

5. It’s now time to deploy your web farm using the disk image you created in the previous section. Review the following script and update appropriately.

$imgname = 'WS2012-WebFarmImage'
$cloudsvc = 'DemoWebFarm'
$pass = 'Password'
$subscriptionName = 'Windows Azure MSDN - Visual Studio Ultimate'
$storageAccount = 'portalvhds9dvbvvff5hdg3'
$location = 'East US'

Set-AzureSubscription -SubscriptionName $subscriptionName -CurrentStorageAccount $storageAccount

$iisvm1 = New-AzureVMConfig -Name 'iis1' -InstanceSize Small -ImageName $imgname |
    Add-AzureEndpoint -Name web -LocalPort 80 -PublicPort 80 -Protocol tcp -LBSetName web -ProbePath '/' -ProbeProtocol http -ProbePort 80 |
    Add-AzureEndpoint -Name webdeploy -LocalPort 8080 -PublicPort 8080 -Protocol tcp | 
    Add-AzureProvisioningConfig -Windows -Password $pass
    
$iisvm2 = New-AzureVMConfig -Name 'iis2' -InstanceSize Small -ImageName $imgname |
    Add-AzureEndpoint -Name web -LocalPort 80 -PublicPort 80 -Protocol tcp -LBSetName web -ProbePath '/' -ProbeProtocol http -ProbePort 80 |
    Add-AzureProvisioningConfig -Windows -Password $pass
    
$iisvm3 = New-AzureVMConfig -Name 'iis3' -InstanceSize Small -ImageName $imgname |
    Add-AzureEndpoint -Name web -LocalPort 80 -PublicPort 80 -Protocol tcp -LBSetName web -ProbePath '/' -ProbeProtocol http -ProbePort 80 |
    Add-AzureProvisioningConfig -Windows -Password $pass    
    
New-AzureVM -ServiceName $cloudsvc -VMs $iisvm1, $iisvm2, $iisvm3 -Location $location

Notes on script:

  • $imgname: This is the name of the disk image you created.
  • $cloudsvc: When you deploy it will create a cloud service. This is the name for the cloud service.
  • $pass: This is the password for the virtual machine you created.
  • $subscriptionName: This is your subscription name.
  • $location: The datacenter you want to deploy into. Note: this has to be the same data center as your storage account.

It is important to note that the setup for $iisvm1 is different than $iisvm2 and $iisvm3. That’s because we’re adding an additional endpoint named webdeploy on 8080. We’ll use this public port for deploying via web deploy. It is not opened on the other machines.

6. It’s time to run the script. Note: the script does not rollback. If you have values that are incorrect you’ll have to clean them up manually. If all goes well, you’ll see progress indicators like the following:
image
image

7. You can now look in the portal and you’ll see the following machines Running/Provisioning.
image

8. You can browse the URL, for example: http://demowebfarm.cloudapp.net. You’ll get the standard IIS page:
image

Setup Synchronization across Virtual Machines

1. Remote into iis1. From the portal, select iis1 under Virtual Machine Instances and click the CONNECT button. This will download an RDP file. Save this and use it for connecting to the machine later.
clip_image039

2. Open Windows PowerShell ISE.

3. Click New to create a new script.

4. Copy the following script and save it as C:\\Scripts\\Sync.ps1. DO NOT RUN IT.

$subscriptionName = 'Windows Azure MSDN - Visual Studio Ultimate'
$storageAccount = 'portalvhds9dvbvvff5hdg3'
$cloudsvc = ' DemoWebFarm' 
$publishSettings = 'C:\\Scripts\\credentials.publishsettings'

Import-Module 'C:\\Program Files (x86)\\Microsoft SDKs\\Windows Azure\\PowerShell\\Azure\\Azure.psd1'

Import-AzurePublishSettingsFile $publishSettings
Set-AzureSubscription -SubscriptionName $subscriptionName -CurrentStorageAccount $storageAccount

$publishingServer = (gc env:computername).toLower()

Get-AzureVM -ServiceName $cloudsvc | foreach { 
    if ($_.Name.toLower() -ne $publishingServer) {
       $target = $_.Name + ":8080"
       $source = $publishingServer + ":8080"

       $exe = "C:\\Program Files\\IIS\\Microsoft Web Deploy V3\\msdeploy.exe"
       [Array]$params = "-verb:sync", "-source:contentPath=C:\\Inetpub\\wwwroot,computerName=$source", "-dest:contentPath=C:\\Inetpub\\wwwroot,computerName=$target";

        & $exe $params;
    }   
}

Create a Scheduled Task

5. Open Task Scheduler.

6. Click Create Task …
image

7. On the General tab set the Name and Run wehather user is logged on or not.
image

8. On the Triggers tab click New. Create a Daily trigger and Repeat task every 2 minutes. Click OK.
image

9. On the Actions tab click New. Set the following values:

Program/script: C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe
Add arguments: -File C:\\Scripts\\Sync.ps1
image

10. You should now see this as a scheduled task.
image

11. You can wait for this to run or run it manually. It should run successfully.
image

Deploy a Website through Web Deploy

1. Create a new ASP.NET MVC 4 Web Applications. (In actually it can be anything.) Choose an Internet Application.
image

2. Update the HomeController.cs code:

public ActionResult Index()
{
    string machineName = Environment.MachineName;
    ViewBag.Message = "Computer Name: " + machineName;

    return View();
}

3. Right-click on your application and click Publish.
image

4. In the dropdown select New.
image

5. Give your publish profile a name. Click OK.
image

6. Update all the fields:
image

  • Server: This is the DNS name of the cloud service with port 8080.
  • Site name: This needs to be “Default Web Site”.
  • User name: This is the administrator account.
  • Password: The password you set.
  • Destination URL: The same as server without the ports.

7. Click Publish.

8. In Visual Studio you should see that it deployed successfully.
image

WARNING: Don’t be alarmed if the browser opens and you don’t see your site. Remember that we set synchronization at two minutes and you have a 66% chance of hitting iis2 or iis3.

9. If you go back to your RDP session with iis1 and browse to C:\\inetpub\\wwwroot you’ll see all your content has been deployed.

10. Either way two minutes or manually invoke your synchronization task. Hit the website again and start refreshing:
image
image

That’s it!

Yeah, that might seem like a lot but realize that most of the work detailed here – such as the image preparation – you’ll only have to do one time. The rest of the time you’re using tools like PowerShell and Visual Studio.

Enjoy!

Yesterday Windows Azure experienced a worldwide disruption in many services due to an expired PKI certificate for Windows Azure storage. Mary Jo Foley’s article Windows Azure storage issue: Expired HTTPS certificate possibly at fault provides the best coverage of the event as it unfolded. You can also take a look at a few threads on the Windows Azure forum and Stack Overflow that provide a lot of commentary on the event. The effects of this disruption rippled through most of the other Windows Azure services. Even if you modified your application to use HTTP instead of HTTPS it’s likely you still had issues given that the rest of the platform was crippled by the expired certificate.

It’s disappointing this happened but highlights a pretty common situation. This has nothing to do with the merits of the Windows Azure storage service or any other parts of the platform – this is an operations management issue, plain and simple. The irony is that, as a number of folks including Lars Wilhelmsen have pointed out, there are tools like Microsoft SCOM that provide a Certificate Management Pack that can notify operations of expiring certificates. I can’t imagine the operations team at Windows Azure doesn’t use some kind of tool to manage expiring certificates.

As a developer, I found myself curious to see just how hard it is to determine the expiration of a certificate by checking the URI. Turns out, it’s pretty simple by using System.Net.ServicePoint which provides connection management for HTTP/S connections.

private string GetSSLExpiryDate()
{
    string url = "https://www.aditicloud.com/";
    var request = WebRequest.Create(url) as HttpWebRequest;
    var response = request.GetResponse();

    if (request.ServicePoint.Certificate != null)
    {
        return request.ServicePoint.Certificate.GetExpirationDateString();
    }
    else
    {
        return string.Empty;
    }
}

Pretty simple. What’s hard is the practice of managing and tracking these sorts of things.

I would expect that Microsoft will ensure that this kind of problem never happens again. It’s embarrassing yet solvable. Yet it exposes an issue that most of us will also have to account for – expiring certificates. If it can happen to Microsoft, it can happen to us too.

Excellent keynote today by Scott Guthrie and the Windows Azure team! I don’t know if it’s because I’m seeing it on the other side for the first time or if it’s due to the amazing new capabilities introduced into Windows Azure, but I loved every second of it! Within a few minutes Scott had jumped into a demo and it was nonstop thereafter!

I’ve been waiting for almost a year to write this blog post.

Keynote with Scott Guthrie

WP_000321

In order to get this post out quickly I decided to share my rough notes from the keynote. Over the coming days and weeks I will certainly expand this with more information.

Scott Guthrie:

  • Today’s release “elevates Windows Azure to a new level”
  • Capabilities like Windows Azure Web Sites and open source libraries open the platform to many more developers
  • Three pillars of Windows Azure:
    • Flexible
    • Open
    • Solid
  • Windows Azure has pioneered Platform-as-a-Service
  • Today we’re enabling Infrastructure-as-a-Service (IaaS)
  • Support of Linux is how we’re embracing openness in a new way
  • Supporting more languages, protocols, and SDKs
  • Open-source libraries and SDKs on Github under the Apache 2.0 license

Demo: New Windows Azure website

  • There’s a new Linux and Mac installer for Node.js
  • Spent time optimizing the portal to work across platforms
  • Full monitoring and statistics through the portal
  • Everything done through the portal is communicating to APIs thereby allowing you to do everything through the command line
  • IaaS
    • Create a new virtual machine
    • Anything installed on the machine will persist; full durable VM
    • Image gallery
      • Linux distribution built into the portal
    • We have a number of SDKs to download, including Mac
      • installs an Azure utility and wires up a BASH shell
      • including ASCII art
      • SSH’d into Ubuntu machine
  • Virtual Networks
    • Not just upload VMs into the cloud
    • Integrate into your existing networks and VMs you already have
    • Shipping virtual private networking
    • A wizard to create an address space and subnet; we’ll virtualize these addresses
    • You can provide DNS servers in the cloud or on-premises

Scott Guthrie on VMs:

  • Virtual machine portability
    • Between the cloud and different environments
    • All VMs are running a VHD format which is an open spec
    • Because it’s the same file format you can take a VM and move to Windows Azure or even move it back; you don’t have to export or convert the VHDs
    • This allows you to run in your data center, other service providers, or within Windows Azure: flexibility, portability, and no lock-in
  • VM persistent drive
    • Mount durable drives to the virtual machines
    • Reliable and consistent
    • When you mount a drive the disk is backed with the Windows Azure storage system
      • Triple replicate the content; no interruption of service if there’s a failure
      • Continuous storage and geo-replication

Partner: RightScale

  • Michael Crandell, CEO
  • Mission: to build a broad cloud management platform
  • Web-based environment that allows companies to manage everything from development to delivery of applications running on cloud infrastructures
  • Think of us as a bridge between the apps and the infrastructures you want to run on (public, private, or hybrid)
  • Partner: worked with the Windows Azure team to interact with the new IaaS APIs
  • Brought to Windows Azure the full set of RightScale capabilities
  • When run by RightScale the solution includes auto scale
  • Why Windows Azure?
    • Microsoft knows how to run global cloud infrastructure with a high degree of operational excellence
    • IaaS + PaaS is an industry first – provides an entire environment for the development and deployment of apps that are compelling, from simple to complex
    • Openness – a clear commitment of openness at multiple levels

Scott Guthrie on Web sites:

  • Benefits
    • Build with ASP.NET, Node.js, or PHP
    • Deploy in seconds with FTP, Git, or TFS
    • Start for free, scale up as your traffic grows
  • Bill Staples demo
  • Opposite end of the cloud spectrum
    • don’t want to focus on the platform; don’t want to install the frameworks
  • Visual Studio & .NET
    • Quickly created a website
    • Downloaded a publishing profile that includes all the connection information
    • Opens up Visual Studio and ASP.NET MVC 4
    • Import the profile and publish
    • Support in both VS 20120 and VS 2012
    • Built and published into the cloud in just a few seconds
    • Updated a string and republished
      • Preview shows the deltas between local and cloud
      • Just push the change
  • Mac with Node.js
    • Instead of the portal use the commandline
    • Use the azure command
    • Uses git to deploy
    • One update connects to Mongo running in a Linux VM
  • Sometimes it’s nice to build an application without writing code
    • Best of Windows Azure and the power of open source
    • MySQL: worked with ClearDB to provide MySQL as a service
  • Scale
    • Scale out
      • By default, website is running as a Shared Website
      • You can increase instance count
    • Scale up
      • Move from Shared to Reserved
      • Only my websites are routed
  • 10 free shared websites

Scott Guthrie on Cloud Services:

  • Another model for building infinitely scalable applications and services
  • The traditional PaaS offering that Windows Azure has had since release
  • Creates a multi-tier applications using the website Bill created and adding a worker role
  • Process
    • Upload a service package (which is essentially a zip file) into the cloud
    • Fabric controller provisions the machines and deploys my bits and brings it into rotation through load balancer

Scott Guthrie on Building Blocks:

  • Overall message is to enable developers to focus on applications and less about infrastructure
  • Application building blocks
    • big data
    • database
    • storage
    • traffic
    • caching
    • messaging
    • identity
    • media
    • CDN
    • networking
  • Delivered by MSFT and partners
  • Language support for: .NET, Node.JS, Java, PHP, Python
    • Libraries you can consume natively
    • Libraries on Github under Apache2
  • SQL Database
    • Relational SQL database
    • Clustered for high availability
    • Fully managed service
    • SQL Reporting support
  • Blob storage
    • Features
      • Highly available, scalable and secure file system
      • Blobs can be exposed publically over http
      • Continuous geo-replication across datacenters
    • Real-time data showed in portal
    • SQLs surfaced in the portal
  • Cache
    • implementing Memcached protocol support
    • Use the distributed service or run it in your own instances
  • Identity
    • Integrate with enterprise identity
    • Enable single sign-on within your apps
    • Enterprise Graph REST API
    • 93% of Fortune 1000 use Active Directory
  • Service Bus
    • Secure messaging and relay capabilities
    • Easily build hybrid apps
    • Enable loosely coupled solutions
    • Cross platform SDKs
  • Media Service
    • Create, manage, and distribute content
    • Target any device or media format
    • Ingest, Encode, Protect, Stream
  • Marketplace integration
  • Azure in 89 countries and territories

Today’s release marks a significant milestone for Windows Azure. To date, Windows Azure has been a platform that allows developers to build and run applications across Microsoft’s global datacenters – the key emphasis has been on “applications”. Windows Azure has not been a platform for providing the underlying infrastructure for running your own virtual machine – this has been a key pain point for many customers looking to move to the cloud that Microsoft has heard loud and clear. Today’s announcement makes it clear that Windows Azure is more than just a Platform-as-a-Service provider.

In my opinion, there are three significant components of today’s announcements worth delving into deeper:

  • New Infrastructure-as-a-Service (IaaS) capabilities.
  • Free (or low-cost) hosting with Windows Azure Websites.
  • Enhanced cloud networking capabilities that support VPN connections between an on-premises corporate network and Windows Azure.

Until now, Microsoft has never competed directly with Amazon EC2 with respects to IaaS nor with cloud platforms like Heroku. The new IaaS and Websites capabilities, combined with the ability to extend on-premises networks to the cloud, provides a number of ways that Windows Azure can now distinguish itself from other platforms and—in my opinion—will drive many new enterprises and a large number of developers to adopt Windows Azure.

Infrastructure-as-a-Service

Windows Azure has long had the concept of a “Virtual Machine role” but the fundamental problem has been the inability to persist changes made to the virtual machine image provided by the customer (i.e. the guest VM) during reboots or recycling. Supporting VM persistence in Windows Azure means that the guest VM will not lose these updates. This unlocks many workloads that previously did not work in Windows Azure – certainly products like SharePoint and SQL Server but also custom line-of business applications that previously were difficult to move to Windows Azure.

In addition to VM persistence, Windows Azure will also give customers the ability to run Linux VMs. There’s been a lot of interest and speculation regarding Microsoft’s strategy moving forward with Linux and open source. I think Microsoft recognizes that their customers run more than just Windows in their enterprise, and this is an opportunity for Windows Azure to run as many workloads as possible. We’ve seen this shift in Microsoft in a number of different ways – support for Node.js and Java in Windows and Windows Azure, the creation of a new interoperability subsidiary, and many more. The cloud provides a way to make it easier to connect all of these different platforms and technologies, and my take is that Microsoft is trying to make Windows Azure the best and simplest place to run your applications regardless of the platform or technology.

Windows Azure Websites

It’s exciting to see Microsoft continue to evolve its strategy with Windows Azure to make it increasingly accessible to the breadth of developers out there.
Windows Azure Websites is a hosting platform for web applications. It provides a number of different deployment and runtime options beyond the existing Web Role, including:

  • Target both Microsoft and non-Microsoft technologies already running in the environment, including SQL Azure, MySQL, PHP, Node.js, and (of course) .NET.
  • Deploy via Git, Web Deploy, FTP, or TFS.
  • Run in a high-density / multitenant VM for little-to-no cost or choose a dedicated deployment path.

In addition to providing simpler and more consistent ways to deploy applications across different hosting platforms (e.g. Windows Azure, Windows Server, and hosting providers), Windows Azure Websites provides a way for Microsoft to bring thousands—perhaps even hundreds of thousands—of new developers to the platform with the offer of little-to-no cost hosting.

Cloud Networking

Windows Azure Virtual Networks allows a company to connect their cloud applications and solutions to their local network. This occurs at the networking layer through standard VPN devices. Coupled with IaaS support, this provides a ton of flexibility with respects to the kinds of workloads a customer moves to Windows Azure. Don’t want to move your sensitive SQL Server database? You don’t need to. Setup a VPN to your applications in Windows Azure and let them communicate directly back to your applications that live on-premises.

There’s certainly a lot more to talk about – new services, portal, SDK, tools, and so much more! These thoughts are pretty early—in fact, I write this before today’s MEET Windows Azure event—and there’s so much more to talk about!