Vadim's Weblog

Never stop learning.

Archive for the ‘Azure’ Category

Part 2: Configuration – Learning Azure with me.

Posted by Vadim on January 31, 2010

In Part 1 “Hello Azure” we briefly talked about the Service Configuration file (ServiceConfiguration.cscfg).  In that article we didn’t modify this file, we just accepted all the values provided by Cloud Service Visual Studio template.

Let look at this file and take it apart.

<?xml version="1.0"?>
<ServiceConfiguration serviceName="LearnAzure" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration">
  <Role name="LearnAzureWeb">
    <Instances count="1" />
    <ConfigurationSettings>
      <Setting name="DiagnosticsConnectionString" value="UseDevelopmentStorage=true" />
    </ConfigurationSettings>
  </Role>
</ServiceConfiguration>

image The root element ServiceConfiguration has only one attribute which is serviceName.  The serviceName attribute is required. If you omit this attribute, Visual Studio is going to complain about your XML during compilation.  You can see that this attribute has the same value as our Cloud Project which is LearnAzure.  The name of the service must match the name of the service in the service definition.  If you look inside ServicDefinition.csdef file, you’ll see that value for the name attribute in ServiceDefinition element is also LeanAzure.

ServiceConfiguration element can have only Role elements as children.  Because the only role we have is ASP.NET Web role, LearnAzureWeb, we can see only one Role element.  In case our project contained another role the Service Configuration file would reflect this fact.

Role element also has a single name attribute which is required.  The name attribute represents the name of the service and must match the name of the service in the service definition defined in the WebRole element.  The Role element can have following children elements:

  • Instances
  • ConfigurationSettings
  • Certificates

Looking at our ServiceConfiguration.cscfg file we can see that it contains ConfigurationSettings and Instances elements.

Instances Element

Before we start discussing the Instances element, let me tell you what I know about Microsoft datacenters that host Windows Azure applications.  Microsoft has many strategically placed datacenters that have no physical roof.  Inside each datacenter a lot of sealed shipping containers.  Each containers has inside anywhere from 1,800 to 2,500 servers.  One of these datacenters is located in Chicago.

Now back to our Instances element that has a required count attribute that represents number of instances of your application.  In case our Learn Azure application becomes a hit, we will need more computing power to run it.  We’ll request more power by increasing count value in the Instance element.  Each instance will be run on different server and probably in different container.  And I’m going to guess that it has  a very good chance that each instance will be executed in different datacenter.

<Instances count="5" />

Instances element is required and you can have only one element in each Role.

If you are not friendly with XML, you can modify Instance count using GUI in Visual Studio.  In your Cloud Project right click on the Role and select Properties or just press Alt+Enter.

image

In Configuration tab you can find Instance count and enter the desirable value.

ConfigurationSettings Element

If you’ve developed any .NET application, than ConfigurationSettings element concept should be very familiar to you.  You used this technique many times in your web.config or app.config files.  It serves the same purpose as appSettings element in .config file.

You can have only one ConfigurationSettings section in your Service Configuration file.  This element is not required that means that you can completely omit this section if you don’t set any custom settings.  ConfigurationSettings element can have any number of Setting elements. A Setting element is a mapping of a name to a string value.  A setting name must be declared in a service definition file (ServiceDefinition.csdef).

For example, in our LearnAzure application we hard coded “Hello Azure!” text in the Default.aspx file (See Part1).  We can easily make the hard coded text configurable.

First thing we’ll do is to add our setting name “myText” to the Service Definition file.

<Setting name="myText"/>

Below is complete ServiceDefinition.csdef file.

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="LearnAzure" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole name="LearnAzureWeb">
    <InputEndpoints>
      <InputEndpoint name="HttpIn" protocol="http" port="80" />
    </InputEndpoints>
    <ConfigurationSettings>
      <Setting name="DiagnosticsConnectionString" />
      <Setting name="myText"/>
    </ConfigurationSettings>
  </WebRole>
