2016年6月26日日曜日

SQL Server 2012 SP3とWindows Azure Pack Update Rollup 10 その1

Windows Azure Pack Update Rollup 10は、SQL Server 2012 SP3をサポートしてくれているのか、確認してみます。

本稿は、SQL Server 2012 SP3を適用するところまで、確認は別稿とします。

Windows Azure PackのDBは、VMMデータベースに相乗りしていますので、そちらにSQL Server 2012 SP3を適用します。


適用は、30分ほどで完了しました。

SQL Management Studioで、SQL Server 2012 SP3が適用されたかを確認します。
SQL Server Versions
から下記のSQLスクリプトを拾って実行してみます。
SELECT 
 SERVERPROPERTY('Edition') AS Edition,
 SERVERPROPERTY('ProductVersion') AS ProductVersion,
 SERVERPROPERTY('ProductLevel') AS ProductLevel
結果としては、下記の通り、問題な適用されています。上記のSQLスクリプトを覚えておくと重宝しますね!


もちろんWindows Updateの履歴からも、SQL Server 2012 SP3が適用されていることを確認できます。

System Center 2012 R2 Virtual Machine Manager Update Rollup 10とSystem Center 2012 R2 Operations ManagerのPRO構成

Update Rollupがリリースされると毎度のことですが、System Center 2012 R2 Virtual Machine ManagerとSystem Center 2012 R2 Operations ManagerのPRO(Performance and Resource Optimization)構成が切れます。

System Center 2012 R2 Virtual Machine Manager Update Rollup 10にしますと、System Center 2012 R2 Operations Managerにインポート済みのManagement PacKのバージョンが古くなり、PROが効かなくなるのは、これまでも触れてきました。
Microsoft Operations Management Suite(OMS)がPROの機能をつかって、キャパシティプランニングのデータを表示してくれたりしますので、結構重要です。

確認したところ、やはり接続が切れています。


VMMのインストールフォルダにある"ManagementPacks"フォルダをのぞいてみますと、2016年5月の日付で、VMM用の管理パックが用意されています。


Operations Managerへ、VMMのインストールフォルダにある"ManagementPacks"フォルダの管理パックをインポートします。



オンラインカタログを確認するので、[OK]ボタンを押します。


VMM用の管理パックを選択します。


セキュリティの警告が出ています。


セキュリティ警告の内容は下記の通り。


残り半分の管理パックも確認しておきます。


セキュリティ警告を了解したうえで、インポートを進めます。


18分ほどでインポートが完了しました。


もう一度設定を確認してみます。まだ駄目ですね。


ここで、上記の[Refresh]ボタンを押します。


接続が更新されました。


設定自体も復旧しました。


Service Provider Foundation Update Rollup 10

Service Provider Foundation Update Rollup 10を適用します。

適用にあたって、
Update Rollup 10 for System Center 2012 R2 Orchestrator - Service Provider Foundation

を確認してみましたが、Windows Updateもしくはファイルダウンロードで良いようです。

Windows Updateから適用します。SPFは、VMMコンソールを必要とするので、そちらのアップグレードも併せて適用します。


SPFの場合は、特に再起動不要でした。

System Center 2012 R2 Virtual Machine Manager Update Rollup 10

System Center 2012 R2 Virtual Machine Manager Update Rollup 10を適用します。

適用にあたって、
Update Rollup 10 for System Center 2012 R2 Virtual Machine Manager
を確認してみましたが、Windows Updateもしくはファイルダウンロードで良いようです。

適用前には、VMMのデータベースをバックアップしておきます。以下、バックアップが済んでいる状態として話を進めていきます。

今回は、Windows Updateで適用していきます。VMMサーバーにコンソールも同居しているので、二つ出てきていますが、表示名が重複していますね。。。


適用後は、再起動が必要でした。


適用したらUpdate Rollup 10対応のエージェントをHyper-Vホストにインストールします(アップグレードします)。


ここでRun As accountは、ドメイン管理者を指定しています。


エージェントのアップグレードも完了しました。


表示を最新化したところ、エージェントのバージョンも問題ない旨、確認できます。

System Center 2012 R2とSQL Server 2012 SP3の関係

SQL Server 2012 SP3がリリースされてからしばらく経ちましたが、System Center 2012 R2のサポート状況がまとまっているページをご紹介しておきます。

SQL Server Requirements for System Center 2012 R2

ここに記載されているのは、下記のコンポーネントです。

  • App Controller
  • Data Protection Manager
  • Operations Manager
  • Orchestrator
  • Service Management Automation
  • Service Manager
  • Service Provider Foundation
  • Virtual Machine Manager

