Migrating an Application to
Windows Azure
Cloud Dojo
I’m all in.




Cory Fowler
Consultant, ObjectSharp
Microsoft MVP, Windows Azure
@SyntaxC4
http://blog.syntaxc4.net       gettag.mobi
Starter Site: Nerd Dinner


    ASP.NET MVC

    SQL Server

    Entity Framework

    IIS
Resulting Site: Nerd Dinner
   ASP.NET MVC

      SQL Azure

Entity Framework

 Windows Azure

Windows Identity
     Foundation
A Quick word on Tools
Alright, Let’s do this…
Windows Azure!!!
Windows Azure Compute


     JIT Knowledge
A Hosted Service is a container for an Application.
      An Application must consist of at least one Role.
             A Role is Scalable to meet the demand of traffic.
Role




                      Role




                                            Role
       Web                   Worker                VM
        ASP.NET
                             Long Running          Windows Server
          WCF                   Process               2008 R2

        Fast CGI        Emulates Windows     Customized Guest OS
                            Services
       Emulates IIS
Application Roles




                       Web Site
                     Web Site
                   Back-End
                    Web Site
Web Site                            Admin Site
                   Services

   [Web Role]       [Worker Role]      [VM Role]
Convert your Web Application

        To a Web Role
Add Cloud Project

1. Right-Click on Solution File.
2. Hover over Add Menu Item.
3. Click New Project.
4. Select your Language of Choice.
5. Select Cloud.
6. Name your Project and hit OK.
Azurify your Web Application
1. Right-Click on Web Project
2. Click Manage NuGet Packages
3. Filter using Azure Web Role
4. Install Windows Azure Web Role
                  Or
1. Open Package Manager Console
2. Type
Install-Package WindowsAzure.WebRole
-ProjectName NerdDinner                PM>
Associate your Web & Cloud Projects

          1. Right-Click on Roles Folder in Cloud Project.
          2. Click Web Role Project in Solution.
          3. Select the Nerd Dinner Project from the
             Dialog.
          4. Click OK.
What did I just do…?



   JIT Knowledge
Cloud Configuration



ServiceDefinition.csdef
[Life-Time]


ServiceConfiguration.cscfg
[Modifiable]
Service Definition
<?xml version="1.0" encoding="utf-8"?>

<ServiceDefinition name="ExploringServiceDefinition"
xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">

        <WebRole name="" vmsize="ExtraSmall" enableNativeCodeExecution="true">
                <!-- ... -->
        </WebRole>

        <WorkerRole name="" vmsize="ExtraSmall">
                <!-- ... -->
        </WorkerRole>

        <VirtualMachineRole name="" vmsize="ExtraSmall">
                <!-- ... -->
        </VirtualMachineRole>

</ServiceDefinition>
Service Configuration
<ServiceConfiguration serviceName="NerdDinner.Cloud"
       xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration"
       osFamily="2" osVersion="*">

  <Role name="MvcWebRole1">

    <Instances count="1" />

    <ConfigurationSettings>

      <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString"
               value="UseDevelopmentStorage=true" />

    </ConfigurationSettings>

  </Role>

</ServiceConfiguration>
public class WebRole : RoleEntryPoint
{                                                                                     WebRole.cs
    // Included in Both Web and Worker Role Template
    public override bool OnStart()
    {
       RoleEnvironment.Changing += RoleEnvironmentChanging;
       return base.OnStart();
    }
    // Included in Worker Role Template - Still available in Web Role but needs to be overridden
    public override void Run() { base.Run(); }

    // Not Included but available in Web and Worker Roles
    public override void OnStop() { base.OnStop(); }

    // Is not generated ANYWHERE but SHOULD be Implemented
    private static void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e)
    {
        // If a configuration setting is changing
        if (e.Changes.Any(change =>
               change is RoleEnvironmentConfigurationSettingChange))
             e.Cancel = true; // Set e.Cancel to true to restart this role instance
    }
}
Prepare your Database

    For SQL Azure