</ServiceDefinition>

Next we need to add the Setting element with a name and value into ConfigurationSettings section of our Service Configuration file.

<Setting name="myText" value="Hello Azure from the Configuration!" />

Here’s the copy of the complete ServiceConfiguration.cscfg file:

<?xml version="1.0"?>
<ServiceConfiguration serviceName="LearnAzure" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration">
  <Role name="LearnAzureWeb">
    <Instances count="1" />
    <ConfigurationSettings>
      <Setting name="DiagnosticsConnectionString" value="UseDevelopmentStorage=true" />
      <Setting name="myText" value="Hello Azure from the Configuration!" />
    </ConfigurationSettings>
  </Role>
</ServiceConfiguration>

You don’t have to manually modify custom settings.  Visual Studio provides us with GUI to add, remove, or modify our settings.  Select property on our Role and on the left chose the Settings tab.

image

We are done with configuration.  Now let use “myText” in our source code. In our Default.aspx file we need to replace

    <div>
    Hello Azure!
    </div

with

<div>
<asp:Label ID="mainTextLbl" runat="server" />
</div>

We just added a new Label control.

The only thing left is to read the value from the configuration file and assign it to our mainTextLbl Label control.  We’ll do it on page Load event in Default.aspx.cs file.

protected void Page_Load(object sender, EventArgs e)
{
    mainTextLbl.Text = RoleEnvironment.GetConfigurationSettingValue("myText");
}

Now we can compile and run our application on local computer.

image

Now you know how to set basic custom settings for an Azure application.

Certificates.

I believe that discussion of certificates deserves its own article.  I’ll try to talk about it in the future posts.

Why another XML configuration file?

You are probably wondering why do we need another XML configuration file (in this case ServiceConfiguration.cscfg).  We can perfectly set the setting in my Web.config or app.config files.   That’s true but then you’ll have to repackage and redeploy the whole application again.

You can modify ServiceConfiguration.cscfg file from your Azure portal and no redeployment will be required.

To change configuration just login to your Windows Azure portal, select the service and click on Configure button.

image

From Service Tuning page you can modify the existing Service Configuration file or upload a new one.

image

Summary

Now we have basic knowledge how to configure our Azure application.  We learn about Instances and custom settings.  In future article we’ll learn about certificates.

kick it on DotNetKicks.com

Posted in Azure | Tagged: | Leave a Comment »

Part 1: Hello Azure – Learn Azure with me.

Posted by Vadim on January 19, 2010

Windows_Azure_logo[1] I want to learn Windows Azure.  I already have done some reading on the subject and created some simple Windows Azure applications.  However, I believe that writing articles about Cloud Services will help me to get stronger understanding of the platform.

I will not tell you what Windows Azure is.  I hope that you’re reading this because you know what it is and ready to learn it.  I also hope that you already downloaded and installed Windows Azure Platform on your computer.  If you haven’t done it, you can download it from Microsoft Windows Azure site.

My goal for this article:

  1. Create LearnAzure Cloud Service that displays “Hello Azure!” message.
  2. Set up your service online.
  3. Deploy the application to Azure Fabric.

Create LearnAzure Cloud Service.

Start Visual Studio.  I’m going to use VS 2010 Beta 2 but it should work just fine with VS 2008.

Press Ctrl+Shift+N to create a new project.  You also can select File –> New –> Project… from Visual Studio menu.  You should see New Project dialog.

From Installed Templates select Cloud Service (if you don’t see Cloud Service template, than you need to install Windows Azure SDK).   For the project name I typed “LearnAzure”.image