現在リリースされているUpdate Rollup 10では下記コンポーネントはSQL Server 2012 SP3にすべて対応していますね。

SCCMは、別のページにまとめられています。

あと、Windows Azure Packは、Microsoft SQL Server versions supported in a Windows Azure Pack deploymentにまとまっています。
SP3対応していないかに見えます。が、更新日が2013/10/17と古いです。伝聞によるとSP3に対応しているとか。。。
こちらは最新情報への更新によって、サポート状況を明らかにしてほしいですね!

Interact x Cloud Samurai 2016 Summer ログ分析のある生活 デモンストレーション編 資料公開しています

2016年6月25日に開催されたInteract x Cloud Samurai 2016 Summerでお話ししたセッション資料を公開しています。
お好みに応じて、Docs.com、Slideshareのいずれかをご覧ください。

System Center 2012 R2 Update Rollup 10

リリースされてから1カ月たってますが、ようやくこちらを確認します。

Description of Update Rollup 10 for Microsoft System Center 2012 R2
によると、今回は、下記のコンポーネントのみが対象でした。

ということで、Virtual Machine ManagerにUR10を適用後、SQL Server 2012 SP3を適用。SPFとWindows Azure PackにUR10を別稿で適用していこうと思います。

2016年6月12日日曜日

OMS Agentを複数のOMSポータルへ接続

OMS Log Analytics Agent multi-homing support にリリースが出ています。

OMS Log Analytics Agent multi-homing support から引用すると" Various teams in an organization can collect data from the same managed device."とあります。複数のチームが別々のOMSポータル(OMS Workplace)を使っている場合でも、同一のデバイスを監視できるということになります。

リリース直後に確認していたのですが、遅まきながらブログ記事にしておきます。
※画像は、Windows Server 2012 R2でキャプチャーしました。

まずは、MS Log Analytics Agentが、単一のポータルにしかつなげないときの画面です。



アップグレードの画面を載せておきますが、そのタイミングでは、OMS Log Analytics Agent multi-homing support の設定はできません。






エージェントのアップグレードなので、再起動が必要でした。

コントロールパネルには、Microsoft Monitoring Agentとして存在します。



5/29時点では、下記のバージョンでした。


OMS Log Analytics Agent multi-homing support の設定は、"Azure Log Analytics (OMS)"にあります。

ここで、[Add]ボタンを押します。
OMSポータル(Workspace IDとPrimary key)を入力する画面が表示されます。


OMSポータルのOverview→ settings→ CONNECTED SOURCES にあるWorkspace IDとPrimary keyを転記します(下記の赤枠部分、マスキングしています)。


追加で二つOMSポータル(Workspace ID)を追加してみました。


しばらくすると接続完了と相成りました。


接続先でも認識されています。


Agentを入れたコンピューター名も確認できます。


以上、参考になれば幸いです。

2016年6月5日日曜日

githubのAzure Resource Manager テンプレートをカスタマイズしてみた - RDP接続とAntiMalwareを組み込むVMテンプレート

githubのAzure Resource Manager テンプレートをカスタマイズしてみた - RDP接続できるVMテンプレートをさらに改良して、AntiMalwareを組み込むVMテンプレートにしてみました。

なお、Windows Server 2016 TP5を本テンプレートをデプロイしたら、AntiMalwareを組み込むところが競合したため、OSバージョンからWindows Server 2016 TP5をのぞいてみました。
※それ以外にもちょっと調整してます。