SQL Azure
                                      Tables, indexes and views
                                      Stored Procedures
1GB, 5GB           10-50GB            Triggers
                                      Constraints
                                      Table variables,
                                       session temp tables (#t)
Web Edition     Business Edition      Spatial types, HierarchyId
                                      Data Types
         Feature Set                     XML, Sparse Columns, Filestream
                                      Partitions
                                      Full-text indexes
                                      SQL-CLR
Attach NerdDinner Database

1. Open SQL Server Management Studio (SSMS)
2. Connect to .SQLExpress
3. Right-Click on Databases
4. Click Attach…
5. Find NerdDinner.mdf in App_Data
6. Click OK
Generate Scripts for SQL Azure
    1. Right-Click Attached NerdDinner Database
    2. Click Tasks
    3. Click Generate Scripts…

                          4. Change Database Engine Type to
                             SQL Azure
                          5. Click OK
                          6. Click Finish
Connect to SQL Azure




https://<servername>.database.windows.net             [SSMS]
Create SQL Azure Database
New-SqlAzureServer
  -SubscriptionId               1. Sign in to Windows Azure Portal
  -Certificate                  2. Open SQL Azure Section
  -AdministratorLogin           3. Create Server
  -AdministratorLoginPassword       a) Select Region
  -Location                         b) Create Administration Credentials
                                    c) Add Firewall Rules
                                4. Create Database
                                    a) Enter Database name
                                    b) Click OK
                                5. Copy Connection String from Properties


                                Powershell for Firewall Rules: http://bit.ly/qCvdpN
Run the NerdDinner Scripts



1. Open [ File | Script ] NerdDinner.sql
2. Execute Script
Cloud Aware Configuration

  web
.config
                           ConnectionStringResolver
                             .Create()
                             .WithCloudConnectionStringName
                                      ("NerdDinnerEntities")
                             .WithLocalConnectionStringName
                                      ("NerdDinnerEntities")
 Cloud                       .ConnectionString
Service
 .cscfg




                   Get it on GitHub: http://bit.ly/r7Hvj0
A Quick Note on Data Migration

Tools
DTS Wizard (SSIS)
http://bit.ly/gzLsl9

BCP Utility
http://bit.ly/bQdAIn

Import/Export
[Blog on Import/Export CTP]
                                      SQL Azure Data Sync
What About AuthN?

SQL Azure   Windows Azure Storage   Claims Based
SQL Membership Approach

PM> Install-Package System.Web.Providers



           Remember aspnet_regsql?

Download the Updated SQL Azure supported Scripts

               http://bit.ly/gB5DIt
Windows Azure Storage
http[s]://account.*.core.windows.net   Account      Container    Item
                                                      images
     BLOB Storage                      NerdDinner                  Blobs
                                                      videos

                                                     locations
     TABLE Storage                     NerdDinner                  Entities
                                                     dinners

                                                       rsvp
     QUEUE[S] Storage                  NerdDinner                  Messages
                                                      resize
** Experimental **
                                          Windows Azure Storage
                                          Membership Approach
<membership defaultProvider="TableStorageMembershipProvider">
  <providers>
   <clear />
     <add name="TableStorageMembershipProvider“
            type="Microsoft.Samples.ServiceHosting.AspProviders.TableStorageMembershipProvider"
            description="Membership provider using table storage"
            applicationName="/"
            enablePasswordRetrieval="false"
            enablePasswordReset="true"
            requiresQuestionAndAnswer="false"
            minRequiredPasswordLength="1"
            minRequiredNonalphanumericCharacters="0"
            requiresUniqueEmail="true"
            passwordFormat="Hashed"
            allowInsecureRemoteEndpoints="true" />
  </providers>
 </membership>                                       Download ASP.NET Samples: http://bit.ly/pEguoW
Claims Based Authentication
      Windows Azure Access Control Service



      ACS (v2.0) enables AuthN with:

         Active Directory Federation Service [ADFS]
         Facebook
         Google
         LiveID
         Yahoo!
         WS-Fed
         WS-Trust