Click on the OK button and you will see a New Cloud Service Project dialog box.  In this dialog box, from the Roles, select ASP.NET Web Role because we want to create an ASP.NET Windows Azure application.  Click on the right arrow to make ASP.NET Web Role appear in Cloud Service Solution list.  By default Visual Studio will give “WebRole1” to your ASP.NET Web Role.  This name is too generic; let’s rename it to “LearnAzureWeb”.  To rename, move your mouse over WebRole1 and click on the little pencil icon on the right of the role.  Now you can rename it to LearnAzureWeb.image 

image After Visual Studio is done, you should have LearnAzure solution that has two projects: LearnAzure and LearnAzureWeb. LearnAzureWeb looks almost like any other ASP.NET application but there few differences.

If you expend References in our ASP.NET Web projects, you’ll see three additional references to Windows Azure assemblies:

  • Microsoft.WindowsAzure.Diagnostics
  • Microsoft.WindowsAzure.ServiceRuntime
  • Microsoft.WindowsAzure.StorageClient

Use Diagnostics namespace for your logging needs.
Use ServiceRuntime namespace when you need to interact with Windows Azure fabric.
Use StorageClient namespace when you need to work with storage services.

These assemblies are located in Program Files\Windows Azure SDK\v1.0\ref folder.

I know that right now this is not enough information for you to understand exactly what these names are for, and how to use them.  But remember, this is just a “Hello Azure!” article.  We’ll have plenty of time to discuss more advance subjects in the future posts.

You also can see WebRole.cs file in your LearnAzureWeb project.  WebRole class provides callbacks to initialize, run, and stop instances of our ASP.NET role.

We have a working Azure application without writing a single line of code.  However, if we start the application by pressing Ctrl+F5 or F5 in case you wanto to start it with debugger, you will see an empty web page.

image In your system tray you can find a new blue window flag icon.  It tells you that Windows Azure simulation environment is running.  It also means that  the Development Fabric and the Development Storage services were started.  You can right click on this icon to see User Interfaces either for the Development Fabric or Development Storage services.  You also can

shutdown any of these services using this icon.

We are done but I hate to look at an empty web page; therefore, I’m going to add “Hello Azure!” to the body of Default.aspx page.

<body>
    <form id="form1" runat="server">
    <div>
    Hello Azure!
    </div>
    </form>
</body>

Here’s the output of our brand new Windows Azure application:

image

Setup your service online.

Now we know how to run our Hello Azure Cloud Service on Simulation Environment.  Next we need to setup the service online.  I assume that you already went to Microsoft Windows Azure site and have an Azure account setup.

In order to deploy our Hello Azure app. you need to log into your Azure portal with the Live ID you registered with.  Below you can see my  Windows Azure page.  I have only one project: PDC08 CTP.

image Next click on the project name. In my case I’m going to click on “PDC08 CTP” as it’s my project name.  You should see the project page.  On this page you can create a new hosted services and storage account.  On my page you can see that a storage account “diagnosticsdata” that I created earlier.

image

I don’t have any hosted services yet. You and I are going to create “Learn Azure” hosted service.  To create a new service, just click on New Service link; you have two these links on this page.  One just above the left navigation bar and another on the right of the project name.  You should see Create an new service page, similar to the image below.

image On this page, we can create either a Storage Account or Hosted Service.  We already decided that we want to create “Learn Azure” hosted service.  Let’s click on Hosted Services link.  You should see Create a Service page.  Provide a service label and description for the service and then click the Next button.

image You should go to the second part of Create a Service.  On this page you need to enter a Public Service Name and choose an Affinity Group.  The Public Service Name must be unique.  I wanted to enter “LearnAzure” but it’s not available; therefore, I chose “LearnAzureWithMe”.  The Public Service Name you’ll choose will be the first part of the URL for your service.  Because it’s part of a URL, it must be unique and cannot have white spaces.  Unfortunately, you have to come up with a different name because “LearnAzureWithMe” belongs to me now.  You can click on the “Check Availability” button to see if the name you selected is still available.