31c31
<       "defaultValue": "Windows-Server-Technical-Preview",
---
>       "defaultValue": "2012-R2-Datacenter",
35,36c35
<         "2012-R2-Datacenter",
<         "Windows-Server-Technical-Preview"
---
>         "2012-R2-Datacenter"
45a45
>         "Standard_A1",
47a48
>         "Standard_D2",
49c50,52
<         "Standard_DS1"
---
>         "Standard_D2_v2",
>         "Standard_DS1",
>         "Standard_DS2"
62a66,69
>     "vmExtensionName": {
>       "type": "string",
>       "defaultValue": "MicrosoftAntimalware"
>     },
93,95c100,102
<     "lbInboundNatRulesName": "[concat(parameters('vmName'),variables('lbName'),'-InboundNatRules01')]",
<     "lbFrontEndName": "[concat(parameters('vmName'),variables('lbName'),'-FrontEnd01')]",
<     "lbBackendAddressPoolName": "[concat(parameters('vmName'),variables('lbName'),'-BackendPool01')]",
---
>     "lbInboundNatRulesName": "[concat(variables('lbName'),'-InboundNatRules01')]",
>     "lbFrontEndName": "[concat(variables('lbName'),'-FrontEnd01')]",
>     "lbBackendAddressPoolName": "[concat(variables('lbName'),'-BackendPool01')]",
244a252,281
>       }
>     },
>     {
>       "type": "Microsoft.Compute/virtualMachines/extensions",
>       "name": "[concat(parameters('vmName'),'/',parameters('vmExtensionName'))]",
>       "apiVersion": "[variables('apiVersion')]",
>       "location": "[resourceGroup().location]",
>       "dependsOn": [
>         "[concat('Microsoft.Compute/virtualMachines/', parameters('vmName'))]"
>       ],
>       "properties": {
>         "publisher": "Microsoft.Azure.Security",
>         "type": "IaaSAntimalware",
>         "typeHandlerVersion": "1.1",
>         "settings": {
>           "AntimalwareEnabled": "true",
>           "Exclusions": {
>             "Paths": "C:\\Users",
>             "Extensions": ".txt;.mdf;.ldf",
>             "Processes": "taskmgr.exe"
>           },
>           "RealtimeProtectionEnabled": "true",
>           "ScheduledScanSettings": {
>             "isEnabled": "true",
>             "scanType": "Quick",
>             "day": "7",
>             "time": "120"
>           }
>         },
>         "protectedSettings": null
赤い部分がAntiMalwareを組み込むための定義です。

Azure Resource Manager Template Visualizerで読み込んでみると下記のような感じになります。


それでは、コード全体も貼り付けておきます。
{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "vmName": {
      "type": "string",
      "metadata": {
        "description": "name for the Virtual Machine."
      }
    },
    "dnsLabelPrefix": {
      "type": "string",
      "metadata": {
        "description": "Unique DNS Name for the Public IP used to access the Virtual Machine."
      }
    },
    "adminUsername": {
      "type": "string",
      "metadata": {
        "description": "Username for the Virtual Machine."
      }
    },
    "adminPassword": {
      "type": "securestring",
      "metadata": {
        "description": "Password for the Virtual Machine."
      }
    },
    "windowsOSVersion": {
      "type": "string",
      "defaultValue": "2012-R2-Datacenter",
      "allowedValues": [
        "2008-R2-SP1",
        "2012-Datacenter",
        "2012-R2-Datacenter"
      ],
      "metadata": {
        "description": "The Windows version for the VM. This will pick a fully patched image of this given Windows version. Allowed values: 2008-R2-SP1, 2012-Datacenter, 2012-R2-Datacenter."
      }
    },
    "vmSize": {
      "type": "string",
      "defaultValue": "Standard_A2",
      "allowedValues": [
        "Standard_A1",
        "Standard_A2",
        "Standard_D1",
        "Standard_D2",
        "Standard_D1_v2",
        "Standard_D2_v2",
        "Standard_DS1",
        "Standard_DS2"
      ]
    },
    "vmDataDiskSize": {
      "type": "int",
      "defaultValue": "100"
    },
    "rdpFrontend": {
      "type": "int",
      "defaultValue": 50001,
      "metadata": {
        "description": "Public port number for RDP"
      }
    },
    "vmExtensionName": {
      "type": "string",
      "defaultValue": "MicrosoftAntimalware"
    },
    "VNetName": {
      "type": "string",
      "defaultValue": "ArmVNet1"
    },
    "VSubnetName": {
      "type": "string",
      "defaultValue": "Subnet1"
    },
    "storageAccountName": {
      "type": "string",
      "defaultValue": "armstorageact01"
    }
  },
  "variables": {
    "sizeOfDiskInGB": "[parameters('vmDataDiskSize')]",
    "imagePublisher": "MicrosoftWindowsServer",
    "imageOffer": "WindowsServer",
    "vmName": "[parameters('vmName')]",
    "vmSize": "[parameters('vmSize')]",
    "OSDiskName": "[concat(variables('vmName'),'-os')]",
    "dataDisk1VhdName": "[concat(variables('vmName'),'-data1')]",
    "nicName": "[concat(variables('vmName'),'-nic01')]",
    "existingVNetName": "[parameters('VNetName')]",
    "subnetName": "[parameters('VSubnetName')]",
    "publicIPAddressName": "[concat(variables('vmName'),'-PublicIP01')]",
    "publicIPAddressType": "Dynamic",
    "vmStorageAccountContainerName": "[concat(variables('vmName'),'-vhds')]",
    "vnetID": "[resourceId('Microsoft.Network/virtualNetworks',variables('existingVNetName'))]",
    "subnetRef": "[concat(variables('vnetID'),'/subnets/',variables('subnetName'))]",
    "lbName": "[concat(parameters('vmName'),'-lb01')]",
    "lbInboundNatRulesName": "[concat(variables('lbName'),'-InboundNatRules01')]",
    "lbFrontEndName": "[concat(variables('lbName'),'-FrontEnd01')]",
    "lbBackendAddressPoolName": "[concat(variables('lbName'),'-BackendPool01')]",
    "publicIPAddressID": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]",
    "lbID": "[resourceId('Microsoft.Network/loadBalancers',variables('lbName'))]",
    "lbFrontEndIPConfigID": "[concat(variables('lbID'),'/frontendIPConfigurations/',variables('lbFrontEndName'))]",
    "lbPoolID": "[concat(variables('lbID'),'/backendAddressPools/',variables('lbBackendAddressPoolName'))]",
    "lbNatID": "[concat(variables('lbID'),'/inboundNatRules/',variables('lbInboundNatRulesName'))]",
    "apiVersion": "2015-06-15"
  },
  "resources": [
    {
      "apiVersion": "[variables('apiVersion')]",
      "type": "Microsoft.Network/publicIPAddresses",
      "name": "[variables('publicIPAddressName')]",
      "location": "[resourceGroup().location]",
      "properties": {
        "publicIPAllocationMethod": "[variables('publicIPAddressType')]",
        "dnsSettings": {
          "domainNameLabel": "[parameters('dnsLabelPrefix')]"
        }
      }
    },
    {
      "apiVersion": "[variables('apiVersion')]",
      "name": "[variables('lbName')]",
      "type": "Microsoft.Network/loadBalancers",
      "location": "[resourceGroup().location]",
      "dependsOn": [
        "[concat('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))]"
      ],
      "properties": {
        "frontendIPConfigurations": [
          {
            "name": "[variables('lbFrontEndName')]",
            "properties": {
              "publicIPAddress": {
                "id": "[variables('publicIPAddressID')]"
              }
            }
          }
        ],
        "backendAddressPools": [
          {
            "name": "[variables('lbBackendAddressPoolName')]"
          }
        ],
        "inboundNatRules": [
          {
            "name": "[variables('lbInboundNatRulesName')]",
            "properties": {
              "frontendIPConfiguration": {
                "id": "[variables('lbFrontEndIPConfigID')]"
              },
              "protocol": "tcp",
              "frontendPort": "[parameters('rdpFrontend')]",
              "backendPort": 3389,
              "enableFloatingIP": false
            }
          }
        ]
      }
    },
    {
      "apiVersion": "[variables('apiVersion')]",
      "type": "Microsoft.Network/networkInterfaces",
      "name": "[variables('nicName')]",
      "location": "[resourceGroup().location]",
      "dependsOn": [
        "[concat('Microsoft.Network/loadBalancers/',variables('lbName'))]"
      ],
      "properties": {
        "ipConfigurations": [
          {
            "name": "ipconfig1",
            "properties": {
              "privateIPAllocationMethod": "Dynamic",
              "subnet": {
                "id": "[variables('subnetRef')]"
              },
              "loadBalancerBackendAddressPools": [
                {
                  "id": "[variables('lbPoolID')]"
                }
              ],
              "loadBalancerInboundNatRules": [
                {
                  "id": "[variables('lbNatID')]"
                }
              ]
            }
          }
        ]
      }
    },
    {
      "apiVersion": "[variables('apiVersion')]",
      "type": "Microsoft.Compute/virtualMachines",
      "name": "[variables('vmName')]",
      "location": "[resourceGroup().location]",
      "dependsOn": [
        "[concat('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
      ],
      "properties": {
        "hardwareProfile": {
          "vmSize": "[variables('vmSize')]"
        },
        "osProfile": {
          "computerName": "[variables('vmName')]",
          "adminUsername": "[parameters('adminUsername')]",
          "adminPassword": "[parameters('adminPassword')]"
        },
        "storageProfile": {
          "imageReference": {
            "publisher": "[variables('imagePublisher')]",
            "offer": "[variables('imageOffer')]",
            "sku": "[parameters('windowsOSVersion')]",
            "version": "latest"
          },
          "osDisk": {
            "name": "[variables('OSDiskName')]",
            "vhd": {
              "uri": "[concat('http://',parameters('storageAccountName'),'.blob.core.windows.net/',variables('vmStorageAccountContainerName'),'/',variables('OSDiskName'),'.vhd')]"
            },
            "caching": "ReadWrite",
            "createOption": "FromImage"
          },
          "dataDisks": [
            {
              "name": "[variables('dataDisk1VhdName')]",
              "diskSizeGB": "[variables('sizeOfDiskInGB')]",
              "lun": 0,
              "vhd": {
                "uri": "[concat('http://',parameters('storageAccountName'),'.blob.core.windows.net/',variables('vmStorageAccountContainerName'),'/',variables('dataDisk1VhdName'),'.vhd')]"
              },
              "createOption": "Empty"
            }
          ]
        },
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "[resourceId('Microsoft.Network/networkInterfaces',variables('nicName'))]"
            }
          ]
        },
        "diagnosticsProfile": {
          "bootDiagnostics": {
            "enabled": "true",
            "storageUri": "[concat('http://',parameters('storageAccountName'),'.blob.core.windows.net')]"
          }
        }
      }
    },
    {
      "type": "Microsoft.Compute/virtualMachines/extensions",
      "name": "[concat(parameters('vmName'),'/',parameters('vmExtensionName'))]",
      "apiVersion": "[variables('apiVersion')]",
      "location": "[resourceGroup().location]",
      "dependsOn": [
        "[concat('Microsoft.Compute/virtualMachines/', parameters('vmName'))]"
      ],
      "properties": {
        "publisher": "Microsoft.Azure.Security",
        "type": "IaaSAntimalware",
        "typeHandlerVersion": "1.1",
        "settings": {
          "AntimalwareEnabled": "true",
          "Exclusions": {
            "Paths": "C:\\Users",
            "Extensions": ".txt;.mdf;.ldf",
            "Processes": "taskmgr.exe"
          },
          "RealtimeProtectionEnabled": "true",
          "ScheduledScanSettings": {
            "isEnabled": "true",
            "scanType": "Quick",
            "day": "7",
            "time": "120"
          }
        },
        "protectedSettings": null
      }
    }
  ]
}

