Azure Resource Managerでリソースを管理しよう その3

前回はAzure Resouce Managerによって、リソースグループ単位での権限管理をAzure Active Directoryで行える事、Azure Active Directoryは既存のActive Directoryと同期が可能である事について書きました。
今回は、そのリソースグループに各チームがどのようにインフラを展開したのか?について書き進めていきます。

テンプレートによるリソース定義

Azure Resouce ManagerはJSONによる、テンプレート定義を行い、インフラやサービスの構成の展開を定型化する事ができます。
今のところはJSON書いたら、Azureのサービスを新規作成したりできるくらいに思っててもらってOKです。
参考になりそうなテンプレートは、Github Azure/azure-quickstart-templates https://github.com/Azure/azure-quickstart-templates などを探してもらうと、テンプレートデプロイメントによる用例が見つかると思います。

まずはやってみる

作り方やテンプレートの詳細については、次回に譲って、どんな感じで動くのかをやってみるのが一番です。
ここでは、サンプルを用意しました。ダウンロードはこちら ubuntu.json
詳しい解説と作り方などは、後の記事で説明するって事にして、まずは試してみましょう。

  1. ポータルから新規をクリック
  2. Marketplaceの検索窓にTemplateと入力
    3-1
  3. テンプレートのデプロイ(英語ならTemplate Deployment)を選択
  4. 作成をクリック
  5. テンプレート編集を開いて、最下部にあるJSONコードをコピー&ペースト(元からあったのは消して良いです)して、保存をクリック
    3-2
  6. パラメータにアクセスする
    3-3

    1. DNSの名前 :半角英数字
    2. rootのユーザー名 :お好きなユーザ名をログインユーザー名になります。
    3. rootのパスワード :ちゃんと複雑なパスワード
    4. 起動するVMのサイズ :お好きなのを選んでください
    5. 起動するVMの台数:1台以上
    6. すべてのリソースにつけるタグのグループ名:任意
  7. リソースグループを作成します、今回は新規作成ボタンをクリックし、これらのリソースをわかりやすいグループ名でまとめておきます。
    前回の例であれば、ここの部分はヨシダさんが作ってくれている所ですので、その場合は選択する事になります。
  8. 法律条項には、上級者向けなど書いてありますが、みなさん上級者だと思うので当然OKしてください。

何が起こったのか

今回のテンプレートは以下の事が起こっていました。

  1. 仮想マシンのHDD用にAzureストレージを作成
  2. 指定の台数分のパブリックIPアドレスを作成
  3. 仮想マシンを設置する為の仮想ネットワークを作成し、サブネットを作成
  4. 仮想マシンの台数分のネットワークインターフェイスを作成して、ローカルアドレスと作成しておいた、パブリックIPアドレスをマッピング
  5. 仮想マシンをUbuntuのイメージから台数分作成、あらかじめ作っておいた仮想インターフェイスを割り当て、ストレージとHDDも割り当て
  6. 仮想マシンを可用性グループにまとめる

しばらく待っていると、指定した台数のUbuntu Linuxが起動してきたと思います。


リソースを削除する

3-4
折角起動しましたが、今回は削除します、リソースグループを開いて、削除しましょう。


インフラ構成の自動化

ポータルからは、マウスを使ってクリックを頑張れば、何台でも仮想マシンを起動する事ができますが・・・腱鞘炎にはなりたくないですし、できれば勝手にやってもらいたいところです。
それに、インフラに精通している人であれば、Webサーバ群とDBサーバ群と・・・インフラの構成にはよく使われる構成パターンってのがある事を知っていると思います。
ARMではJSON形式のTemplate展開構成を作っておき、自動化する事ができます。

これ使えるの、仮想マシンだけ?

実はいろいろなリソースの構築が可能です。以下を参照してもらうと、例えばWeb Apps、SQL Database、Redis Cacheを作って、Githubからコンテンツをデプロイするって感じで自動化できそうです。仮想マシンでは、任意のシェルやChef、Puppet、Powershell DSCもコールできそうな感じです。

リソース マネージャーのプロバイダー、リージョン、API のバージョン、およびスキーマ