How Does Claims Based AuthN Work?



          JIT Knowledge
Google ID                      Application




                                                            0.2 No Auth




               3. Send claims

Customer                              Access Control Services
           0.3 Redirect to provider
4. Normalize identity

                   Access Control Services



                                                 7. Consume identity

                                                           Your App

                                                             Claims
                                                           Framework

                6. Send identity
Customer                                     Application
ACS Friendly AuthN Screen
Changing this…




                    Into this…
Create Access Control Namespace
1. Open the Windows Azure Platform Portal
2. Select Service bus, Access Control & Caching from the lower
   left-hand menu
3. Click New
4. Ensure Access Control is selected


                                       5. Provide a Namespace for your AppFabric
                                          Endpoint
                                       6. Click Check Availability
                                       7. Select a Region
                                       8. Click Create Namespace
                                       9. Click on Manage Access Control Service
Add an Identity Provider


1. Select Identity Provider (IP)
    i. Google
    ii. Yahoo!
2. Click Next
3. Add path to IP Logo
4. Click Save
Create Relying Party Application

1. Enter Name
2. Enter Realm [localhost is allowed]
3. Enter Return URL [localhost is allowed]
4. Select SAML 1.1
5. Select Identity providers
    i. Google
    ii. Windows Live
6. Select Create new rule group
7. Select Use service namespace certificate
Enable Claims-Based AuthN



                                           1. In Visual Studio. Tools > Add STS Reference
                                           2. Ensure the Web.config location is correct
                                           3. Enter the Application Url




Requires Windows Identity Foundation SDK
Enable Claims-Based AuthN

     4. Select Use an existing STS
     5. Login to Windows Azure Portal
     6. Navigate to ACS Menu
     7. Select AppFabric endpoint
     8. Click manage ACS Service
     9. Click on Application integration
     10. Select & Copy WS-Federation Metadata Url
     11. Switch back to Federation Utility
     12. Paste Endpoint in Textbox
     13. Next through the remainder of the Tool.
MVC WS-Federation Fix




       PM> Install-Package SyntaxC4.WindowsAzure.ACSManagement.Mvc

<httpRuntime requestValidationType=
"SyntaxC4.WindowsAzure.ACSManagement.Mvc.WsFederationRequestValidator" />
Include WIF in cspkg


Copy Local = True isn’t enough in this case



Specific Version must be False
Home Realm Discovery Wrapped Up!

             Home Realm Discovery is the act of retrieving a list of the Identity
                    Providers that are available to your application.


              PM> Install-Package SyntaxC4.WindowsAzure.ACSManagement


public ActionResult LogOn()
{
   var manager = new ACSServiceManager("nerddinnerc4", "http://127.0.0.1:81/");
   IIdentityProvider[] providers = manager.GetIdentityProviders<IdentityProvider>();
   return View(providers);
}
Create a Custom Login Screen


<ul class="login">
     <% foreach (var ip in Model)
        { %>
        <li class="login-item">
              <object data="<%: ip.ImageUrl %>"
                   onclick="javascript:location.href='<%: ip.LoginUrl %>'">
                  <a href="<%: ip.LoginUrl %>" class="login-item-link">
                       <%: ip.Name %></a>
              </object>
             </li>
     <% } %>
</ul>
To the Cloud!
Publish to Windows Azure
1. Right-Click on Cloud Project
2. Select Publish…
3. Select <Add…> from Credentials Dropdown list
    a) Give Certificate a Friendly Name
    b) Copy Certificate Path
    c) Upload Certificate to Management Portal
    d) Paste SubscriptionId into dialog

                        4. Select Deployment Environment
                        5. Select Storage Account
                        6. Select Cloud Service
                           Configuration
                        7. Select Release Build
                           Configuration
                        8. Click Publish
Dinner Time!
Next Steps…




Geo-Distributed
                  Decrease Latency with
       with                                    Phone App?
                   Windows Azure CDN
