<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Girish's Blog - Are you developing ON the cloud?</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/girishp/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/girishp/feed.xml</link>
    <description>Cloud, Cloud, Cloud</description>
    <lastBuildDate>Sat, 08 Sep 2018 13:42:31 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Using Azure CLI to open Kubernetes dashboard</title>
      <link>https://docs.microsoft.com/archive/blogs/girishp/using-azure-cli-to-open-kubernetes-dashboard</link>
      <pubDate>Sat, 08 Sep 2018 13:41:00 GMT</pubDate>
      <dc:creator><![CDATA[gpillai]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/girishp/?p=2005</guid>
      <description><![CDATA[Often times you want to open the Azure Kubernetes(K8S) dashboard, after you created the Kubernetes...]]></description>
      <content:encoded><![CDATA[Often times you want to open the Azure Kubernetes(K8S) dashboard, after you created the Kubernetes cluster then deployed your app into it. When you go to the azure portal and open up the blade for the K8S dashboard, you will see the following. However this is not the full sequence. <strong>Please Note:</strong> For the pics below please click on them to see the picture with clear resolution.

<a href="https://msdnshared.blob.core.windows.net/media/2018/09/K8s-1.png"><img width="300" height="169" class="alignnone size-medium wp-image-2015" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/09/K8s-1-300x169.png" /></a>

This post tries to capture the additional Steps.
<ol>
 	<li>First download the CLI as mentioned in the above pic.</li>
 	<li>Login from the Azure CLI</li>
 	<li>Second set your active/default subscription to the correct one.</li>
 	<li>Then get the cluster credentials.</li>
 	<li>Open the K8S dashboard.</li>
</ol>
The below screen captures these in sequence.

Open an Admin Command Prompt to run these in sequence.
<h3>Download the Azure CLI, and install it and login interactively.</h3>
&nbsp;

<a href="https://msdnshared.blob.core.windows.net/media/2018/09/cli-login-2.png"><img width="300" height="146" class="alignnone size-medium wp-image-2055" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/09/cli-login-2-300x146.png" /></a>

Open the browser and enter the code to complete the login.

<a href="https://msdnshared.blob.core.windows.net/media/2018/09/cli-login.png"><img width="300" height="169" class="alignnone size-medium wp-image-2045" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/09/cli-login-300x169.png" /></a>

Close the browser window and come back to the command prompt.
<h3>Setting your active/default subscription to the correct subscription, get credentials and launch tunnel to cluster.</h3>
<a href="https://msdnshared.blob.core.windows.net/media/2018/09/aks-dahsboard-11.png"><img width="300" height="169" class="alignnone size-medium wp-image-2075" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/09/aks-dahsboard-11-300x169.png" /></a>

Browse to cluster dashboard.

<a href="https://msdnshared.blob.core.windows.net/media/2018/09/aks-dahsboard-2.png"><img width="300" height="233" class="alignnone size-medium wp-image-2035" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/09/aks-dahsboard-2-300x233.png" /></a>

&nbsp;

This is the complete sequence I had to do before I could get to the cluster dashboard.]]></content:encoded>
    </item>
    <item>
      <title>Adding SQL IaaS extension into a disconnected Azure Stack</title>
      <link>https://docs.microsoft.com/archive/blogs/girishp/adding-sql-iaas-extension-into-a-disconnected-azure-stack</link>
      <pubDate>Tue, 04 Sep 2018 22:23:50 GMT</pubDate>
      <dc:creator><![CDATA[gpillai]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/girishp/?p=1995</guid>
      <description><![CDATA[Azure Stack can operate in a connected fashion (meaning with an internet connection with Azure AD as...]]></description>
      <content:encoded><![CDATA[Azure Stack can operate in a connected fashion (meaning with an internet connection with Azure AD as the identity provider) OR can operate in a disconnected fashion with no internet connection but federated via ADFS with an on premises AD. We are talking about the latter scenario here.

So you wanted to create SQL Servers or make available SQL servers in your Azure Stack "Marketplace". The first step to do that would be to find a way to populate the marketplace. This link below gives you the details on how to download the marketplace items from "public" Azure before you can then upload it into the disconnected Azure Stack's marketplace.

<a href="https://docs.microsoft.com/en-us/azure/azure-stack/azure-stack-download-azure-marketplace-item#disconnected-or-a-partially-connected-scenario">Download Marketplace items in a disconnected scenario</a>

Unlike connected scenario, where you just click on the link "Add from Azure", and everything happens automagically,  in the case of disconnected deployments of Azure Stack it is not as easy and straightforward to populate the Azure Stack marketplace.

In this blog we are specifically talking about populating the stack's marketplace for enabling your end users to create SQL Server IaaS VMs. Note that SQL Server requires an extension, before the SQL Server can be provisioned. We are specifically talking about how to get this extension in place, so that SQL Server can be deployed.

<span style="color: #000000;font-family: Calibri">In general the BYOL and Pay-As-You-Go images which you downloaded from public Azure marketplace and then uploaded into stack, would show up in the Azure Stack marketplace. </span>

<span style="color: #000000;font-family: Calibri">However, the SQL IaaS <i>should not(will not) </i>show up in the marketplace, it is not deployable from the Add Extension UX directly. It can only be deployed from a template or when using one of the marketplace SQL VM offers.</span>

<span style="color: #000000;font-family: Calibri">For the specific case of adding this into the Azure Stack marketplace, the offline syndication documentation does not have enough information to lead to a successful upload.</span><span style="color: #000000;font-family: Calibri"> </span>

<span style="color: #b00000;font-family: Calibri">The below is the correct PowerShell for the current extension. Replace the URI for the storage blob.</span>

<b><span><span style="font-family: Calibri"></span><span style="color: #b00000"></span>Add-AzsVmExtension</span></b><span> </span><span>-</span><span>VmOsType Windows </span><span>-</span><span>ComputeRole IaaS  </span><span>-</span><span>Publisher Microsoft.SqlServer.Management </span><span>-</span><span>Type SqlIaaSAgent </span><span>-</span><span>Version  </span><span>1.30</span><span>.</span><span>0.0</span><span> </span><span>-</span><span>SourceBlob </span><span>"&lt;<em>customer’s blob location</em>&gt;"</span><span></span>

Ofcourse make sure to have the correct version of PowerShell and as well as to import the Compute Admin module of the powershell before firing the above powershell. Once this is done, you should be able to provision a SQL Server in an Azure Stack subscription.]]></content:encoded>
    </item>
    <item>
      <title>Oh! No! The Azure EA portal converted my MSDN/VSTS subscription into EA subcription</title>
      <link>https://docs.microsoft.com/archive/blogs/girishp/oh-no-the-azure-ea-portal-converted-my-msdnvsts-subscription-into-ea-subcription</link>
      <pubDate>Fri, 08 Jun 2018 02:26:00 GMT</pubDate>
      <dc:creator><![CDATA[gpillai]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/girishp/?p=1965</guid>
      <description><![CDATA[I ran into a customer situation where when the customer went to the Azure Enterprise Agreement (EA)...]]></description>
      <content:encoded><![CDATA[<span style="color: #000000;font-family: Calibri">I ran into a customer situation where when the customer went to the Azure Enterprise Agreement (EA) portal and made himself an account owner and then created subscriptions, his existing MSDN/VSTS based Azure subscription got converted into an Azure EA subscription. Of course this was not a great outcome. </span>
<h1><span style="color: #2f5496;font-family: Calibri Light;font-size: x-large">Root Cause of this issue.</span></h1>
<span style="color: #000000;font-family: Calibri">The reason this happened is because the account with which the customer had logged into the Azure EA portal was also the owner of the MSDN subscription. So, when you do this, it will give a prominent warning as below.</span>

<span lang="ES"><span style="color: #000000;font-family: Times New Roman"><a href="https://msdnshared.blob.core.windows.net/media/2018/06/ea.png"><img width="289" height="300" class="alignnone size-medium wp-image-1975" alt="" src="https://msdnshared.blob.core.windows.net/media/2018/06/ea-289x300.png" /></a><img width="484" height="503" src="/Users/gpillai/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png" /></span></span>

<span style="color: #000000;font-family: Calibri"> </span>

<span style="color: #000000;font-family: Calibri">(Prior to this customer changed the “alternate account” of the MSDN/VSTS subscription to another account – but it seemed the change took time to be effective in the backend). Anyway, as mentioned before if you are logged in with the same account as the MSDN subscription account and made yourself an account owner, then all MSDN subscriptions that are tied to that account will be converted to an Azure EA subscriptions. Now in some customer environments this is perfectly OK and in some situations, customers might not want the automatic conversions and would want to maintain their MSDN subscriber benefits separate from Azure EA benefits. Both are perfectly valid, and we are discussing how to keep the separation. </span>

<span style="font-family: Calibri"><span style="color: #000000">Users can use their AAD credentials or MSA to activate their Visual Studio subscription. They can also add an </span><a href="https://docs.microsoft.com/en-us/visualstudio/subscriptions/vs-alternate-identity">alternate identity</a><span style="color: #000000"> if needed. They can activate the </span><a href="https://azure.microsoft.com/en-us/pricing/member-offers/credit-for-visual-studio-subscribers/">monthly Azure credit</a></span><span style="color: #000000;font-family: Calibri"> they get as a benefit with that VS subscription using either identity (but they only get the monthly credit once).</span><span></span>

<span style="font-family: Calibri"><span style="color: #000000">When they do activate their monthly credit, they <b>cannot</b> also be an Account Owner on their EA. Account Owners are those people who are authorized to create Azure subscriptions tied to the EA. This EA role is unrelated to ownership of VSTS accounts and is also separate from the </span><a href="https://docs.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#owner">Owner</a></span><span style="color: #000000;font-family: Calibri"> role for an Azure subscription. EA customers who assign Visual Studio subscriptions to users using their AAD identities should avoid adding these same users as (Azure) Account Owners on their EA. </span>
<h1><span style="color: #2f5496;font-family: Calibri Light;font-size: x-large">How to Prevent this: -</span></h1>
<span style="color: #000000;font-family: Calibri">The <b>best approach</b> would instead be to have others (i.e., those who don’t have a Visual Studio subscription OR use an account that does not have a Visual Studio subscription tied to it) be added as Account Owners on the EA and for those accounts to create the Azure subscriptions needed by the development teams. Once the Azure subscription is created, the Account Owner will by default have the owner role on that Azure subscription and can add others with the owner role as well—so they could add the Visual Studio subscriber’s AAD identity as an owner on the Azure subscription and everything works end-to-end for the subscriber using their AAD identity without losing the monthly Azure credit.</span>
<h1><span style="color: #2f5496;font-family: Calibri Light;font-size: x-large">Process to backtrack</span></h1>
<span style="color: #000000;font-family: Calibri">Best approach if you already had caused the monthly credit benefit Azure subscription to be converted onto their EA (and thus to lose the monthly credit) is to do as follows. (Note the below requires creating a support ticket)</span>

<span style="color: #000000"><span><span style="font-family: Calibri">1)</span><span style="font: 7pt 'Times New Roman';margin: 0px">      </span></span><span><span style="font-family: Calibri">Unassign the VS subscription from the user’s existing identity</span></span></span>

<span style="color: #000000"><span><span style="font-family: Calibri">2)</span><span style="font: 7pt 'Times New Roman';margin: 0px">      </span></span><span><span style="font-family: Calibri">Reassign the VS subscription to a different identity for the user, an identity that is not an Account Owner on their EA.</span></span></span>

<span style="color: #000000"><span><span style="font-family: Calibri">3)</span><span style="font: 7pt 'Times New Roman';margin: 0px">      </span></span><span><span style="font-family: Calibri">Then the user can activate their monthly Azure credit anew, using this different identity.</span></span></span>

<span style="color: #000000;font-family: Calibri"> </span>

<span style="color: #000000;font-family: Calibri"> </span>]]></content:encoded>
    </item>
    <item>
      <title>Disk partition in Azure VMs - using ARM Templates to specify disk configurations</title>
      <link>https://docs.microsoft.com/archive/blogs/girishp/disk-partition-in-azure-vms-using-arm-templates-to-specify-disk-configurations</link>
      <pubDate>Thu, 17 May 2018 03:25:06 GMT</pubDate>
      <dc:creator><![CDATA[gpillai]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/girishp/?p=1955</guid>
      <description><![CDATA[It is considered a best practice to define your Azure Resources using ARM Templates. We all know...]]></description>
      <content:encoded><![CDATA[It is considered a best practice to define your Azure Resources using ARM Templates. We all know that. But what about in-VM configurations that you needed like say disk partitions, and other similar things.

Well it turns out you can specify such post VM instantiation configuration changes, which are actually not executed by ARM proper but by the OS itself once stood up. However the good thing is, you can use the vehicle/medium of an ARM template to specify these configuration changes. One could also use <a href="https://docs.microsoft.com/en-us/powershell/dsc/overview">PowerShell DSC</a> OR <a href="https://docs.microsoft.com/en-us/azure/automation/automation-dsc-overview">Azure DSC</a> OR <a href="https://docs.microsoft.com/en-us/azure/virtual-machines/extensions/custom-script-windows">Azure platform Custom Script Extension</a> (or Chef, Puppet or Ansible) to do this.

Following are some useful links on this topic.

<span style="font-family: Calibri"><span style="color: #b00000">As mentioned the<span> script itself can be part of the template. Execution happens on the VM and not at the ARM layer.
</span></span></span><span style="color: #000000;font-family: Calibri">Some additional references:-</span>
<ol type="1" start="1">
 	<li style="margin: 0px;color: #000000;font-family: 'Calibri',sans-serif;font-size: 11pt;font-style: normal;font-weight: normal"><span><a href="https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fazure%2Fvirtual-machines%2Fextensions%2Fcustom-script-windows%23extension-schema&amp;data=02%7C01%7Cgpillai%40microsoft.com%7C800c5470799b4af247ab08d5bba03bcb%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636621219234951901&amp;sdata=reVeVgCNqo%2FgsZ%2BRiEdl3%2BW2c%2B43Tu97dL7UzOJh4Gk%3D&amp;reserved=0">Custom Script Extension Schema</a> (Windows)</span></li>
 	<li style="margin: 0px;color: #000000;font-family: 'Calibri',sans-serif;font-size: 11pt;font-style: normal;font-weight: normal"><span><a href="https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fazure%2Fvirtual-machines%2Fextensions%2Fcustom-script-linux%23extension-schema&amp;data=02%7C01%7Cgpillai%40microsoft.com%7C800c5470799b4af247ab08d5bba03bcb%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636621219234961914&amp;sdata=zEMNTbNpTl5Wy4HKe3cCJk1pxBlztR8VL5lewgbFnG4%3D&amp;reserved=0">Custom Script Extension Schema</a> (Linux) </span></li>
 	<li style="margin: 0px;color: #000000;font-family: 'Calibri',sans-serif;font-size: 11pt;font-style: normal;font-weight: normal"><span><a href="https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fazure%2Fvirtual-machines%2Fextensions%2Fcustom-script-windows%23template-deployment&amp;data=02%7C01%7Cgpillai%40microsoft.com%7C800c5470799b4af247ab08d5bba03bcb%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636621219234961914&amp;sdata=AFSaBx6QIlScBl47fBcupZcfs2A5H75mK7nvUeHo230%3D&amp;reserved=0">Template based deployment of Script extensions</a> (Windows)</span></li>
 	<li style="margin: 0px;color: #000000;font-family: 'Calibri',sans-serif;font-size: 11pt;font-style: normal;font-weight: normal"><span><a href="https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fazure%2Fvirtual-machines%2Fextensions%2Fcustom-script-linux%23template-deployment&amp;data=02%7C01%7Cgpillai%40microsoft.com%7C800c5470799b4af247ab08d5bba03bcb%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636621219234971919&amp;sdata=8BBwqATM73yi5DufXjO93XxqHOvugxG6KmCTanCipbw%3D&amp;reserved=0">Template based deployment of Script extensions</a> (Linux) </span></li>
</ol>
There is also another technique where the sequence of commands you needed to be executed can be put inside an inline variable as below and then refer to this variable as the <strong>content </strong>of the configuration that needs to be done on the VM coming up and logging in the first time.
<pre>"&lt;FirstLogonCommands&gt; 
	&lt;SynchronousCommand&gt; 
		&lt;Order&gt;1&lt;/Order&gt; 
		&lt;Description&gt;Create diskpart input file&lt;/Description&gt; 
		&lt;CommandLine&gt; powershell.exe -Command Write-Output \"select disk 2 ' create partition primary ' format quick ' assign \" | Out-File C:\\diskpart.txt 
		&lt;/CommandLine&gt; 
	&lt;/SynchronousCommand&gt; 
	&lt;SynchronousCommand&gt; 
		&lt;Order&gt;2&lt;/Order&gt; 
		&lt;Description&gt;Create formatted partition&lt;/Description&gt; 
		&lt;CommandLine&gt;diskpart.exe /s C:\\diskpart.txt
		&lt;/CommandLine&gt;
	&lt;/SynchronousCommand&gt; 
&lt;/FirstLogonCommands&gt;"</pre>
&nbsp;

In the above fragment we are specifying two commands to be executed in an order. The first one creates the file, whose contents are used/fed to the second command - in this case the disk partition utility - diskpart.exe. These commands are synchronous in nature as opposed to being async, so that order of execution is preserved.

&nbsp;

Putting all of this together, the following is an example of using two inline variables

(a) <strong>unattendAutoLogonXML</strong> and

(b) <strong>unattendFirstRunXML</strong> which are then passed to the WindowsConfiguration to be executed on VM boot.

&nbsp;

&nbsp;

<span style="color: #000000;font-family: Calibri">  "variables": {
</span><span style="font-family: Calibri"><span style="color: #000000"> <span>"<strong>unattendAutoLogonXML</strong>":"[concat('&lt;AutoLogon&gt;&lt;Password&gt;&lt;Value&gt;',parameters('adminPassword'),'&lt;/Value&gt;&lt;/Password&gt;&lt;Domain&gt;&lt;/Domain&gt;&lt;Enabled&gt;true&lt;/Enabled&gt;&lt;LogonCount&gt;1&lt;/LogonCount&gt;&lt;Username&gt;',parameters('adminUsername'),'&lt;/Username&gt;&lt;/AutoLogon&gt;')]",</span></span></span>

<span><span style="color: #000000;font-family: Calibri">    "<strong>unattendFirstRunXML</strong>":"&lt;FirstLogonCommands&gt;&lt;SynchronousCommand&gt;&lt;CommandLine&gt;powershell.exe -Command Write-Output \"select disk 0 ' select partition 1 ' extend\" | Out-File C:\\diskpart.txt&lt;/CommandLine&gt;&lt;Description&gt;Create diskpart input file&lt;/Description&gt;&lt;Order&gt;1&lt;/Order&gt;&lt;/SynchronousCommand&gt;&lt;SynchronousCommand&gt;&lt;CommandLine&gt;diskpart.exe /s C:\\diskpart.txt&lt;/CommandLine&gt;&lt;Description&gt;Extend partition&lt;/Description&gt;&lt;Order&gt;2&lt;/Order&gt;&lt;/SynchronousCommand&gt;&lt;/FirstLogonCommands&gt;",</span></span>

...
...
...<span style="color: #000000;font-family: Calibri">  </span>

<span style="color: #000000;font-family: Calibri">      "osProfile": {</span>

<span style="color: #000000;font-family: Calibri">         "computerName": "[variables('vmName')]",</span>

<span style="color: #000000;font-family: Calibri">          "adminUsername": "[parameters('adminUsername')]",</span>

<span style="color: #000000;font-family: Calibri">          "adminPassword": "[parameters('adminPassword')]",</span>

<span style="color: #000000;font-family: Calibri">          "<strong><em>windowsConfiguration</em></strong>": {</span>

<span style="font-family: Calibri"><span style="color: #000000">             <span>"additionalUnattendContent": [</span></span></span>

<span><span style="color: #000000;font-family: Calibri">               {</span></span>

<span><span style="color: #000000;font-family: Calibri">                    "passName": "oobeSystem",</span></span>

<span><span style="color: #000000;font-family: Calibri">                    "componentName": "Microsoft-Windows-Shell-Setup",</span></span>

<span><span style="color: #000000;font-family: Calibri">                    "settingName": "AutoLogon",</span></span>

<span><span style="color: #000000;font-family: Calibri">                    "content": "[variables('<em><strong>unattendAutoLogonXML</strong></em>')]"</span></span>

<span style="color: #000000;font-family: Calibri">                },</span>

<span style="color: #000000;font-family: Calibri">                {</span>

<span style="font-family: Calibri"><span style="color: #000000">                    <span>"passName": "oobeSystem",</span></span></span>

<span><span style="color: #000000;font-family: Calibri">                    "componentName": "Microsoft-Windows-Shell-Setup",</span></span>

<span><span style="color: #000000;font-family: Calibri">                    "settingName": "FirstLogonCommands",</span></span>

<span><span style="color: #000000;font-family: Calibri">                    "content": "[variables('<em><strong>unattendFirstRunXML</strong></em>')]"</span></span>

<span style="color: #000000;font-family: Calibri">                }</span>

<span style="color: #000000;font-family: Calibri">            ]</span>

<span style="color: #000000;font-family: Calibri">          }</span>]]></content:encoded>
    </item>
    <item>
      <title>Strategies to realizing Cost Savings in Azure</title>
      <link>https://docs.microsoft.com/archive/blogs/girishp/strategies-to-realizing-cost-savings-in-azure</link>
      <pubDate>Thu, 22 Feb 2018 16:38:21 GMT</pubDate>
      <dc:creator><![CDATA[gpillai]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/girishp/?p=1935</guid>
      <description><![CDATA[This is a long post. Please scroll down
Table of Contents

Introduction. 2

Choosing the...]]></description>
      <content:encoded><![CDATA[<pre>This is a long post. Please scroll down</pre>
Table of Contents

Introduction. 2

Choosing the appropriate Compute Option in Azure. 3

Planned (Pro-Active) approach to Compute Optimization. 3

Laying down the scaffolding/structure so VMs are provisioned with cost optimization guidelines. 3

Governance. 4

Naming standards. 5

Using Role Based Access Control (RBAC) 6

Using Azure Policies. 6

Review Resource Group (RG) Costs periodically to mine opportunities for cost reduction. 7

Making use of Tactical platform capabilities. 7

Azure Hybrid User Benefit 7

Use Reserved Instances (RI) 9

Shutdown. 10

Right Sizing. 11

Azure Low Priority VMs. 11

Scaling (Auto) 11

Performance optimization/performance POV. 12

Choose the right storage. 12

Choose the right type of VMs. 13

Choosing the appropriate platform construct 13

REACTIVE Approach - things to do post deployment 14

Azure Advisor. 14

Cloudyn type of tools. 14

Check if deployments can be converted for Reserved Instance(RI) 15

Check if deployments can be converted for AHUB. 1

Study the entities within the RG.. 15

Azure Compute VMs – Capability and Design Guidance. 15

VM Capability Guidance. 16

Azure VM Design Guidance. 22

Usage Analysis Tools. 23

&nbsp;

&nbsp;
<h1><a></a>Introduction</h1>
&nbsp;

This document provides a framework/structured approach to consuming Azure Compute resources. At a high level this is divided into (a) Proactive approach and (b) a tactical/reactive approach to the topic at hand. It is worth noting that beyond the pro-active/reactive approaches described here, studying, and arriving at the appropriate application architecture with the platform native constructs in mind is equally if not more important in optimized usage of all resources (human, time, DevOps cycles, compute costs etc.,). Of course, this should be done much earlier in the life-cycle instead of merely lifting and shifting and then looking for opportunities to save costs. Another important dimension to Azure compute cost savings is taking an organizational view of azure services consumed, and pooling resource usage across applications. Classical examples of this are:

(a)    using SQL Elastic pools if multiple applications use Azure SQL Services

(b)    using fewer App Service Environments (ASE) but packing them to the maximum density with 100s of Azure Web Applications per ASE

&nbsp;
<h2><a></a>Choosing the appropriate Compute Option in Azure</h2>
With a bewildering choice of options, the challenge is to figure out the appropriate if not the most optimum compute choice within the Azure platform for the application/solution that you want to deploy. There is indeed a bewildering choice of compute options in Azure which are wide and varied and cater to a wide variety of application OR rather processing needs. For instance, what compute should one choose for a CPU intensive, or say a memory intensive application(s)?  – In these cases, the choices are easy. What should one choose for Web applications – again there are easy choices. But what should one choose say for a combination of requirements such as (a) highly decomposed and componentized application, (b) sudden bursts, (c) high velocity for the development team when pushing code, (d) where the underlying requirement is to have the appropriate compute (not the old style VM construct) for the task at hand, (e) support cloud native constructs, (f) enable smooth DevOPS, (g) fault tolerance and resilience? This is not an easy task and both Infrastructure architects and application architects should take the time to study and understand the platform capabilities and utilize the correct Azure platform constructs for the solution deployment. Taking the easy approach of deploying to VMs should be the last resort and avoided at best, to save time and money for the long run.

The following link captures some of the well thought out decision criteria depending on the task or tasks the application or solution needs to accomplish.

<a href="https://docs.microsoft.com/en-us/azure/architecture/guide/technology-choices/compute-comparison">Criteria for choosing an Azure Compute Option</a>
<h1><a></a>Planned (Pro-Active) approach to Compute Optimization</h1>
<h2><a></a>Laying down the scaffolding/structure so VMs are provisioned with cost optimization guidelines</h2>
These are things mature organizations do, so that end consumers of azure resources are within well-established guidelines (guard rails). The scaffolding is essentially a framework that is a combination of governance rules (enforce-able) and best practices. The graphic below captures the essential components that are used to build such a scaffolding and bear in mind the evolving nature of the platform, as newer constructs and capabilities get added.

&nbsp;

&nbsp;
<h3></h3>
<h2><a></a>Governance</h2>
When moving to Azure, you must address the topic of governance early to ensure the successful use of the cloud within the enterprise. Unfortunately, the time and bureaucracy of creating a comprehensive governance system means some business groups go directly to vendors without involving enterprise IT. This approach can leave the enterprise open to vulnerabilities if the resources are not properly managed. The characteristics of the public cloud - agility, flexibility, and consumption-based pricing - are important to business groups that need to quickly meet the demands of customers (both internal and external). But, enterprise IT needs to ensure that data and systems are effectively protected.

In real life, scaffolding is used to create the basis of the structure. The scaffold guides the general outline and provides anchor points for more permanent systems to be mounted. An enterprise scaffold is the same: a set of flexible controls and Azure capabilities that provide structure to the environment, and anchors for services built on the public cloud. It provides the builders (IT and business groups) a foundation to create and attach new services.

The Azure enterprise scaffolding is based on practices we have gathered from many engagements with clients of various sizes. Those clients range from small organizations developing solutions in the cloud to Fortune 500 enterprises and independent software vendors who are migrating and developing solutions in the cloud. The enterprise scaffold is "<strong>purpose-built</strong>" to be flexible to support both traditional IT workloads and agile workloads; such as, developers creating software-as-a-service (SaaS) applications based on Azure capabilities.

The enterprise scaffold is intended to be the foundation of each new subscription within Azure. It enables administrators to ensure workloads meet the minimum governance requirements of an organization without preventing business groups and developers from quickly meeting their own goals.

Governance is crucial to the success of Azure. This article targets the technical implementation of an enterprise scaffold but only touches on the broader process and relationships between the components. Policy governance flows from the top down and is determined by what the business wants to achieve. Naturally, the creation of a governance model for Azure includes representatives from IT, but more importantly it should have strong representation from business group leaders, and security and risk management. In the end, an enterprise scaffold is about mitigating business risk to facilitate an organization's mission and objectives.

The following image describes the components of the scaffold.

The foundation relies on a solid plan for departments, accounts, and subscriptions. The pillars consist of Resource Manager policies and strong naming standards. The rest of the scaffold comes from core Azure capabilities and features that enable a secure and manageable environment.
<h2><a></a>Naming standards</h2>
The first pillar of the scaffold is naming standards. Well-designed naming standards enable you to identify resources in the portal, on a bill, and within scripts. Most likely, you already have naming standards for on-premises infrastructure. When adding Azure to your environment, you should extend those naming standards to your Azure resources. Naming standard facilitate more efficient management of the environment at all levels.

<strong>For naming conventions:</strong>

Review and adopt where possible the <a href="https://docs.microsoft.com/en-us/azure/guidance/guidance-naming-conventions">Patterns and Practices guidance</a>. This guidance helps you decide on a meaningful naming standard.

Use camel Casing for names of resources (such as myResourceGroup and vnetNetworkName).

<strong>Note:</strong> There are certain resources, such as storage accounts, where the only option is to use lower case (and no other special characters).

Consider using Azure Resource Manager policies (described in the next section) to enforce naming standards.

&nbsp;
<h2><a></a>Using Role Based Access Control (RBAC)</h2>
RBAC stands for Role Based Access Control where-by Azure provides various default roles for various namespaces and objects in each of these namespaces. The roles have a name and a set of allowed operations on those namespaces and as well as a set of operations that are not allowed. The general rule is anyone using Azure in any sort of capability should be in clear understood and well-defined roles which allow them to do only the specific activities they should be allowed to and nothing more and nothing less.  As a best practice every end user and administrator in Azure should only be limited to the set of roles that are absolutely required. Some of the following links are very handy in this regard.
<ol>
 	<li><a href="https://docs.microsoft.com/en-us/azure/active-directory/role-based-access-control-what-is">What is RBAC</a>?</li>
 	<li><a href="https://docs.microsoft.com/en-us/azure/active-directory/role-based-access-control-configure">Using RBAC to manage access to resources</a></li>
 	<li><a href="https://docs.microsoft.com/en-us/azure/active-directory/role-based-access-built-in-roles">RBAC – Built-in roles</a></li>
 	<li><a href="https://docs.microsoft.com/en-us/azure/active-directory/role-based-access-control-custom-roles">RBAC – Custom roles</a></li>
 	<li><a href="https://docs.microsoft.com/en-us/azure/active-directory/role-based-access-control-create-custom-roles-for-internal-external-users">Assign custom roles for internal and external users</a></li>
</ol>
<h2><a></a>Using Azure Policies</h2>
Azure Policy is another capability in the Azure platform where an enterprise can create various policies and then deploy them at an appropriate scope such as a subscription or a resource group. Based on the scope at which the policy is deployed, incoming ARM based requests to Azure get evaluated and ascertained if they conform to the policies. If they are not the incoming requests are not honored. The following are some handy links with regards to understanding and using Azure Policies.
<ol>
 	<li><a href="https://docs.microsoft.com/en-us/azure/azure-policy/azure-policy-introduction">Overview of Azure Policies</a></li>
 	<li><a href="https://docs.microsoft.com/en-us/azure/azure-policy/policy-definition">Azure Policy Definition structure</a></li>
 	<li><a href="https://docs.microsoft.com/en-us/azure/azure-policy/azure-policy-introduction#initiative-definition">Azure Policy Initiatives</a></li>
</ol>
&nbsp;
<h2><a></a>Review Resource Group (RG) Costs periodically to mine opportunities for cost reduction</h2>
The best practice in terms of application deployment is to deploy the components of the solution all into a single Resource Group. The costs for each RG can be then separated out and analyzed for the following: -

(a)    Relevancy – meaning is this component required any more. If not, then delete it.

(b)    Usage and load patterns – if the usage is low or the load handled by the component is very low (or conversely high) then consolidate multiple instances of such components into lesser number of instances (or set scale up/down rules)
<h1><a></a>Making use of Tactical platform capabilities</h1>
<h2><a></a>Azure Hybrid User Benefit</h2>
One can save up to 40 percent on Windows Server virtual machines with Azure Hybrid Benefit for Windows Server. Use your on-premises Windows Server licenses with Software Assurance to save big on Azure. With this benefit, for each license we will cover the cost of the OS (on up to two virtual machines!), while you just pay for base compute costs.

Overview Reference - <a href="https://azure.microsoft.com/en-us/pricing/hybrid-benefit/">https://azure.microsoft.com/en-us/pricing/hybrid-benefit/</a>
<h2><a></a>Use Reserved Instances (RI)</h2>
As the name indicates Azure Reserved Instances are those VMs that you run, but which you have reserved for long term usage. The prices for Reserved VM Instances are significantly lower than non-reserved instances and so anytime there is a need to have long running VMs (say you are sure it is going to be used for a year or so) then you should opt to use Azure RIs to gain cost savings.

Significantly reduce costs—up to 72 percent compared to pay-as-you-go prices—with one-year or three-year terms on Windows and Linux virtual machines (VMs). When you combine the cost savings gained from Azure RIs with the added value of the <a href="https://azure.microsoft.com/en-us/pricing/hybrid-benefit/">Azure Hybrid Benefit</a>, you can save up to 82 percent*. Lower your total cost of ownership by combining RIs with pay-as-you-go prices to manage costs across predictable and variable workloads. What’s more, you can now improve budgeting and forecasting with a single upfront payment, making it easy to calculate your investments.

<a href="https://docs.microsoft.com/en-us/azure/virtual-machines/windows/prepay-reserved-vm-instances">Prepay for Virtual Machines with Reserved VM Instances</a>

The following are some useful references. To learn more about Reserved Virtual Machine Instances, see the following articles.
<ul>
 	<li><a href="https://docs.microsoft.com/en-us/azure/virtual-machines/windows/prepay-reserved-vm-instances">Prepay for Virtual Machines with Reserved VM Instances</a></li>
 	<li><a href="https://docs.microsoft.com/en-us/azure/billing/billing-manage-reserved-vm-instance">Manage Reserved Virtual Machine Instances</a></li>
 	<li><a href="https://docs.microsoft.com/en-us/azure/billing/billing-save-compute-costs-reservations">Save money on virtual machines with Reserved Virtual Machine Instances</a></li>
 	<li><a href="https://docs.microsoft.com/en-us/azure/billing/billing-understand-vm-reservation-charges">Understand how the Reserved Virtual Machine Instance discount is applied</a></li>
 	<li><a href="https://docs.microsoft.com/en-us/azure/billing/billing-understand-reserved-instance-usage">Understand Reserved Instance usage for your Pay-As-You-Go subscription</a></li>
 	<li><a href="https://docs.microsoft.com/en-us/azure/billing/billing-understand-reserved-instance-usage-ea">Understand Reserved Instance usage for your Enterprise enrollment</a></li>
</ul>
&nbsp;
<h2><a></a>Shutdown</h2>
<h3></h3>
Of all the strategies for saving costs on compute, shutting down a VM when not needed is the most propitious one. There are various methods to accomplish this.
<ol>
 	<li>Now there is a provision in the portal (or via ARM) to shut down a VM at a certain time every day. So, see if that will work in your scenario and just set it for the VMs where this can be applied.</li>
 	<li>Shutdown a VM when a certain idle threshold is reached – say VM CPU is 85% idle or whatever is applicable to your specific application and its downtime requirements. Idle detection is part of the platform and alerts can be generated which can then be used to trigger automation to shut down the VM in question.</li>
</ol>
<h2><a></a>Right Sizing</h2>
When provisioning VMs for various application workloads it is worth spending time and effort on finding the correct metrics that the application under load generates. These are the CPU load, IO throughput, memory requirements, etc. It might take a day or two get this information by testing/loading the application prior to migrating it. This will pay rich dividends when you deploy to Azure as it will give the correct size when you come to choose the VM family and size in Azure instead of blindly choosing the size with no proper data behind it. A right sized VM also has the advantage of not having to constantly resizing it.
<h2><a></a>Azure Low Priority VMs</h2>
Low-priority VMs are allocated from our surplus compute capacity and are available for up to an 80% discount, enabling certain types of workloads to run for a significantly reduced cost or allowing you to do much more for the same cost. Hence, in addition to considering AHUB and RI, also consider using Low Priority VMs whenever it is appropriate. The tradeoff for using low-priority VMs is that those VMs may not be available to be allocated or may be preempted at any time, depending on available capacity.

The following links provide additional information on Low Priority VMs.

<a href="https://azure.microsoft.com/en-us/blog/announcing-public-preview-of-azure-batch-low-priority-vms/">Low Priority VMs – Overview</a> <a href="https://docs.microsoft.com/en-us/azure/batch/batch-low-pri-vms">Using Low Priority VMs in Batch </a>

Low-priority VMs are offered at a significantly reduced price compared with dedicated VMs. For pricing details, see <a href="https://azure.microsoft.com/pricing/details/batch/">Batch Pricing</a>.
<h2><a></a>Scaling (Auto)</h2>
The Azure platform has baked in elastic and dynamic scaling that enable your azure resources such as compute to be dialed UP and DOWN in an automated fashion. The recommendation here is to make use of this platform capability in your solution deployments to scale UP and DOWN on demand, instead of using fixed size compute resources.

As a prelude to using Auto Scaling for your compute deployments, always deploy VMs into Availability sets or VM Scale Sets. Once you deploy the VMs into these platform constructs leverage the auto-scale capabilities in here. If you are deploying applications into VMs, a la the old-fashioned IaaS method, then the least the application must satisfy is, is that it must be a stateless application.

The following links provide various Scaling options.

<a href="https://docs.microsoft.com/en-us/azure/architecture/best-practices/auto-scaling">Azure Platform Auto-Scaling capabilities</a> <a href="https://docs.microsoft.com/en-us/azure/virtual-machines/windows/vertical-scaling-automation">Using Azure Automation for Scaling VMs</a> <a href="https://docs.microsoft.com/en-us/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-autoscale-overview">VM Scale Set Overview</a> <a href="https://docs.microsoft.com/en-us/azure/batch/batch-low-pri-vms#scale-a-pool-containing-low-priority-vms">Scaling Low Priority VMs</a>

&nbsp;

&nbsp;
<h2><a></a>Performance optimization/performance POV</h2>
<h3><a></a>Choose the right storage</h3>
This was already covered in detail in the documentation on Storage Optimization. However briefly Azure provides the following types of storage capabilities from a replication perspective.

(a)    LRS – Locally redundant storage

(b)    ZRS – Zone Redundant storage

(c)     GRS – Geographically Redundant storage

(d)    RA-GRS Read Access – GA

Choose the appropriate storage based on application replication needs. Obviously, GRS types of storage costs slightly more.

Additionally, there are the options of

(a)    HDD [spinning old style disks] – cost effective choice for low throughput non-mission critical apps.

(b)    SDD [solid state drives] – Premium disks for high throughput I/O

(c)     Managed Disks – it is recommended all production and critical applications use managed disks.

Finally, the general recommendation is to use Managed Storage disks for all new VMs as they have significant advantages over non-managed disks and as well guaranteed SLAs besides not having to manage them as Azure manages them for the customer.
<h3><a></a>Choose the right type of VMs</h3>
Once the application team has decided that they would use IaaS based solution, landing on VMs, then spending time and deciding on the correct VM family and size will prove beneficial. There are several approaches to do this, some of which are outlined.
<ol>
 	<li>For pure Lift and Shift type of scenarios, the current on-Prem deployment would serve as a starting baseline. Once you have the baseline, it is incumbent on each application team to profile the system characteristics under load. Once the load characteristics are known this can be mapped to the appropriate Azure VM Family and Azure Compute Units required to run the same application in Azure on VMs.</li>
</ol>
<h3><a></a>Choosing the appropriate platform construct</h3>
Many customers fall into this category where they do not have the time to understand the cloud native constructs provided by Azure and go for the easy pattern of lift and shift. While this is an easy mental model for experienced IT staff, it is not in tune with the various PaaS, SaaS and identity models that azure offers. This approach will almost invariably end up with choosing the wrong model and often advised by infrastructure-background personnel, who do not have the background to understand the developer capabilities of the platform, but who tend to push the discussion to the legacy approaches of deploying to VMs. From a cloud perspective these legacy approaches are rapidly become obsolete and as well as from an evolving software architecture point of view. This is a trap that should be avoided, and application teams should take the help of seasoned application developers who have kept abreast of various cloud native constructs which are baked right into the platform. The cost savings of such an approach are immense. Some of the benefits of microservices and cloud native capabilities are listed below.

(a)    Overall savings from blindly spinning up VMs – this is an old model which should be *really* be the last resort. Cost of managing the IaaS based deployments as well as constantly monitoring, patching, backing up and taking care of the environment. Also, the lack of auto-scaling which will not enable cost realizations.

(b)    Several hundreds to thousands of hours of savings for the development and deployment team as the cloud native constructs are built for rapid agile iterative cycles and super smooth DevOPS style deployment. None of these will be realized in the old-fashioned legacy way of deploying into VMS, by still wrongly adopting the technique of deploying into a VM/Server.

(c)     Look for cloud native constructs the platform provides – a few examples
<ol>
 	<li>Use of Cloud neutral and OS neutral capabilities like Service Fabric (SF)</li>
 	<li>If SF is not feasible deploy the application into containers</li>
 	<li>Serverless constructs like Azure Functions</li>
</ol>
(d)    Use PaaS capabilities such as the following: -
<ol>
 	<li>Azure Web Applications</li>
 	<li>Azure Logic Apps</li>
 	<li>Azure Event Hubs</li>
 	<li>Azure Service Bus</li>
 	<li>Azure Event Grid</li>
</ol>
Most enterprise message bus type applications can be implemented by a combination of Azure Logic Apps, Azure Functions (or Web Jobs) with durable functions and storage. Such decoupling will lead to significant cost savings over and above the existing legacy architectures, besides being more scalable and easy to manage, resulting in less overall costs. Application reviews done so far point to the fact that customers are still following the older IT model of deploying into servers and this is a serious issue from a software architecture perspective. Such teams end up carrying <strong>huge technical debt</strong>, and will have to undergo a painful refactoring later to modern software architectures which exploit cloud native capabilities, in order to realize the resultant benefits of rapid DevOPS, huge time-savings, cost benefits, agile development cycles, besides having a decoupled and a highly decomposed(componentized)  architecture, which allows for independent versioning and management (of the different components that make the) of the  solutions/applications that need to continually manage, evolve and operate.

&nbsp;
<h1><a></a>REACTIVE Approach - things to do post deployment</h1>
Once the customer has started deploying into Azure then there are certain things that should be done post facto, in a continuous basis to wring out more cost efficiencies. These are spelt out below.
<h3><a></a>Azure Advisor</h3>
Turn on tools like Azure Advisor and implement all of its cost recommendations. The following link provides an intro to Azure Advisor which is a very simple tool to turn and as well as to implement its recommendations.

<a href="https://docs.microsoft.com/en-us/azure/advisor/advisor-overview">https://docs.microsoft.com/en-us/azure/advisor/advisor-overview</a>
<h3><a></a>Cloudyn type of tools</h3>
Cloudyn is another tool that can be used to study the usage and cost benefit analysis and it is recommended to turn this on and study its findings and recommendations and then implement them. Note that both Cloudyn and Azure Advisor use heuristics and AI to figure out usage patterns and make recommendations. So, the more these tools are turned on and have access to data over longer time periods their recommendations will make sense. The following link provides information on how to view Cost data with Cloudyn.

<a href="https://docs.microsoft.com/en-us/azure/cost-management/quick-register-azure-sub">https://docs.microsoft.com/en-us/azure/cost-management/quick-register-azure-sub</a>

&nbsp;
<h3><a></a>Check if deployments can be converted for Reserved Instance(RI)</h3>
After having deployed into Azure it is often the case that customers retroactively try to make sure they are exploiting Azure RI wherever they can. So, it is incumbent on Azure administrators or those responsible for the apps and its associated costs to periodically scan the usage data and figure out which are all the Azure VM instances that RI can applied to.
<h3><a></a>Check if deployments can be converted for AHUB</h3>
The same applies to leveraging existing enterprise licenses for Windows Servers which the organization has already paid for. For all Windows VMs the AHUB benefits should be turned on.

&nbsp;
<h3><a></a>Study the entities within the RG</h3>
This is an activity that should be done periodically ideally atleast every couple of months by each application teams as part of the sprint cycle. The suggestion is to review the usage and cost data for every resource group in the monthly consumption data. By picking the top ten spenders in each RG and focusing on them and studying them and figuring out optimizations of these TOP TEN spenders, the following can be realized. Cost savings if any can be affected
<ol>
 	<li>Valuable skills will be gained over a period of time by doing this exercise repeatedly.</li>
 	<li>Rinse, repeat this atleast every 2 months.</li>
</ol>
&nbsp;
<h2><a></a>Azure Compute VMs – Capability and Design Guidance</h2>
The sizing and tiering options provide customers with a consistent set of compute sizing options, which <strong>expand</strong> as time goes on. From a sizing perspective, each sizing series represents various properties, such as:
<ul>
 	<li>Number of CPUs</li>
 	<li>Memory allocated to each virtual machine</li>
 	<li>Temporary local storage</li>
 	<li>Allocated bandwidth for the virtual machines</li>
 	<li>Maximum data disks</li>
 	<li>GPU availability</li>
</ul>
<h3><a></a>VM Capability Guidance</h3>
&nbsp;

Some virtual machine series includes the concept of <em>Basic </em>and <em>Standard</em> tiers. A <em>Basic</em> tier virtual machine is only available on A0-A4 instances, and a <em>Standard</em> tier virtual machine is available on all size instances. Virtual machines that are available in the Basic tier are provided at a reduced cost and carry slightly less functionality than those offered at the Standard tier. This includes the following areas:
<table>
<tbody>
<tr>
<td><strong>Capability Consideration</strong></td>
<td width="449"><strong>Capability Decision Points</strong></td>
</tr>
<tr>
<td><strong>CPU</strong></td>
<td width="449">Standard tier virtual machines are expected to have slightly better CPU performance than Basic tier virtual machines</td>
</tr>
<tr>
<td><strong>Disk</strong></td>
<td width="449">Data disk IOPS for Basic tier virtual machines is 300 IOPS, which is slightly lower than Standard tier virtual machines (which have 500 IOPS data disks).</td>
</tr>
<tr>
<td><strong>Features</strong></td>
<td width="449">Basic tier virtual machines do not support features such as load balancing or auto-scaling.</td>
</tr>
</tbody>
</table>
The following table is provided to illustrate a summary of key decision points when using Basic tier virtual machines:
<table width="624">
<tbody>
<tr>
<td width="96"><strong>Size</strong></td>
<td width="102"><strong>Available CPU Cores</strong></td>
<td width="84"><strong>Available Memory </strong></td>
<td width="174"><strong>Available Disk Sizes </strong></td>
<td width="90"><strong>Maximum Data Disks </strong></td>
<td width="78"><strong>Maximum IOPS</strong></td>
</tr>
<tr>
<td width="96"><strong>Basic_A0 – Basic_A4</strong></td>
<td width="102">1 – 8</td>
<td width="84">768 MB –

14 GB</td>
<td width="174">Operating system = 1023 GB

Temporary = 20 - 240 GB</td>
<td width="90">1 - 16</td>
<td width="78">300 IOPS per disk</td>
</tr>
</tbody>
</table>
&nbsp;

In comparison, Standard tier virtual machines are available for all compute sizes.
<table>
<tbody>
<tr>
<td><strong>Capability Consideration</strong></td>
<td><strong>Capability Decision Points</strong></td>
</tr>
<tr>
<td><strong>CPU</strong></td>
<td>Standard tier virtual machines have better CPU performance than Basic tier virtual machines.</td>
</tr>
<tr>
<td><strong>Disk</strong></td>
<td>Data disk IOPS for Basic tier virtual machines is 500. (This is higher than Basic tier virtual machines, which have 300 IOPS data disks.) If the DS series is selected, IOPS start at 3200.</td>
</tr>
<tr>
<td><strong>Availability</strong></td>
<td>Standard tier virtual machines are available on all size instances.</td>
</tr>
<tr>
<td><strong>A-Series features</strong></td>
<td>·       Standard tier virtual machines include load balancing and auto-scaling.

·       For A8, A9, A10, and A11 instances, hardware is designed and optimized for compute and network intensive applications including high-performance computing (HPC) cluster applications, modeling, and simulations.

·       A8 and A9 instances have the ability to communicate over a low-latency, high-throughput network in Azure, which is based on remote direct memory access (RDMA) technology. This boosts performance for parallel Message Passing Interface (MPI) applications. (RDMA access is currently supported only for cloud services and Windows Server-based virtual machines.)

·       A10 and A11 instances are designed for HPC applications that do not require constant and low-latency communication between nodes (also known as parametric or embarrassingly parallel applications). The A10 and A11 instances have the same performance optimizations and specifications as the A8 and A9 instances. However, they do not include access to the RDMA network in Azure.</td>
</tr>
<tr>
<td><strong>Av2-Series features</strong></td>
<td>·       Represent new version of A-Series VM’s with amount of RAM per vCPU raised from 1.75 GB or 7 GB of RAM per vCPU to 2 GB or 8 GB per vCPU.  Local disk random IOPS has been improved to be 2-10x faster than that of existing A version 1 sizes.</td>
</tr>
<tr>
<td><strong>D-Series features</strong></td>
<td>·       Standard tier virtual machines include load balancing and auto-scaling.

·       D-series virtual machines are designed to run applications that demand higher compute power and temporary disk performance. D-series virtual machines provide faster processors, a higher memory-to-core ratio, and a solid-state drive (SSD) for the temporary disk.</td>
</tr>
<tr>
<td><strong>Dv2-Series features</strong></td>
<td>·       Standard tier virtual machines include load balancing and auto-scaling.

·       Dv2-series, a follow-on to the original D-series, features a more powerful CPU. The Dv2-series CPU is about 35% faster than the D-series CPU. It is based on the latest generation 2.4 GHz Intel Xeon® E5-2673 v3 (Haswell) processor, and with the Intel Turbo Boost Technology 2.0, can go up to 3.2 GHz. The Dv2-series has the same memory and disk configurations as the D-series.</td>
</tr>
<tr>
<td><strong>Dv3-Series</strong>

<strong>features</strong></td>
<td>·       Standard tier virtual machines include load balancing and auto-scaling.

·       With Dv3-series, a follow-on to the original D/Dv2-series, Microsoft is introducing a new generation of Hyper-Threading Technology virtual machines for general purpose workloads</td>
</tr>
<tr>
<td><strong>Ev3-Series features</strong>

<strong> </strong></td>
<td>·       Standard tier virtual machines include load balancing and auto-scaling.

·       A new family for memory optimized workloads - introducing sizes with 64 vCPUs on Intel® Broadwell E5-2673 v4 2.3 processor and with 432 GB of memory on the largest Ev3 sizes</td>
</tr>
<tr>
<td><strong>DS-Series features</strong></td>
<td>·       Standard tier virtual machines include load balancing and auto-scaling.

·       DS-series virtual machines can use premium storage, which provides high-performance and low-latency storage for I/O intensive workloads. It uses solid-state drives (SSDs) to host a virtual machine’s disks and offers a local SSD disk cache. Currently, premium storage is only available in certain regions.

·       The maximum input/output operations per second (IOPS) and throughput (bandwidth) possible with a DS series virtual machine is affected by the size of the disk.</td>
</tr>
<tr>
<td><strong>F-Series features</strong></td>
<td>·       SKU is based on the 2.4 GHz Intel Xeon® E5-2673 v3 (Haswell) processor, which can achieve clock speeds as high as 3.1 GHz with the Intel Turbo Boost Technology 2.0. Having the same CPU performance as the Dv2-series of VMs, at a lower per-hour list price, the F-series is the best value in price-performance in the Azure portfolio based on the Azure Compute Unit (ACU) per core. The F-Series VMs are an excellent choice for gaming servers, web servers and batch processing. Any workload which does not need as much memory or local SSD per CPU core will benefit from the value of the F-Series.</td>
</tr>
<tr>
<td><strong>FS-Series features</strong></td>
<td>·       FS-series virtual machines can use premium storage, which provides high-performance and low-latency storage for I/O intensive workloads. It uses solid-state drives (SSDs) to host a virtual machine’s disks and offers a local SSD disk cache. Currently, premium storage is only available in certain regions.

·       The maximum input/output operations per second (IOPS) and throughput (bandwidth) possible with a DS series virtual machine is affected by the size of the disk.</td>
</tr>
<tr>
<td><strong>G-Series features</strong></td>
<td>·       Standard tier virtual machines include load balancing and auto-scaling.

·       Leverages local SSD disks to provide the highest performance virtual machine series that is available in Azure.</td>
</tr>
<tr>
<td><strong>GS-Series features</strong></td>
<td>·       Standard tier virtual machines include load balancing and auto-scaling.

·       Leverages local SSD disks to provide the highest performance virtual machine series that is available in Azure.

·       GS-series virtual machines can use premium storage, which provides high-performance and low-latency storage for I/O intensive workloads. It uses solid-state drives (SSDs) to host a virtual machine’s disks and offers a local SSD disk cache. Currently, premium storage is only available in certain regions.

·       The maximum input/output operations per second (IOPS) and throughput (bandwidth) possible with a GS series virtual machine is affected by the size of the disk.</td>
</tr>
<tr>
<td><strong>H-Series</strong>

<strong>features</strong></td>
<td>·       H-series VMs are based on Intel E5-2667 V3 3.2 GHz (with turbo up to 3.5 GHz) processor technology, utilizing DDR4 memory and SSD-based local storage.  The new H-series VMs furthermore features a dedicated RDMA backend network enabled by FDR InfiniBand network, capable of delivering ultra-low latency.  RDMA networking is dedicated for MPI (Message Passing Interface) traffic when running tightly coupled applications.

·       Provide great performance for HPC applications in Azure.  H-series VM sizes is an excellent fit for any compute-intensive workload.  They are designed to deliver cutting edge performance for complex engineering and scientific workloads like computational fluid dynamics, crash simulations, seismic exploration, and weather forecasting simulations.</td>
</tr>
<tr>
<td><strong>N-Series features</strong></td>
<td>A new family of Azure Virtual Machines with GPU capabilities suited for compute and graphics-intensive workloads – aiding in scenarios like remote visualization, high performance computing and analytics. To be available in preview in Q1CY16 the N-series will be based on NVidia’s M60 and K80 GPUs and will feature the NVIDIA Tesla Accelerated Computing Platform as well as NVIDIA GRID 2.0 technology, providing the highest-end graphics support available in the cloud today</td>
</tr>
</tbody>
</table>
&nbsp;

&nbsp;

The following summary of the capabilities of each virtual machine series is provided in the following table:

&nbsp;
<table>
<tbody>
<tr>
<td><strong>Size</strong></td>
<td><strong>Available CPU </strong><strong>Cores</strong></td>
<td><strong>Available Memory </strong></td>
<td><strong>Available Disk Sizes </strong></td>
<td><strong>Maximum Data Disks  </strong></td>
<td><strong>Maximum IOPS</strong></td>
</tr>
<tr>
<td><strong>Basic_A0 – Basic_A4</strong></td>
<td>1 – 8</td>
<td>768 MB –

14 GB</td>
<td>Operating system = 1023 GB

Temporary = 20-240 GB</td>
<td>1 – 16</td>
<td>300 IOPS per disk</td>
</tr>
<tr>
<td><strong>Standard_A0 – Standard_A11</strong>

<strong>(Includes compute intensive A8-11)</strong></td>
<td>1 - 16</td>
<td>768 MB - 112 GB</td>
<td>Operating system = 1023 GB

Temporary = 20-382 GB

&nbsp;</td>
<td>1 – 16</td>
<td>500 IOPS per disk</td>
</tr>
<tr>
<td><strong>Standard_A1_v2 – Standard_A8_v2; Compute-intensive Standard_A2m_v2 - Standard_A8m_v2</strong></td>
<td>1 - 8</td>
<td>2 GB – 64 GB</td>
<td>Operating system = 1023 GB

Temporary SSD disk = 10-80 GB</td>
<td>1 – 16</td>
<td>500 IOPS per disk</td>
</tr>
<tr>
<td><strong>Standard_D1-D4 Standard_D11-D14</strong>

<strong>(High memory)</strong></td>
<td>1 - 16</td>
<td>3.5 GB – 112 GB</td>
<td>Operating system = 1023 GB

Temporary (SSD) =50 – 800 GB</td>
<td>2 – 32</td>
<td>500 IOPS per disk</td>
</tr>
<tr>
<td><strong>Standard_D1v2-D5v2 Standard_D11v2-D14v2</strong>

<strong>(High memory, faster CPU)</strong></td>
<td>1 - 16</td>
<td>3.5 GB – 112 GB</td>
<td>Operating system = 1023 GB

Temporary (SSD) =50 – 800 GB</td>
<td>2 – 32</td>
<td>500 IOPS per disk</td>
</tr>
<tr>
<td><strong>Standard_DS1-DS4 Standard_DS11-DS14</strong>

<strong>(Premium storage)</strong></td>
<td>1 - 16</td>
<td>3.5 – 112 GB</td>
<td>Operating system = 1023 GB

Local SSD disk = 7 GB – 112 GB GB</td>
<td>2 – 32</td>
<td>43 – 576 GB cache size

3200-50000 IOPS total</td>
</tr>
<tr>
<td><strong>Standard_F1 – F16</strong>

<strong> </strong></td>
<td>1-16</td>
<td>2-32</td>
<td>Local SSD disk: 16 GB – 256 GB</td>
<td>2-32</td>
<td>500 IOPS per disk</td>
</tr>
<tr>
<td><strong>Standard_FS1 – FS16</strong></td>
<td>1-16</td>
<td>2-32</td>
<td>Local SSD disk: 4GB – 64GB</td>
<td>2-32</td>
<td>4,000-64,000 IOPS</td>
</tr>
<tr>
<td><strong>Standard_G1 – G5</strong>

<strong>(High performance)</strong></td>
<td>2 - 32</td>
<td>28 GB – 448 GB</td>
<td>Operating system = 1023 GB

Local SSD disk = 384 – 6,144 GB</td>
<td>4 – 64</td>
<td>500 IOPS per disk</td>
</tr>
<tr>
<td><strong>Standard_GS1 – GS5</strong>

<strong>(High performance, </strong>

<strong>Premium storage)</strong></td>
<td>2 - 32</td>
<td>28 GB – 448 GB</td>
<td>Operating system = 1023 GB

Local SSD disk = 56 – 896 GB</td>
<td>4 - 64</td>
<td>264 – 4224 GB cache size

5000-80000 IOPS total</td>
</tr>
<tr>
<td><strong>Standard_H8 - H16</strong></td>
<td>8-16</td>
<td>56 GB - 224 GB</td>
<td>Local SSD Disk: 1,000-2,000 GB</td>
<td>16 - 32</td>
<td>500 IOPS per disk</td>
</tr>
</tbody>
</table>
&nbsp;

&nbsp;

&nbsp;

The table below also describes differences between A-series and Av2-series

&nbsp;
<table width="676">
<tbody>
<tr>
<td width="55"><strong>SIZE</strong></td>
<td width="62"><strong>vCPU</strong></td>
<td width="91"><strong>RAM (GiB)</strong></td>
<td width="104"><strong>Disk Size</strong></td>
<td width="48"><strong> </strong></td>
<td width="69"><strong>Size</strong></td>
<td width="51"><strong>vCPU</strong></td>
<td width="69"><strong>RAM (GiB)</strong></td>
<td width="128"><strong>Disk Size</strong></td>
</tr>
<tr>
<td width="55"><strong>A1</strong></td>
<td width="62">1</td>
<td width="91">1.75</td>
<td width="104">20 GB (HDD)</td>
<td width="48">→</td>
<td width="69"><strong>A1_v2</strong></td>
<td width="51">1</td>
<td width="69">2</td>
<td width="128">10 GB (SSD)</td>
</tr>
<tr>
<td width="55"><strong>A2</strong></td>
<td width="62">2</td>
<td width="91">3.50</td>
<td width="104">70 GB (HDD)</td>
<td width="48">→</td>
<td width="69"><strong>A2_v2</strong></td>
<td width="51">2</td>
<td width="69">4</td>
<td width="128">20 GB (SSD)</td>
</tr>
<tr>
<td width="55"><strong>A3</strong></td>
<td width="62">4</td>
<td width="91">7</td>
<td width="104">285 GB (HDD)</td>
<td width="48">→</td>
<td width="69"><strong>A4_v2</strong></td>
<td width="51">4</td>
<td width="69">8</td>
<td width="128">40 GB (SSD)</td>
</tr>
<tr>
<td width="55"><strong>A4</strong></td>
<td width="62">8</td>
<td width="91">14</td>
<td width="104">605 GB (HDD)</td>
<td width="48">→</td>
<td width="69"><strong>A8_v2</strong></td>
<td width="51">8</td>
<td width="69">16</td>
<td width="128">80 GB (SSD)</td>
</tr>
<tr>
<td width="55"><strong>A5</strong></td>
<td width="62">2</td>
<td width="91">14</td>
<td width="104">135 GB (HDD)</td>
<td width="48">→</td>
<td width="69"><strong>A2m_v2</strong></td>
<td width="51">2</td>
<td width="69">16</td>
<td width="128">20 GB (SSD)</td>
</tr>
<tr>
<td width="55"><strong>A6</strong></td>
<td width="62">4</td>
<td width="91">26</td>
<td width="104">285 GB (HDD)</td>
<td width="48">→</td>
<td width="69"><strong>A4m_v2</strong></td>
<td width="51">4</td>
<td width="69">32</td>
<td width="128">40 GB (SSD)</td>
</tr>
<tr>
<td width="55"><a></a><a></a><a></a>A7</td>
<td width="62"><a></a><a></a><a></a>8</td>
<td width="91"><a></a><a></a><a></a>52</td>
<td width="104"><a></a><a></a><a></a>605 GB (HDD)</td>
<td width="48"><a></a><a></a><a></a>→</td>
<td width="69"><a></a><a></a><a></a>A8m_v2</td>
<td width="51"><a></a><a></a><a></a>8</td>
<td width="69"><a></a><a></a><a></a>64</td>
<td width="128"><a></a><a></a><a></a>80 GB (SSD)</td>
</tr>
</tbody>
</table>
&nbsp;

These sizing and capabilities are for the current Azure Virtual Machines, and they might expand over time. For a complete list of size tables to help you configure your virtual machines, please see: <a href="https://docs.microsoft.com/en-us/azure/virtual-machines/virtual-machines-windows-sizes?toc=%2fazure%2fvirtual-machines%2fwindows%2ftoc.json">Sizes for Virtual Machines</a><u>.</u>

&nbsp;
<h3><a></a>Azure VM Design Guidance</h3>
&nbsp;
<table>
<tbody>
<tr>
<td width="624">Design Guidance</td>
</tr>
</tbody>
</table>
&nbsp;

When you design solutions for using virtual machines, consider the following:
<table>
<tbody>
<tr>
<td><strong>Capability Considerations</strong></td>
<td><strong>Capability Decision Points</strong></td>
</tr>
<tr>
<td><strong>Deployment order</strong></td>
<td>If you intend to deploy an application that may require compute intensive resources, it is recommended that customers provision a virtual machine to a cloud service with the largest virtual machine (such as Standard_G5) and scale it down to a more appropriate size. The reason is that virtual machines will be placed on the clusters that have the faster processors. It also makes scaling easier and it is more efficient to combine resources.</td>
</tr>
<tr>
<td><strong>Supportability</strong></td>
<td>The following are not supported in a virtual machine on Microsoft Azure:

·       Multicast

·       Layer-2 routing

·       32-bit OS versions

·       Windows Server OS versions prior to Windows Server 2008 R2

<strong><u>Note</u></strong>: Windows Server 2003 / 2008 32-bit OS versions are supported for deployment on Azure virtual machines with substantial limitations, including no support for agents or extensions.</td>
</tr>
</tbody>
</table>
&nbsp;

&nbsp;
<h2><a></a>Usage Analysis Tools</h2>
The following tools are available as part of the platform and consider turning them on.

(A)    Azure Advisor

(B)    Azure Security Center

(C)    Cloudyn

They analyze the underlying data emitted by various Azure resources and arrive at recommendations from the perspective of

(i)                  Cost

(ii)                Security

(iii)               Performance

In most cases these recommendations are implementable in an automated fashion, if not via a single click. One can also review and implement the recommendations manually if one prefers to do that.

&nbsp;

&nbsp;

&nbsp;]]></content:encoded>
    </item>
    <item>
      <title>Logical Volume Manager(LVM) with RedHat RHEL VMs in Azure and custom partitioning</title>
      <link>https://docs.microsoft.com/archive/blogs/girishp/logical-volume-managerlvm-with-redhat-rhel-vms-in-azure-and-custom-partitioning</link>
      <pubDate>Thu, 23 Nov 2017 23:03:33 GMT</pubDate>
      <dc:creator><![CDATA[gpillai]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/girishp/?p=1925</guid>
      <description><![CDATA[Most on-premise deployments of Linux (eg RHEL VMs) are done with custom partitioning. Hitherto this...]]></description>
      <content:encoded><![CDATA[Most on-premise deployments of Linux (eg RHEL VMs) are done with custom partitioning. Hitherto this was a little bit difficult to achieve, as these Linux VM images in Azure did not have support for LVM. Fret no more.

Now there are images for RHEL and as well as CentOS, that have LVM suppport which you can deploy and partition to suit your needs.

<strong>For RHEL images with LVM support</strong>

Use the following in your VM creation parameters.
<ol>
 	<li>Publisher = "RedHat"</li>
 	<li>SKU = "7-LVM"</li>
 	<li>Offer = "RHEL</li>
</ol>
Now specifically in your arm templates in the storage profile you would refer to them as follows:-

<em>"imagePublisher": "RedHat",</em>

<em>    "imageSku": "7-LVM",</em>

<em>    "imageOffer": "RHEL",</em>

You could take a simple OOB RHEL template already present in the Azure GitHub Quick Start template and make the necessary modifications and create this image.

To start simply take the following template -

<a target="_blank" href="http://Simple RHEL VM" rel="noopener">https://github.com/Azure/azure-quickstart-templates/tree/master/101-vm-simple-rhel</a>  and then modify it in the variables section as shown above and deploy the image using PowerShell or Visual Studio.

If you wanted to try a more complex RHEL based template try the following by using the same changes as above.

<a target="_blank" href="https://github.com/Azure/azure-quickstart-templates/tree/master/rhel-3tier-iaas" rel="noopener">3 Tier RHEL based deployment</a>

&nbsp;

Once the VMs have been created you can login and do the custom partition that you need. If you want to automate the partition then several methods are available.

(1) Using Linux Agent

<a target="_blank" href="https://docs.microsoft.com/en-us/azure/virtual-machines/linux/extensions-customscript" rel="noopener">Linux Custom Script Extensions</a> OR

(2) Using other tools like Ansible.]]></content:encoded>
    </item>
    <item>
      <title>Continuous Integration and Continuous Delivery (CI/CD)</title>
      <link>https://docs.microsoft.com/archive/blogs/girishp/continuous-integration-and-continuous-delivery-cicd</link>
      <pubDate>Mon, 20 Nov 2017 18:58:53 GMT</pubDate>
      <dc:creator><![CDATA[gpillai]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/girishp/?p=1835</guid>
      <description><![CDATA[The following is a collection of recent capabilities announced by Microsoft in the area of...]]></description>
      <content:encoded><![CDATA[<h2><strong>The following is a collection of recent capabilities announced by Microsoft in the area of CI/CD.</strong></h2>
<h2><span><a href="https://docs.microsoft.com/en-us/vsts/index#pivot=services&amp;panel=delivery">Continuous Integration &amp; Continuous Delivery</a><u><span style="font-family: Calibri Light;font-size: x-large"> </span></u></span></h2>
<span style="color: #000000;font-family: Calibri"> </span>
<h4><span><a href="https://docs.microsoft.com/en-us/azure/virtual-machines/linux/tutorial-build-deploy-jenkins">Deploy your app to Linux VMs by using Jenkins and Team Services</a><u><span style="font-family: Calibri Light;font-size: large"> </span></u></span></h4>
<h4><span><a href="https://docs.microsoft.com/en-us/vsts/build-release/concepts/definitions/release/approvals/index">Approvals and gates overview</a><u><span style="font-family: Calibri Light;font-size: large"> </span></u></span></h4>
<h4><span><a href="https://docs.microsoft.com/en-us/vsts/build-release/concepts/definitions/release/approvals/approvals">Approvals</a></span></h4>
<h4><span><a href="https://docs.microsoft.com/vsts/build-release/concepts/definitions/build/repository">Build definition source repositories</a><u><span style="font-family: Calibri Light;font-size: large"> </span></u></span></h4>
<h4><span><a href="https://docs.microsoft.com/vsts/build-release/tutorials/ci-build-github">Define a continuous integration (CI) build process for your GitHub repo</a><u><span style="font-family: Calibri Light;font-size: large"> </span></u></span></h4>
<h4><span><a href="https://docs.microsoft.com/vsts/build-release/tutorials/ci-build-git">Define a continuous integration (CI) build process for your Git repo</a></span></h4>
<h4><span><a href="https://docs.microsoft.com/vsts/build-release/actions/build-yaml">How to use YAML builds</a></span></h4>
<span style="color: #000000;font-family: Calibri"> </span>
<h1><span style="color: #2f5496;font-family: Calibri Light;font-size: x-large">Utility Tasks </span></h1>
<h4><span><a href="https://docs.microsoft.com/en-us/vsts/build-release/tasks/utility/manual-intervention">Utility task: Manual intervention</a><u><span style="font-family: Calibri Light;font-size: large"> </span></u></span></h4>
<h4><span><a href="https://docs.microsoft.com/en-us/vsts/build-release/tasks/utility/azure-function">Utility task: Azure function</a><u><span style="font-family: Calibri Light;font-size: large"> </span></u></span></h4>
<h4><span><a href="https://docs.microsoft.com/en-us/vsts/build-release/tasks/utility/azure-monitor">Utility task: Azure monitor</a><u><span style="font-family: Calibri Light;font-size: large"> </span></u></span></h4>
<h4><span><a href="https://docs.microsoft.com/en-us/vsts/build-release/tasks/utility/http-rest-api">Utility task: Invoke HTTP REST API</a><u><span style="font-family: Calibri Light;font-size: large"> </span></u></span></h4>
<h4><span><a href="https://docs.microsoft.com/en-us/vsts/build-release/tasks/utility/work-item-query">Utility task: Query Work Items</a><u><span style="font-family: Calibri Light;font-size: large"> </span></u></span></h4>
<h4><span><a href="https://docs.microsoft.com/vsts/package/install">Install and license Package Management</a><u><span style="font-family: Calibri Light;font-size: large"> </span></u></span></h4>
<h4><span><a href="https://docs.microsoft.com/vsts/build-release/tasks/utility/publish-build-artifacts">Utility task: Publish Build Artifacts</a></span></h4>
<h4><span><a href="https://docs.microsoft.com/vsts/build-release/tasks/utility/copy-and-publish-build-artifacts">Utility task: Copy and Publish Build Artifacts</a></span></h4>
<h4><span><a href="https://docs.microsoft.com/en-us/vsts/build-release/concepts/library/variable-groups">Variable groups</a></span></h4>
<h1><span style="color: #2f5496;font-family: Calibri Light;font-size: x-large">Microsoft Connect 2017 – DevOps project right in Azure etc.</span></h1>
<h4><span><a href="https://blogs.msdn.microsoft.com/devops/2017/11/16/cloud-hosted-mac-agents-for-ci-cd-pipelines/">Cloud-hosted Mac agents for CI/CD pipelines</a></span></h4>
<h4><span><a href="https://blogs.msdn.microsoft.com/devops/2017/11/16/release-gates-releases-with-continuous-monitoring-built-in/">Release Gates: Releases with continuous monitoring built in</a></span></h4>
<h4><span><a href="https://blogs.msdn.microsoft.com/devops/2017/11/15/azure-devops-project/">Introducing Azure DevOps Project</a></span></h4>
<h4><span><a href="https://blogs.msdn.microsoft.com/devops/2017/11/15/announcing-azure-devops-project-public-preview/">Announcing “Azure DevOps Project” public preview</a></span></h4>
<h4><span><a href="https://blogs.msdn.microsoft.com/devops/2017/11/15/pipeline-as-code-yaml-preview/">Pipeline as code (YAML) preview</a></span></h4>
<h4><span><a href="https://blogs.msdn.microsoft.com/devops/2017/11/15/check-out-devops-at-microsoft/">While You’re Waiting for Connect(), Check out DevOps at Microsoft</a></span></h4>
<h2><span style="color: #2f5496;font-family: Calibri Light;font-size: large"> </span></h2>
&nbsp;]]></content:encoded>
    </item>
    <item>
      <title>Different ways of slicing and dicing OMS Log Data in Azure - VM Creation</title>
      <link>https://docs.microsoft.com/archive/blogs/girishp/different-ways-of-slicing-and-dicing-oms-log-data-in-azure-vm-creation</link>
      <pubDate>Tue, 14 Nov 2017 21:39:34 GMT</pubDate>
      <dc:creator><![CDATA[gpillai]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/girishp/?p=1736</guid>
      <description><![CDATA[Azure is in deed and in fact like an ocean with various entities within it pumping out enormous...]]></description>
      <content:encoded><![CDATA[Azure is in deed and in fact like an ocean with various entities within it pumping out enormous amounts of logging, event information. This is also what makes it somewhat overwhelming as to where to look for under the hood as to what happened. <em>[Please click on pic to get a clearer version]</em>

The below is an example of a simple requirement to list all VM Created, along with who created them and when they were created.

I outline two methods below. Pick and choose what is appropriate for your needs.
<h1>Method 1</h1>
<h2>Using the Activity Logs for the subscriptions from the Azure Portal</h2>
&nbsp;
<ol type="1">
 	<li value="1"><span>Go to "More Services" as shown below.</span></li>
</ol>
<a href="https://msdnshared.blob.core.windows.net/media/2017/11/MoreServices.png"><img width="360" height="651" class=" wp-image-1746 aligncenter" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/11/MoreServices-166x300.png" /></a>

<i>[Please click on pic to get a clearer version]</i>

&nbsp;
<ol type="1">
 	<li value="2"><span>On the Search pane type "Log" and choose Activity Logs</span></li>
</ol>
&nbsp;

<a href="https://msdnshared.blob.core.windows.net/media/2017/11/Activity-LKogs.png"><img width="476" height="507" class=" wp-image-1755 aligncenter" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/11/Activity-LKogs-282x300.png" /></a>

<i>[Please click on pic to get a clearer version]</i>

&nbsp;

Configure the Query parameters as follows:-

[caption id="attachment_1756" align="alignnone" width="300"]<a href="https://msdnshared.blob.core.windows.net/media/2017/11/Query.png"><img width="300" height="154" class="size-medium wp-image-1756" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/11/Query-300x154.png" /></a> Activity Log Query <i>[Please click on pic to get a clearer version]</i>[/caption]&nbsp;

&nbsp;

&nbsp;
<h1>Method 2</h1>
&nbsp;
<h2>Using OMS Log Analytics</h2>
For this one has to have an OMS workspace associated to the subscription.
<h3>QUERY TEXT</h3>
&nbsp;

AzureActivity

| where OperationName endswith "Write"

| where ActivityStatus == "Succeeded"

| where ActivitySubstatus contains "Created"

| project resourceName=Resource, CreatedBy=Caller, dateTimeOfCreation=TimeGenerated, ResourceGroup, SubscriptionId, ResourceId

[caption id="attachment_1765" align="aligncenter" width="734"]<a href="https://msdnshared.blob.core.windows.net/media/2017/11/OMS.png"><img width="734" height="313" class=" wp-image-1765" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/11/OMS-300x128.png" /></a> OMS Log Analytics Query <i>[Please click on pic to get a clearer version]</i>[/caption]There are various schemas you can check to see if it is the one that contains the data that you want to query on. A sample of these schemas is shown below.

[caption id="attachment_1785" align="alignnone" width="300"]<a href="https://msdnshared.blob.core.windows.net/media/2017/11/Untitled-picture.png"><img width="300" height="139" class="size-medium wp-image-1785" alt="" src="https://msdnshared.blob.core.windows.net/media/2017/11/Untitled-picture-300x139.png" /></a> Various Schemas[/caption]

&nbsp;

&nbsp;

&nbsp;

&nbsp;

&nbsp;

&nbsp;]]></content:encoded>
    </item>
    <item>
      <title>ARM Template - combining Application Gateway and enabling diagnostic logging into OMS</title>
      <link>https://docs.microsoft.com/archive/blogs/girishp/arm-template-combining-application-gateway-and-enabling-diagnostic-logging</link>
      <pubDate>Tue, 09 May 2017 03:22:38 GMT</pubDate>
      <dc:creator><![CDATA[gpillai]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/girishp/?p=1695</guid>
      <description><![CDATA[Introduction

Often times you are looking to go beyond the basic ARM template and as a...]]></description>
      <content:encoded><![CDATA[<strong>Introduction</strong>

Often times you are looking to go beyond the basic ARM template and as a Security/Infrastructure admin for the CORP's Azure deployment, your objective is to make sure Applications being deployed are following best practices some of which are:-
(a) Applications should be behind an Application Gateway (AppGW) combined/protected by a Web Application Firewall(WAF).
(b) Application should be funneling their diagnostic logs to an Operations Manager sink.
(c) Maybe other things from a security view point you can add.

<strong> Requirement </strong>

Application developers will deploy their applications and have infrastructure Code in the form of JSON templates OR the application owners hand over the Application code binaries and the infrastructure environment in the form of ARM template. Now you, the Azure Administrator, is responsible for securely deploying this application into the PROD environment, with the added requirements of Application security and logging. And you need to repeat this multiple times for multiple applications - so you need a template that combines the basic infrastructure the Application requires, plus a template to provision AppGW/WAF and combine with turning on diagnostic log and feed it into an OMS sink.

<strong> Implementation </strong>

You could use different techniques to do this. The first one that comes to mind is to create this from the portal in Azure and then reverse engineer the template out of the deployment. Unfortunately you cannot do that as of today (05/2017) as AppGW schema is not supported in the "Automation Script" - you will get the following error, when you try this reverse engineering route.

<em>Application gateways cannot be exported yet and is not included in the template. See error details.</em>
<code>The schema of resource type 'Microsoft.Network/applicationGateways' is not available. Resources of this type will not be exported to the template. (Code: ResourceTypeSchemaNotFound, Target: Microsoft.Network/applicationGateways) </code>

So we are left with the taking AppGW template from one of the public repository and then combining it appropriately with the requisite JSON fragments for diagnostic settings, testing it, fixing errors till the deployment runs through completion. Then verify the actual deployment of the AppGW and the diagnostic settings persisted in the portal and as well as logs show up in the OMS sink.

<strong> Process </strong>

I essentially needed an AppGW template to start with. For this I used one from this link
<a href="https://azure.microsoft.com/en-us/resources/templates/?resourceType=Microsoft.Network&amp;term=Application+Gateway">Application Gateway Templates</a>
Also the second ingredient required is the method for the diagnostic settings. The reference to this can be found in <a href="https://docs.microsoft.com/en-us/azure/monitoring-and-diagnostics/monitoring-enable-diagnostic-logs-using-template">Templatizing diagnostic log settings</a>

First fire up Visual Studio and then create a project of type "Azure Resource Group". Use a blank template and copy over one of your chosen AppGW based template. You could use one from the first link above OR use any other template you have for an Application Gateway.

<a href="https://msdnshared.blob.core.windows.net/media/2017/05/VS-2017-05-08_22-02-37.png"><img width="300" height="183" class="alignnone size-medium wp-image-1705" alt="vs-2017-05-08_22-02-37" src="https://msdnshared.blob.core.windows.net/media/2017/05/VS-2017-05-08_22-02-37-300x183.png" /></a>

&nbsp;

Let me highlight some sections, that I had to figure out to get this to work.

The <strong>important</strong> thing is to add the resource specification for the diagnostic settings (in the second link above) correctly as a nested resource to the Application Gateway resource.

This is shown in the below graphic. <em> <b>Click on it to see a clearer view </b></em>

<a href="https://msdnshared.blob.core.windows.net/media/2017/05/AppGW-2017-05-08_22-16-05.png"><img width="300" height="203" class="alignnone size-medium wp-image-1715" alt="Nested resource for Diagnostics under an App-GW " src="https://msdnshared.blob.core.windows.net/media/2017/05/AppGW-2017-05-08_22-16-05-300x203.png" /></a>

As you can see in the graphic above, I have the primary resource "Application Gateway" and under it a nested resource of type "providers/diagnosticSettings" which depends on a resource of type "Microsoft.Network/applicationGateways".

<code>"type": "providers/diagnosticSettings",
"name": "Microsoft.Insights/service",
"dependsOn": [
"[concat('Microsoft.Network/applicationGateways/', variables('applicationGatewayName'))]"
],</code>

<strong>Parameter File</strong>

In my parameter file I already created the storage account and workspaceID which I then referred directly below. You could also use the JSON "depends" notation and create them dynamically if you so desired. In my case I chose to precreate them and refer them as parameters in my template, as I was mainly testing "HOW TO: Add the diagnostic log settings for an OMS sink into the main AppGW template.

<code>{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"backendIpAddress1": {
"value": "appGWIP1"
},
"backendIpAddress2": {
"value": "appGPIP2"
},
<em>"storageAccountName": {
"value": "myteststore321"
},</em>
<em>"workspaceId": {
"value": "/subscriptions/xxxx8775-d18a-45bb-abcd-3627de55xxxx/resourcegroups/mytest/providers/microsoft.operationalinsights/workspaces/mytestoms"
}</em>
}
}</code>

The full form of the main template is posted in the graphic below. <b> To see it clearly click on the image and then hit "Ctrl +" in the browser</b>

<a href="https://msdnshared.blob.core.windows.net/media/2017/05/Full-Template-2017-05-08_22-41-40.png"><img width="123" height="300" class="alignnone size-medium wp-image-1726" alt="Full Main Template" src="https://msdnshared.blob.core.windows.net/media/2017/05/Full-Template-2017-05-08_22-41-40-123x300.png" /></a>]]></content:encoded>
    </item>
    <item>
      <title>MAS - Azure Stack Infrastructure Roles</title>
      <link>https://docs.microsoft.com/archive/blogs/girishp/mas-azure-stack-infrastructure-roles</link>
      <pubDate>Tue, 25 Apr 2017 19:47:06 GMT</pubDate>
      <dc:creator><![CDATA[gpillai]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/girishp/?p=1676</guid>
      <description><![CDATA[Continuing on the Microsoft Azure Stack (MAS) series, in this topic I am exploring some of the...]]></description>
      <content:encoded><![CDATA[Continuing on the Microsoft Azure Stack (MAS) series, in this topic I am exploring some of the Infrastructure roles. This is off a TP3 Refresh deployment of MAS.

<strong>Note</strong> Everything is with respect to a point in time. The point in time reference to this is TP3 Refresh timeline, though there may be changes later. 



<b> Infrastructure Roles </b>
A picture is worth a thousand words. The following is a list of the infrastructure roles available when you deploy TP3 refresh. Click to see expanded/clear view.

[caption id="attachment_1686" align="alignnone" width="300"]<a href="https://msdnshared.blob.core.windows.net/media/2017/04/MAS-Infra-Roles.png"><img src="https://msdnshared.blob.core.windows.net/media/2017/04/MAS-Infra-Roles-300x269.png" alt="Infrastructure Roles " width="300" height="269" class="size-medium wp-image-1686" /></a> Infrastructure Roles [/caption]


The following are a few brief lines of what each one does in addition to several other things they do, that are not exposed. 
1. <b>Network Controller</b> - As the name indicates the Network Controller provides network services and is the underlying the controller the Network Resource Provider (RP) talks to, when users submits requests to that RP.
2. <b> Compute Controller</b> - Again as the name indicates the Compute RP needs to talk to this controller before any Compute related resources such as VMs, VMSSs, VMExtensions etc are provisioned.
3. <b> Storage Controller </b> - The controller that Admins/End users need to route their requests to, to provision anything storage related. Also it does all the magic under the covers of Storage Spaces direct, and taking care of disk and data resiliency. 
4. <b>Backup Controller</b> - This is an additional service engineered by the MAS team, to do the backup of the infrastructure related data onto a file share in the customers' data center. Note that for redundancy purposes, one would funnel this backup data to another location also, once the backup controller backs up the infrastructure data &amp; meta-data onto an on-prem file share. 
5. <b>Edge Gateway</b> - a single node MAS installation creates an Edge Gateway, through which traffic is routed IN and OUT of the solution. 
6. <b>Load Balancer MUX</b> - At a high level, this does the magic of doing the network translation and as well as routing the packets inside the solution. Simply put the SLB MUX load balancer works just like in public Azure to publish the RDP port and any other ports you choose to open up.  It provides Load Balancing, NAT'ting, route table propagation (using BGP), along with the enforcing NSG rules - all in one solution - it does the real SDN magic.  
7. <b>ADFS</b> - MAS comes with an built in ADFS role. Its primary purpose is if you wanted to operate with direct access to an on-prem AD, then you can use the MAS built-in ADFS to federate with an on-prem AD.
8. <b>Infrastructure Deployment</b> - This is the role that takes care of installing, updating, patching etc.,, of your MAS deployment - aka the ECE component.
9. <b> Health Controller </b> - As the name indicated this does the collection and probing for Health of the system, and as well as surfacing the Health events back to the Health RP and via it to external systems like the portal OR to PS, and APIs who query for health events.
10. <b> ARM </b> - This is the role that sits on top of all of the RPs and provides a consistent management and provisioning layer, allowing life-cycle (CRUD) activities of resources via ARM templates, and mediates and distributes all of the incoming RP requests from the Admins and tenant users alike.
11. <b>Cert Management </b> - MAS uses its own Certificate manager for various things among which it also validates inter-role, inter-RP and other internal communications. It also rotates/expires the certificate aggressively to prevent any tampering with the secured communications that happens inside this sealed system.
12. <b> ACS Ring</b> This provides among various other things, the storage health and life-cycle management of storage related components, and built using the Service Fabric Ring architecture, due to its need to be highly resilient and fault tolerant, to keep the underlying storage sub-systems and data integral and available at all times. Again this does the software defined storage management under the covers, like gobbling up additional disk capacity into the storage cluster transparent to the end users.

<b>PS</b> This information is from deploying the publicly available TP3 refresh bits and from publicly available data/documentation. 
]]></content:encoded>
    </item>
  </channel>
</rss>