The second part of the form is related to Hosted Service Affinity Group.  Microsoft has many different datacenters around the world.  You want to select a region that the best represents your audience / customers to get better performance.  Also if you have services that are related you might want to deploy them to different datacenters for disaster recovery or geo-distribution purposes.

image Press the Create button to create your hosted service.

Deploy the application to Azure Fabric.

Finally we have a cloud space where to deploy our “Hello Azure!” application.  But before we do so, we need to create the Service Package (.cspkg).  We could use CSPack.exe utility that you can find in Azure SDK folder but it’s much easier to create the Service Package from Visual Studio by right clicking on LearnAzure Cloud Service project and select “Publish”.

image

Visual Studio executes CSPack.exe to create the Service Package. After all is done, you should see the folder containing the Service Package (LearnAzure.cspkg) and Service Configuration file (ServiceConfiguration.cscfg).  .cspkg is a glorified zip file, you should be able to open it with any zip utility if you want to see what inside the package.

image The next step is to deploy the Service Package and Service Configuration file.  You can deploy directly to production, but I would recommend that you deploy to staging environment first.  In order to deploy the application you need to go back to your Azure Portal.  If you don’t see a staging ice cube next to the production one, click on the little arrow that is right of production cube.

image Click on Deploy button under the staging ice cube.  On the next screen, browse for your Service Package and Service Configuration file.  You also will need to give a label for this deployment, my label is “v. 0.1”.

image Click on Deploy button in order to deploy “Hello Azure!” application to Staging environment.  The deployment process can take couple of minutes.  After all is done the gray cube should magically transform to nice ice blue cube.  Your Azure application is deploy but to test it, you need to click on Run button under Staging cube.  You will see that the status flipped to “Initializing”.  It might take few minutes for the status to change to “Ready”.  You can test your application by navigating to your staging Web Site URL.

Next logical step after you tested our application on staging is to promote it to production.  It’s very easy done by clicking on a circle with two arrows inside.  If you need more clues to find the circle, it’s between Production and Staging cubes.  You don’t actually move the application to different place.  After you click on the circle, Windows Azure just flips production and staging environments.  The old staging environment becomes our new production one and vice versa.

image It takes only few moments to promote from staging to production because Windows Azure makes only small configuration change.

Now I can point my browser to http://learnazurewithme.cloudapp.net/ to use my perfectly useless application.

image

Summary

In this article, we learned how to create a simple Azure application.  We also talked about new files and references that need to be added in order to run our app. in the cloud.  Now you can tell all of your friends how to setup and deploy the Windows Azure application.

Next, we’re going to learn how to use Azure Service Configuration.

kick it on DotNetKicks.com

Posted in Azure, Tutorial | Tagged: | 4 Comments »

Learning Azure Local Storage with me.

Posted by Vadim on January 10, 2010

Azure has many different storages.  If you start Azure fabric and look at Development Storage UI you can see Blob, Queue, and Table Storage.  In addition to that Windows Azure also has SQL Azure.

image

There’s also Local Storage and that is what I want to talk about. Local Storage is a temporary file system storage area.  If you didn’t get from previous  sentence, it’s a temporary storage.  Local Storage also available to a single role instance and cannot be shared across multiple role instances.  What does it mean for you?  It means that you should not store any data that you want to be persistent for a long time.  If you upgrade a role instance or your instance dies, you will never see the data in the Local Storage again.  All important data you should store in Blob, Table Storage or SQL Azure.  Advantage of Local Storage is that it’s faster than other storage mechanisms mentioned earlier.  Blobs, Table Storage and SQL Azure are located on different servers than your Azure VM.  Local Storage is on the same VM where the role instance is running, therefore you’re going to have less latency.  I read somewhere that the maximum size of Local Storage is 20GB for a single role instance.  However, when I tried to create a Local Storage of 100GB, I was successful.

I think that now we have pretty good idea what Local Storage is.

Let’s set up Local Storage.

You can set up Local Storage by either modifying the definition file (.csdef) or by using GUI when modifying the role properties.