Traffic Manager
Cloudy Reading
Resources

Blog                                    http://blog.syntaxc4.net
GitHub                                  http://github.com/syntaxc4


Windows Azure Platform Training Kit     http://bit.ly/jXfyyD
Windows Azure Powershell Cmdlets        http://bit.ly/m75gEc
Windows Azure Tools                     http://bit.ly/miooC4


Cloud Cover Show                        http://bit.ly/g4nQbT
Essential Resources for Windows Azure   http://bit.ly/efmzGo

C fowler azure-dojo

  • 1.
    Migrating an Applicationto Windows Azure Cloud Dojo
  • 2.
    I’m all in. CoryFowler Consultant, ObjectSharp Microsoft MVP, Windows Azure @SyntaxC4 http://blog.syntaxc4.net gettag.mobi
  • 3.
    Starter Site: NerdDinner ASP.NET MVC SQL Server Entity Framework IIS
  • 4.
    Resulting Site: NerdDinner ASP.NET MVC SQL Azure Entity Framework Windows Azure Windows Identity Foundation
  • 5.
    A Quick wordon Tools
  • 6.
  • 7.
  • 8.
  • 9.
    A Hosted Serviceis a container for an Application. An Application must consist of at least one Role. A Role is Scalable to meet the demand of traffic.
  • 10.
    Role Role Role Web Worker VM ASP.NET Long Running Windows Server WCF Process 2008 R2 Fast CGI Emulates Windows Customized Guest OS Services Emulates IIS
  • 11.
    Application Roles Web Site Web Site Back-End Web Site Web Site Admin Site Services [Web Role] [Worker Role] [VM Role]
  • 12.
    Convert your WebApplication To a Web Role
  • 13.
    Add Cloud Project 1.Right-Click on Solution File. 2. Hover over Add Menu Item. 3. Click New Project. 4. Select your Language of Choice. 5. Select Cloud. 6. Name your Project and hit OK.
  • 14.
    Azurify your WebApplication 1. Right-Click on Web Project 2. Click Manage NuGet Packages 3. Filter using Azure Web Role 4. Install Windows Azure Web Role Or 1. Open Package Manager Console 2. Type Install-Package WindowsAzure.WebRole -ProjectName NerdDinner PM>
  • 15.
    Associate your Web& Cloud Projects 1. Right-Click on Roles Folder in Cloud Project. 2. Click Web Role Project in Solution. 3. Select the Nerd Dinner Project from the Dialog. 4. Click OK.
  • 16.
    What did Ijust do…? JIT Knowledge
  • 17.
  • 18.
    Service Definition <?xml version="1.0"encoding="utf-8"?> <ServiceDefinition name="ExploringServiceDefinition" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> <WebRole name="" vmsize="ExtraSmall" enableNativeCodeExecution="true"> <!-- ... --> </WebRole> <WorkerRole name="" vmsize="ExtraSmall"> <!-- ... --> </WorkerRole> <VirtualMachineRole name="" vmsize="ExtraSmall"> <!-- ... --> </VirtualMachineRole> </ServiceDefinition>
  • 19.
    Service Configuration <ServiceConfiguration serviceName="NerdDinner.Cloud" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="2" osVersion="*"> <Role name="MvcWebRole1"> <Instances count="1" /> <ConfigurationSettings> <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="UseDevelopmentStorage=true" /> </ConfigurationSettings> </Role> </ServiceConfiguration>
  • 20.
    public class WebRole: RoleEntryPoint { WebRole.cs // Included in Both Web and Worker Role Template public override bool OnStart() { RoleEnvironment.Changing += RoleEnvironmentChanging; return base.OnStart(); } // Included in Worker Role Template - Still available in Web Role but needs to be overridden public override void Run() { base.Run(); } // Not Included but available in Web and Worker Roles public override void OnStop() { base.OnStop(); } // Is not generated ANYWHERE but SHOULD be Implemented private static void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e) { // If a configuration setting is changing if (e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange)) e.Cancel = true; // Set e.Cancel to true to restart this role instance } }
  • 21.
  • 22.
    SQL Azure  Tables, indexes and views  Stored Procedures 1GB, 5GB 10-50GB  Triggers  Constraints  Table variables, session temp tables (#t) Web Edition Business Edition  Spatial types, HierarchyId  Data Types Feature Set  XML, Sparse Columns, Filestream  Partitions  Full-text indexes  SQL-CLR
  • 23.
    Attach NerdDinner Database 1.Open SQL Server Management Studio (SSMS) 2. Connect to .SQLExpress 3. Right-Click on Databases 4. Click Attach… 5. Find NerdDinner.mdf in App_Data 6. Click OK
  • 24.
    Generate Scripts forSQL Azure 1. Right-Click Attached NerdDinner Database 2. Click Tasks 3. Click Generate Scripts… 4. Change Database Engine Type to SQL Azure 5. Click OK 6. Click Finish
  • 25.
    Connect to SQLAzure https://<servername>.database.windows.net [SSMS]
  • 26.
    Create SQL AzureDatabase New-SqlAzureServer -SubscriptionId 1. Sign in to Windows Azure Portal -Certificate 2. Open SQL Azure Section -AdministratorLogin 3. Create Server -AdministratorLoginPassword a) Select Region -Location b) Create Administration Credentials c) Add Firewall Rules 4. Create Database a) Enter Database name b) Click OK 5. Copy Connection String from Properties Powershell for Firewall Rules: http://bit.ly/qCvdpN
  • 27.
    Run the NerdDinnerScripts 1. Open [ File | Script ] NerdDinner.sql 2. Execute Script
  • 28.
    Cloud Aware Configuration web .config ConnectionStringResolver .Create() .WithCloudConnectionStringName ("NerdDinnerEntities") .WithLocalConnectionStringName ("NerdDinnerEntities") Cloud .ConnectionString Service .cscfg Get it on GitHub: http://bit.ly/r7Hvj0
  • 29.
    A Quick Noteon Data Migration Tools DTS Wizard (SSIS) http://bit.ly/gzLsl9 BCP Utility http://bit.ly/bQdAIn Import/Export [Blog on Import/Export CTP] SQL Azure Data Sync
  • 30.
    What About AuthN? SQLAzure Windows Azure Storage Claims Based
  • 31.
    SQL Membership Approach PM>Install-Package System.Web.Providers Remember aspnet_regsql? Download the Updated SQL Azure supported Scripts http://bit.ly/gB5DIt
  • 32.
    Windows Azure Storage http[s]://account.*.core.windows.net Account Container Item images BLOB Storage NerdDinner Blobs videos locations TABLE Storage NerdDinner Entities dinners rsvp QUEUE[S] Storage NerdDinner Messages resize
  • 33.
    ** Experimental ** Windows Azure Storage Membership Approach <membership defaultProvider="TableStorageMembershipProvider"> <providers> <clear /> <add name="TableStorageMembershipProvider“ type="Microsoft.Samples.ServiceHosting.AspProviders.TableStorageMembershipProvider" description="Membership provider using table storage" applicationName="/" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" minRequiredPasswordLength="1" minRequiredNonalphanumericCharacters="0" requiresUniqueEmail="true" passwordFormat="Hashed" allowInsecureRemoteEndpoints="true" /> </providers> </membership> Download ASP.NET Samples: http://bit.ly/pEguoW
  • 34.
    Claims Based Authentication Windows Azure Access Control Service ACS (v2.0) enables AuthN with:  Active Directory Federation Service [ADFS]  Facebook  Google  LiveID  Yahoo!  WS-Fed  WS-Trust
  • 35.
    How Does ClaimsBased AuthN Work? JIT Knowledge
  • 36.
    Google ID Application 0.2 No Auth 3. Send claims Customer Access Control Services 0.3 Redirect to provider
  • 37.
    4. Normalize identity Access Control Services 7. Consume identity Your App Claims Framework 6. Send identity Customer Application
  • 38.
    ACS Friendly AuthNScreen Changing this… Into this…
  • 39.
    Create Access ControlNamespace 1. Open the Windows Azure Platform Portal 2. Select Service bus, Access Control & Caching from the lower left-hand menu 3. Click New 4. Ensure Access Control is selected 5. Provide a Namespace for your AppFabric Endpoint 6. Click Check Availability 7. Select a Region 8. Click Create Namespace 9. Click on Manage Access Control Service
  • 40.
    Add an IdentityProvider 1. Select Identity Provider (IP) i. Google ii. Yahoo! 2. Click Next 3. Add path to IP Logo 4. Click Save
  • 41.
    Create Relying PartyApplication 1. Enter Name 2. Enter Realm [localhost is allowed] 3. Enter Return URL [localhost is allowed] 4. Select SAML 1.1 5. Select Identity providers i. Google ii. Windows Live 6. Select Create new rule group 7. Select Use service namespace certificate
  • 42.
    Enable Claims-Based AuthN 1. In Visual Studio. Tools > Add STS Reference 2. Ensure the Web.config location is correct 3. Enter the Application Url Requires Windows Identity Foundation SDK
  • 43.
    Enable Claims-Based AuthN 4. Select Use an existing STS 5. Login to Windows Azure Portal 6. Navigate to ACS Menu 7. Select AppFabric endpoint 8. Click manage ACS Service 9. Click on Application integration 10. Select & Copy WS-Federation Metadata Url 11. Switch back to Federation Utility 12. Paste Endpoint in Textbox 13. Next through the remainder of the Tool.
  • 44.
    MVC WS-Federation Fix PM> Install-Package SyntaxC4.WindowsAzure.ACSManagement.Mvc <httpRuntime requestValidationType= "SyntaxC4.WindowsAzure.ACSManagement.Mvc.WsFederationRequestValidator" />
  • 45.
    Include WIF incspkg Copy Local = True isn’t enough in this case Specific Version must be False
  • 46.
    Home Realm DiscoveryWrapped Up! Home Realm Discovery is the act of retrieving a list of the Identity Providers that are available to your application. PM> Install-Package SyntaxC4.WindowsAzure.ACSManagement public ActionResult LogOn() { var manager = new ACSServiceManager("nerddinnerc4", "http://127.0.0.1:81/"); IIdentityProvider[] providers = manager.GetIdentityProviders<IdentityProvider>(); return View(providers); }
  • 47.
    Create a CustomLogin Screen <ul class="login"> <% foreach (var ip in Model) { %> <li class="login-item"> <object data="<%: ip.ImageUrl %>" onclick="javascript:location.href='<%: ip.LoginUrl %>'"> <a href="<%: ip.LoginUrl %>" class="login-item-link"> <%: ip.Name %></a> </object> </li> <% } %> </ul>
  • 48.
  • 49.
    Publish to WindowsAzure 1. Right-Click on Cloud Project 2. Select Publish… 3. Select <Add…> from Credentials Dropdown list a) Give Certificate a Friendly Name b) Copy Certificate Path c) Upload Certificate to Management Portal d) Paste SubscriptionId into dialog 4. Select Deployment Environment 5. Select Storage Account 6. Select Cloud Service Configuration 7. Select Release Build Configuration 8. Click Publish
  • 50.
  • 51.
    Next Steps… Geo-Distributed Decrease Latency with with Phone App? Windows Azure CDN Traffic Manager
  • 52.
  • 53.
    Resources Blog http://blog.syntaxc4.net GitHub http://github.com/syntaxc4 Windows Azure Platform Training Kit http://bit.ly/jXfyyD Windows Azure Powershell Cmdlets http://bit.ly/m75gEc Windows Azure Tools http://bit.ly/miooC4 Cloud Cover Show http://bit.ly/g4nQbT Essential Resources for Windows Azure http://bit.ly/efmzGo