githubのAzure Resource Manager テンプレートをカスタマイズしてみた - RDP接続できるVMテンプレート

githubのAzure Resource Manager テンプレートをカスタマイズしてみた - Azure Virtual Machine with RDP connection 記事訂正
から、ストレージアカウントと仮想ネットワークは新規作成することなく、既存のものを使うようにテンプレートをカスタマイズしてみましたので、公開します。

まず、Bash on Ubuntu on Windowsによるdiffです。
※参照個所をValiablesからParametersに変えるなど細かい調整もしてます。

10a11,16
>     "dnsLabelPrefix": {
>       "type": "string",
>       "metadata": {
>         "description": "Unique DNS Name for the Public IP used to access the Virtual Machine."
>       }
>     },
23,28d28
<     "dnsLabelPrefix": {
<       "type": "string",
<       "metadata": {
<         "description": "Unique DNS Name for the Public IP used to access the Virtual Machine."
<       }
<     },
31c31
<       "defaultValue": "2012-R2-Datacenter",
---
>       "defaultValue": "Windows-Server-Technical-Preview",
35c35,36
<         "2012-R2-Datacenter"
---
>         "2012-R2-Datacenter",
>         "Windows-Server-Technical-Preview"
40a42,55
>     "vmSize": {
>       "type": "string",
>       "defaultValue": "Standard_A2",
>       "allowedValues": [
>         "Standard_A2",
>         "Standard_D1",
>         "Standard_D1_v2",
>         "Standard_DS1"
>       ]
>     },
>     "vmDataDiskSize": {
>       "type": "int",
>       "defaultValue": "100"
>     },
46a62,73
>     },
>     "VNetName": {
>       "type": "string",
>       "defaultValue": "ArmVNet1"
>     },
>     "VSubnetName": {
>       "type": "string",
>       "defaultValue": "Subnet1"
>     },
>     "storageAccountName": {
>       "type": "string",
>       "defaultValue": "armstorageact01"
50,52c77
<     "storageAccountName": "armstorageact01",
<     "sizeOfDiskInGB": "100",
<     "dataDisk1VhdName": "[concat(variables('vmName'),'-data1')]",
---
>     "sizeOfDiskInGB": "[parameters('vmDataDiskSize')]",
56c81
<     "vmSize": "Standard_D1",
---
>     "vmSize": "[parameters('vmSize')]",
58,63c83,87
<     "nicName": "[concat(variables('vmName'),'-nic1')]",
<     "addressPrefix": "10.0.0.0/16",
<     "subnetName": "Subnet1",
<     "subnetPrefix": "10.0.0.0/24",
<     "storageAccountType": "Standard_LRS",
<     "publicIPAddressName": "[concat(variables('vmName'),'-PublicIP')]",
---
>     "dataDisk1VhdName": "[concat(variables('vmName'),'-data1')]",
>     "nicName": "[concat(variables('vmName'),'-nic01')]",
>     "existingVNetName": "[parameters('VNetName')]",
>     "subnetName": "[parameters('VSubnetName')]",
>     "publicIPAddressName": "[concat(variables('vmName'),'-PublicIP01')]",
65,67c89,90
<     "vmStorageAccountContainerName": "vhds",
<     "virtualNetworkName": "ArmVNet1",
<     "vnetID": "[resourceId('Microsoft.Network/virtualNetworks',variables('virtualNetworkName'))]",
---
>     "vmStorageAccountContainerName": "[concat(variables('vmName'),'-vhds')]",
>     "vnetID": "[resourceId('Microsoft.Network/virtualNetworks',variables('existingVNetName'))]",
69,72c92,95
<     "lbName": "[concat(parameters('vmName'),'-LB')]",
<     "lbInboundNatRulesName": "[concat(parameters('vmName'),'-lbInboundNatRules01')]",
<     "lbFrontEndName": "[concat(parameters('vmName'),'-lbFrontEnd')]",
<     "lbBackendAddressPoolName": "[concat(parameters('vmName'),'-lbBackendPool1')]",
---
>     "lbName": "[concat(parameters('vmName'),'-lb01')]",
>     "lbInboundNatRulesName": "[concat(parameters('vmName'),variables('lbName'),'-InboundNatRules01')]",
>     "lbFrontEndName": "[concat(parameters('vmName'),variables('lbName'),'-FrontEnd01')]",
>     "lbBackendAddressPoolName": "[concat(parameters('vmName'),variables('lbName'),'-BackendPool01')]",
82,90d104
<       "type": "Microsoft.Storage/storageAccounts",
<       "name": "[variables('storageAccountName')]",
<       "apiVersion": "[variables('apiVersion')]",
<       "location": "[resourceGroup().location]",
<       "properties": {
<         "accountType": "[variables('storageAccountType')]"
<       }
<     },
<     {
144,164d157
<       "type": "Microsoft.Network/virtualNetworks",
<       "name": "[variables('virtualNetworkName')]",
<       "location": "[resourceGroup().location]",
<       "properties": {
<         "addressSpace": {
<           "addressPrefixes": [
<             "[variables('addressPrefix')]"
<           ]
<         },
<         "subnets": [
<           {
<             "name": "[variables('subnetName')]",
<             "properties": {
<               "addressPrefix": "[variables('subnetPrefix')]"
<             }
<           }
<         ]
<       }
<     },
<     {
<       "apiVersion": "[variables('apiVersion')]",
169d161
<         "[concat('Microsoft.Network/virtualNetworks/', variables('virtualNetworkName'))]",
202d193
<         "[concat('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]",
222c213
<             "name": "osdisk",
---
>             "name": "[variables('OSDiskName')]",
224c215
<               "uri": "[concat('http://',variables('storageAccountName'),'.blob.core.windows.net/',variables('vmStorageAccountContainerName'),'/',variables('OSDiskName'),'.vhd')]"
---
>               "uri": "[concat('http://',parameters('storageAccountName'),'.blob.core.windows.net/',variables('vmStorageAccountContainerName'),'/',variables('OSDiskName'),'.vhd')]"
231c222
<               "name": "datadisk1",
---
>               "name": "[variables('dataDisk1VhdName')]",
235c226
<                 "uri": "[concat('http://',variables('storageAccountName'),'.blob.core.windows.net/',variables('vmStorageAccountContainerName'),'/',variables('dataDisk1VhdName'),'.vhd')]"
---
>                 "uri": "[concat('http://',parameters('storageAccountName'),'.blob.core.windows.net/',variables('vmStorageAccountContainerName'),'/',variables('dataDisk1VhdName'),'.vhd')]"
251c242
<             "storageUri": "[concat('http://',variables('storageAccountName'),'.blob.core.windows.net')]"
---
>             "storageUri": "[concat('http://',parameters('storageAccountName'),'.blob.core.windows.net')]"

違いとしては
  • 仮想マシンのdependsOnにストレージアカウントを指定しない。
  • ネットワークインタフェースdependsOnに仮想ネットワークを指定しない。
となります。
では、どうやって関連付けるのかということになります。
  • ディスクのURIで指定する。具体的なコード例は下記の赤字部分。
    "osDisk": {
                "name": "[variables('OSDiskName')]",
                "vhd": {
                  "uri": "[concat('http://',parameters('storageAccountName'),'.blob.core.windows.net/',variables('vmStorageAccountContainerName'),'/',variables('OSDiskName'),'.vhd')]"
                },
                "caching": "ReadWrite",
                "createOption": "FromImage"
              },
              "dataDisks": [
                {
                  "name": "[variables('dataDisk1VhdName')]",
                  "diskSizeGB": "[variables('sizeOfDiskInGB')]",
                  "lun": 0,
                  "vhd": {
                    "uri": "[concat('http://',parameters('storageAccountName'),'.blob.core.windows.net/',variables('vmStorageAccountContainerName'),'/',variables('dataDisk1VhdName'),'.vhd')]"
                  },
                  "createOption": "Empty"
                }
              ]
            },
    
    
  • ネットワークインタフェースのpropertiesの中で、指定。具体的なコード例は下記の赤字部分。
    "properties": {
            "ipConfigurations": [
              {
                "name": "ipconfig1",
                "properties": {
                  "privateIPAllocationMethod": "Dynamic",
                  "subnet": {
                    "id": "[variables('subnetRef')]"
                  },
    
    
これが、わかるまでに結構試行錯誤しました。
あと、OSバージョンは、実際にWindows Server 2015 TP5をデプロイして、エクスポートしたテンプレートから調べたところ、"Windows-Server-Technical-Preview"だとわかりました。ただ、正式リリースされたらまた変更されるはずですね。


Azure Resource Manager Template Visualizerで読み込んでみると下記のような感じになります。


ということで、コード全体を下記に記載しておきます。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "vmName": {
      "type": "string",
      "metadata": {
        "description": "name for the Virtual Machine."
      }
    },
    "dnsLabelPrefix": {
      "type": "string",
      "metadata": {
        "description": "Unique DNS Name for the Public IP used to access the Virtual Machine."
      }
    },
    "adminUsername": {
      "type": "string",
      "metadata": {
        "description": "Username for the Virtual Machine."
      }
    },
    "adminPassword": {
      "type": "securestring",
      "metadata": {
        "description": "Password for the Virtual Machine."
      }
    },
    "windowsOSVersion": {
      "type": "string",
      "defaultValue": "Windows-Server-Technical-Preview",
      "allowedValues": [
        "2008-R2-SP1",
        "2012-Datacenter",
        "2012-R2-Datacenter",
        "Windows-Server-Technical-Preview"
      ],
      "metadata": {
        "description": "The Windows version for the VM. This will pick a fully patched image of this given Windows version. Allowed values: 2008-R2-SP1, 2012-Datacenter, 2012-R2-Datacenter."
      }
    },
    "vmSize": {
      "type": "string",
      "defaultValue": "Standard_A2",
      "allowedValues": [
        "Standard_A2",
        "Standard_D1",
        "Standard_D1_v2",
        "Standard_DS1"
      ]
    },
    "vmDataDiskSize": {
      "type": "int",
      "defaultValue": "100"
    },
    "rdpFrontend": {
      "type": "int",
      "defaultValue": 50001,
      "metadata": {
        "description": "Public port number for RDP"
      }
    },
    "VNetName": {
      "type": "string",
      "defaultValue": "ArmVNet1"
    },
    "VSubnetName": {
      "type": "string",
      "defaultValue": "Subnet1"
    },
    "storageAccountName": {
      "type": "string",
      "defaultValue": "armstorageact01"
    }
  },
  "variables": {
    "sizeOfDiskInGB": "[parameters('vmDataDiskSize')]",
    "imagePublisher": "MicrosoftWindowsServer",
    "imageOffer": "WindowsServer",
    "vmName": "[parameters('vmName')]",
    "vmSize": "[parameters('vmSize')]",
    "OSDiskName": "[concat(variables('vmName'),'-os')]",
    "dataDisk1VhdName": "[concat(variables('vmName'),'-data1')]",
    "nicName": "[concat(variables('vmName'),'-nic01')]",
    "existingVNetName": "[parameters('VNetName')]",
    "subnetName": "[parameters('VSubnetName')]",
    "publicIPAddressName": "[concat(variables('vmName'),'-PublicIP01')]",
    "publicIPAddressType": "Dynamic",
    "vmStorageAccountContainerName": "[concat(variables('vmName'),'-vhds')]",
    "vnetID": "[resourceId('Microsoft.Network/virtualNetworks',variables('existingVNetName'))]",
    "subnetRef": "[concat(variables('vnetID'),'/subnets/',variables('subnetName'))]",
    "lbName": "[concat(parameters('vmName'),'-lb01')]",
    "lbInboundNatRulesName": "[concat(parameters('vmName'),variables('lbName'),'-InboundNatRules01')]",
    "lbFrontEndName": "[concat(parameters('vmName'),variables('lbName'),'-FrontEnd01')]",
    "lbBackendAddressPoolName": "[concat(parameters('vmName'),variables('lbName'),'-BackendPool01')]",
    "publicIPAddressID": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]",
    "lbID": "[resourceId('Microsoft.Network/loadBalancers',variables('lbName'))]",
    "lbFrontEndIPConfigID": "[concat(variables('lbID'),'/frontendIPConfigurations/',variables('lbFrontEndName'))]",
    "lbPoolID": "[concat(variables('lbID'),'/backendAddressPools/',variables('lbBackendAddressPoolName'))]",
    "lbNatID": "[concat(variables('lbID'),'/inboundNatRules/',variables('lbInboundNatRulesName'))]",
    "apiVersion": "2015-06-15"
  },
  "resources": [
    {
      "apiVersion": "[variables('apiVersion')]",
      "type": "Microsoft.Network/publicIPAddresses",
      "name": "[variables('publicIPAddressName')]",
      "location": "[resourceGroup().location]",
      "properties": {
        "publicIPAllocationMethod": "[variables('publicIPAddressType')]",
        "dnsSettings": {
          "domainNameLabel": "[parameters('dnsLabelPrefix')]"
        }
      }
    },
    {
      "apiVersion": "[variables('apiVersion')]",
      "name": "[variables('lbName')]",
      "type": "Microsoft.Network/loadBalancers",
      "location": "[resourceGroup().location]",
      "dependsOn": [
        "[concat('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))]"
      ],
      "properties": {
        "frontendIPConfigurations": [
          {
            "name": "[variables('lbFrontEndName')]",
            "properties": {
              "publicIPAddress": {
                "id": "[variables('publicIPAddressID')]"
              }
            }
          }
        ],
        "backendAddressPools": [
          {
            "name": "[variables('lbBackendAddressPoolName')]"
          }
        ],
        "inboundNatRules": [
          {
            "name": "[variables('lbInboundNatRulesName')]",
            "properties": {
              "frontendIPConfiguration": {
                "id": "[variables('lbFrontEndIPConfigID')]"
              },
              "protocol": "tcp",
              "frontendPort": "[parameters('rdpFrontend')]",
              "backendPort": 3389,
              "enableFloatingIP": false
            }
          }
        ]
      }
    },
    {
      "apiVersion": "[variables('apiVersion')]",
      "type": "Microsoft.Network/networkInterfaces",
      "name": "[variables('nicName')]",
      "location": "[resourceGroup().location]",
      "dependsOn": [
        "[concat('Microsoft.Network/loadBalancers/',variables('lbName'))]"
      ],
      "properties": {
        "ipConfigurations": [
          {
            "name": "ipconfig1",
            "properties": {
              "privateIPAllocationMethod": "Dynamic",
              "subnet": {
                "id": "[variables('subnetRef')]"
              },
              "loadBalancerBackendAddressPools": [
                {
                  "id": "[variables('lbPoolID')]"
                }
              ],
              "loadBalancerInboundNatRules": [
                {
                  "id": "[variables('lbNatID')]"
                }
              ]
            }
          }
        ]
      }
    },
    {
      "apiVersion": "[variables('apiVersion')]",
      "type": "Microsoft.Compute/virtualMachines",
      "name": "[variables('vmName')]",
      "location": "[resourceGroup().location]",
      "dependsOn": [
        "[concat('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
      ],
      "properties": {
        "hardwareProfile": {
          "vmSize": "[variables('vmSize')]"
        },
        "osProfile": {
          "computerName": "[variables('vmName')]",
          "adminUsername": "[parameters('adminUsername')]",
          "adminPassword": "[parameters('adminPassword')]"
        },
        "storageProfile": {
          "imageReference": {
            "publisher": "[variables('imagePublisher')]",
            "offer": "[variables('imageOffer')]",
            "sku": "[parameters('windowsOSVersion')]",
            "version": "latest"
          },
          "osDisk": {
            "name": "[variables('OSDiskName')]",
            "vhd": {
              "uri": "[concat('http://',parameters('storageAccountName'),'.blob.core.windows.net/',variables('vmStorageAccountContainerName'),'/',variables('OSDiskName'),'.vhd')]"
            },
            "caching": "ReadWrite",
            "createOption": "FromImage"
          },
          "dataDisks": [
            {
              "name": "[variables('dataDisk1VhdName')]",
              "diskSizeGB": "[variables('sizeOfDiskInGB')]",
              "lun": 0,
              "vhd": {
                "uri": "[concat('http://',parameters('storageAccountName'),'.blob.core.windows.net/',variables('vmStorageAccountContainerName'),'/',variables('dataDisk1VhdName'),'.vhd')]"
              },
              "createOption": "Empty"
            }
          ]
        },
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "[resourceId('Microsoft.Network/networkInterfaces',variables('nicName'))]"
            }
          ]
        },
        "diagnosticsProfile": {
          "bootDiagnostics": {
            "enabled": "true",
            "storageUri": "[concat('http://',parameters('storageAccountName'),'.blob.core.windows.net')]"
          }
        }
      }
    }
  ]
}