今回は仮想マシンがわかりやすかったので、以下のサンプルにしました。次回はこれらのテンプレートの作り方やコツ、自動化を踏まえたテンプレートの作り方について、深く掘り下げていきたいと思います。


{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "DNS Name": {
      "type": "string",
      "metadata": {
        "description": "インターネット上のユニークなDNS名(ホスト名)"
      }
    },
    "Admin Name": {
      "type": "string",
      "minLength": 1,
      "metadata": {
        "description": "作成するVMの管理者名"
      }
    },
    "Admin Login Password": {
      "type": "securestring",
      "metadata": {
        "description": "作成するVMの管理者パスワード"
      }
    },
    "VM Size": {
      "type": "string",
      "defaultValue": "Standard_D1",
      "allowedValues": [
        "Standard_A1",
        "Standard_A2",
        "Standard_A3",
        "Standard_A4",
        "Standard_D1",
        "Standard_D2",
        "Standard_D3",
        "Standard_D4"
      ],
      "metadata": {
        "description": "作成するVMのサイズ"
      }
    },
    "Number of Instances": {
      "type": "int",
      "minValue": 1,
      "maxValue": 4,
      "defaultValue": 2,
      "metadata": {
        "description": "作成するVMのインスタンス数"
      }
    }
  },
  "variables": {
    "AvailabilitySetName": "VMAvailabiritySet",
    "dscExtConfigurationFunction": "dscExtConfiguration.ps1\\Main",
    "NICNamePrefix": "NIC",
    "PublicIPAddressPrefix": "PublicIP",
    "PublicIPAddressType": "Dynamic",
    "StorageAccountName": "[concat('ms', uniqueString(resourceGroup().id))]",
    "SubnetRef": "[concat(variables('VNETID'),'/subnets/',variables('VNETSubnet1Name'))]",
    "VMImageOffer": "UbuntuServer",
    "VMImagePublisher": "Canonical",
    "VMNamePrefix": "VM",
    "VMOSDiskName": "VMOSDisk",
    "VMOSVersion": "14.04.2-LTS",
    "VMStorageAccountContainerName": "vhds",
    "VMSubnetRef": "[concat(variables('VMVnetID'), '/subnets/', variables('VNETSubnet1Name'))]",
    "VMVnetID": "[resourceId('Microsoft.Network/virtualNetworks', variables('VNETName'))]",
    "VNETID": "[resourceId('Microsoft.Network/virtualNetworks',variables('VNETName'))]",
    "VNETName": "VNET",
    "VNETPrefix": "10.0.0.0/16",
    "VNETSubnet1Name": "Subnet-1",
    "VNETSubnet1Prefix": "10.0.0.0/24"
  },
  "resources": [
    {
      "apiVersion": "2015-06-15",
      "type": "Microsoft.Network/publicIPAddresses",
      "name": "[concat(variables('PublicIPAddressPrefix'), copyindex())]",
      "location": "[resourceGroup().location]",
      "copy": {
        "name": "PublicIPLoop",
        "count": "[parameters('Number of Instances')]"
      },
      "tags": {
        "displayName": "PublicIPAddress",
        "group": "MS"
      },
      "properties": {
        "publicIPAllocationMethod": "[variables('PublicIPAddressType')]",
        "dnsSettings": {
          "domainNameLabel": "[concat(parameters('DNS Name'),copyindex())]"
        }
      }
    },
    {
      "name": "[variables('StorageAccountName')]",
      "type": "Microsoft.Storage/storageAccounts",
      "location": "[resourceGroup().location]",
      "apiVersion": "2015-06-15",
      "dependsOn": [ ],
      "tags": {
        "displayName": "Storage",
        "group": "MS"
      },
      "properties": {
        "accountType": "Standard_LRS"
      }
    },
    {
      "name": "[variables('VNETName')]",
      "type": "Microsoft.Network/virtualNetworks",
      "location": "[resourceGroup().location]",
      "apiVersion": "2015-06-15",
      "dependsOn": [ ],
      "tags": {
        "displayName": "VNET",
        "group": "MS"
      },
      "properties": {
        "addressSpace": {
          "addressPrefixes": [
            "[variables('VNETPrefix')]"
          ]
        },
        "subnets": [
          {
            "name": "[variables('VNETSubnet1Name')]",
            "properties": {
              "addressPrefix": "[variables('VNETSubnet1Prefix')]"
            }
          }
        ]
      }
    },
    {
      "type": "Microsoft.Compute/availabilitySets",
      "name": "[variables('AvailabilitySetName')]",
      "apiVersion": "2015-06-15",
      "location": "[resourceGroup().location]",
      "tags": {
        "displayName": "AvailabilitySet",
        "group": "MS"
      },
      "properties": {
        "platformFaultDomainCount": 3
      }
    },
    {
      "apiVersion": "2015-06-15",
      "type": "Microsoft.Network/networkInterfaces",
      "name": "[concat(variables('NICNamePrefix'), copyindex())]",
      "location": "[resourceGroup().location]",
      "copy": {
        "name": "NICLoop",
        "count": "[parameters('Number of Instances')]"
      },
      "tags": {
        "displayName": "[concat('NIC',copyindex())]",
        "group": "MS"
      },
      "dependsOn": [
        "[concat('Microsoft.Network/publicIPAddresses/', variables('PublicIPAddressPrefix'), copyindex())]",
        "[concat('Microsoft.Network/virtualNetworks/', variables('VNETName'))]"
      ],
      "properties": {
        "ipConfigurations": [
          {
            "name": "ipconfiguration",
            "properties": {
              "privateIPAllocationMethod": "Dynamic",
              "publicIPAddress": {
                "id": "[resourceId('Microsoft.Network/publicIPAddresses', concat(variables('PublicIPAddressPrefix'), copyIndex()))]"
              },
              "subnet": {
                "id": "[variables('SubnetRef')]"
              }
            }
          }
        ]
      }
    },
    {
      "name": "[concat(variables('VMNamePrefix'), copyindex())]",
      "type": "Microsoft.Compute/virtualMachines",
      "location": "[resourceGroup().location]",
      "apiVersion": "2015-06-15",
      "dependsOn": [
        "[concat('Microsoft.Storage/storageAccounts/', variables('StorageAccountName'))]",
        "[concat('Microsoft.Network/networkInterfaces/', variables('NICNamePrefix'), copyindex())]",
        "[concat('Microsoft.Compute/availabilitySets/', variables('AvailabilitySetName'))]"
      ],
      "copy": {
        "name": "VMLoop",
        "count": "[parameters('Number of Instances')]"
      },
      "tags": {
        "displayName": "[concat('WinVM',copyindex())]",
        "group": "MS"
      },
      "properties": {
        "availabilitySet": {
          "id": "[resourceId('Microsoft.Compute/availabilitySets',variables('AvailabilitySetName'))]"
        },
        "hardwareProfile": {
          "vmSize": "[parameters('VM Size')]"
        },
        "osProfile": {
          "computerName": "[concat(variables('VMNamePrefix'), copyindex())]",
          "adminUsername": "[parameters('Admin Name')]",
          "adminPassword": "[parameters('Admin Login Password')]"
        },
        "storageProfile": {
          "imageReference": {
            "publisher": "[variables('VMImagePublisher')]",
            "offer": "[variables('VMImageOffer')]",
            "sku": "[variables('VMOSVersion')]",
            "version": "latest"
          },
          "osDisk": {
            "name": "VMOSDisk",
            "vhd": {
              "uri": "[concat('http://', variables('StorageAccountName'), '.blob.core.windows.net/', variables('VMStorageAccountContainerName'), '/', variables('VMOSDiskName'), copyindex(), '.vhd')]"
            },
            "caching": "ReadWrite",
            "createOption": "FromImage"
          }
        },
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "[resourceId('Microsoft.Network/networkInterfaces/', concat(variables('NICNamePrefix'), copyindex()))]"
            }
          ]
        }
      },
      "resources": [
        
      ]
    }
  ],
  "outputs": {
  }
}