Set up by modifying .csdef file.

Let’s create a Local Storage named “lessonStorage” that is 20 MB.

image

We can place multiple LocaStorage elements inside LocalResources.  As you can see it’s not hard to create Local Storage by hand but it’s even easier to create it using GUI.

Set up using GUI.

Just right click on the role in your Azure project (it’s inside the Roles folder) and select Properties… or press Alt+Enter.  In the properties window select Local Storage tab.

image

As you can see you don’t need a Computer Science degree to change these values.  There’s one extra property “Clean on Role Recycle”.  By default it’s true.  When you check “Clean on Role Recycle”, the temporary data will be deleted when the role is recycled.  There are few conditions when a role can recycle:

  • The application executes RoleEnvironment.RequestRecycle() method.
  • A catastrophic failure on the server.
  • Upgrade to the application.

When you modify it by hand in definition file, you need to add cleanOnRoleRecycle attribute.

<LocalStorage name="lessonStorage" sizeInMB="20" cleanOnRoleRecycle="true" />

How to use Local Storage?

In code to get access to Local Storage we just need to use static GetLocalResource method that takes only one parameter a name of our Local Storage. 

This method returns a LocalResource object.  LocalResource class has three properties:

Property Name Description
Name The name of the local storage.  We defined it in our definition file.  In our case it’s “lessonStorage”.
MaximumSizeInMegabytes The maximum size in megabytes allocated for the local storage.  In our definition file we allocated 20 MB.
RootPath The full directory path to the local storage.

 

All of the properties above are read-only properties, we cannot set them at runtime.

We are going to create Lesson.txt file that will contain only one line “First Lesson”.  Than using Local Storage we will print content of that file in the browser.

First let’s add a label that will be the content of Lesson.txt file to our Default.aspx file:

 

<body>
    <form id="form1" runat="server">
    <div>
        Local Storage file content: <b><asp:Label ID="fileContent" runat="server" /></b>
    </div>
    </form>
</body>

 

Next we are going to put code in Page_Load method to create Lesson.txt file and than display it’s content using Local Storage.

using System;
using System.IO;
using System.Web.UI;
using Microsoft.WindowsAzure.ServiceRuntime;

namespace LocalStorageWeb
{
    public partial class _Default : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            LocalResource myStorage = RoleEnvironment.GetLocalResource("lessonStorage");
            string filePath = Path.Combine(myStorage.RootPath, "Lesson.txt");
            File.WriteAllText(filePath, "First Lesson");

            fileContent.Text = File.ReadAllText(filePath);
        }
    }
}

In order to have access to RoleEnvironment we added using statement on line #4.

The result after execution of this code:

image

I told you almost everything I know about Local Storage.  If I missed anything or said something incorrect, please let me know so I can learn.

kick it on DotNetKicks.com

Posted in .Net, Azure | Tagged: | 13 Comments »

Why Azure Web Role by default runs in the Full Trust?

Posted by Vadim on January 10, 2010

When I create an Azure ASP.NET application, by default .NET trust level is Full trust. I always change it to Windows Azure partial trust which is similar to ASP.NET’s medium trust level.

You can do it either by using GUI when you select Properties on the Role

 image

or by setting enableNativeCodeExecution to false in the definition file (.csdef).

image

As a security conscious developer I want by default to run my application in partial trust mode that provides a higher level of security. If I need to use something like Reflection or P/Invoke, as a developer I want to make the decision to lower that trust level by myself.

I’m sure there’s a reason why Microsoft decided to use Full trust as a default .NET trust level, I just fail to see it. If you know the reason, or you think you know it, please let me know.

Because my blog is not the most popular site on internet yet, I also asked the same question on stackoverflow.  If you want to answer it, I don’t care if you choose to reply here or on stackoverflow.

kick it on DotNetKicks.com

Posted in Azure | Tagged: , | Leave a Comment »