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

今まで概要ばかりでしたので、少しづつ濃度を上げていきます。
Azure Resource Managerを触りだすとわかるのですが、JSONによる宣言型リソース定義を行うツールです。
ARMでは、リソースのあるべき状態の定義を行い、冪等性(べきとうせい)っぽい所があります。

同じCSAの真壁さんが、VMを使ったAzure Resource Managerが持つ冪等性(べきとうせい)っぽい仕様、について解説してくれています。
Chef、Puppet、Ansible、PowerShellDSCなどを日ごろから触っている人であれば、この言葉はわかると思いますので、是非そちらも併せて読んでみてください。

Azure ARM Templateによるデプロイと冪等性

増分デプロイを理解する

やってみて感覚つかみましょう。
以下はネットワークを構成するAzure Resource Managerのテンプレートです。
前回の記事と同じく、カスタムテンプレートから以下のJSONを投入して試してみてください。
このネットワーク構成は、以下の図のようなシンプルなネットワークをデプロイメントします。

VNET1

VNET2

{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
    },
    "variables": {
        "companyPrefix": "10.0.0.0/16",
        "companySubnet1Name": "Subnet-1",
        "companySubnet1Prefix": "10.0.0.0/24",
        "companySubnet2Name": "Subnet-2",
        "companySubnet2Prefix": "10.0.1.0/24"
    },
    "resources": [
        {
            "name": "company",
            "type": "Microsoft.Network/virtualNetworks",
            "location": "[resourceGroup().location]",
            "apiVersion": "2015-05-01-preview",
            "dependsOn": [ ],
            "tags": {
                "displayName": "company"
            },
            "properties": {
                "addressSpace": {
                    "addressPrefixes": [
                        "[variables('companyPrefix')]"
                    ]
                },
                "subnets": [
                    {
                        "name": "[variables('companySubnet1Name')]",
                        "properties": {
                            "addressPrefix": "[variables('companySubnet1Prefix')]"
                        }
                    },
                    {
                        "name": "[variables('companySubnet2Name')]",
                        "properties": {
                            "addressPrefix": "[variables('companySubnet2Prefix')]"
                        }
                    }
                ]
            }
        }
    ],
    "outputs": {
    }
}

サブネットを増分でデプロイ

デプロイできましたでしょうか、次にサブネットを増分で1つ増やします、前のネットワークは作ったまま、同じリソースグループに以下のテンプレートを流してみてください。

VNET8

VNET3

VNET4

{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
    },
  "variables": {
    "companyPrefix": "10.0.0.0/16",
    "companySubnet1Name": "Subnet-1",
    "companySubnet1Prefix": "10.0.0.0/24",
    "companySubnet2Name": "Subnet-2",
    "companySubnet2Prefix": "10.0.1.0/24",
    "companySubnet3Name": "Subnet-3",
    "companySubnet3Prefix": "10.0.2.0/24"
  },
    "resources": [
        {
            "name": "company",
            "type": "Microsoft.Network/virtualNetworks",
            "location": "[resourceGroup().location]",
            "apiVersion": "2015-05-01-preview",
            "dependsOn": [ ],
            "tags": {
                "displayName": "company"
            },
            "properties": {
                "addressSpace": {
                    "addressPrefixes": [
                        "[variables('companyPrefix')]"
                    ]
                },
              "subnets": [
                {
                  "name": "[variables('companySubnet1Name')]",
                  "properties": {
                    "addressPrefix": "[variables('companySubnet1Prefix')]"
                  }
                },
                {
                  "name": "[variables('companySubnet2Name')]",
                  "properties": {
                    "addressPrefix": "[variables('companySubnet2Prefix')]"
                  }
                },
                {
                  "name": "[variables('companySubnet3Name')]",
                  "properties": {
                    "addressPrefix": "[variables('companySubnet3Prefix')]"
                  }
                }
              ]
            }
        }
    ],
    "outputs": {
    }
}

リソースをループで複製して増やす

固定的な定義型のテンプレートのデプロイメントも便利ですが、ちょっと冪等性の趣旨からは外れますが、以下のようなことをやってみます。
Azure Resource Managerの理解を進める上で、定番の複製方法でもあり、とても大事な部分ですので、じっくり読んでみてください。

  • parametersがある
  • variablesがある
  • copyがある
  • concatとか、関数っぽいものがある

そんなところでしょうが、本来はネットワーク構造全体をコピーする事はあまり多くはないと思いますが、ここでは練習として仮想ネットワークを増やしてみるテンプレートを作ってみました。
このJSONの理解には、以下のドキュメントを軽く読んでもらえればスグにでも理解できると思います。

Azure リソース マネージャーのテンプレートの作成

Azure リソース マネージャーのテンプレートの式

Azure リソース マネージャーでリソースの複数のインスタンスを作成する

{
  "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "count": {
      "type": "int",
      "maxValue": 50,
      "defaultValue": 1
    }
  },
  "variables": {
    "companyPrefix": "10.0.0.0/16",
    "companySubnet1Name": "DMZ",
    "companySubnet1Prefix": "10.0.0.0/24",
    "companySubnet2Name": "Private",
    "companySubnet2Prefix": "10.0.1.0/24"
  },
  "resources": [
    {
      "name": "[concat('company',copyindex())]",
      "type": "Microsoft.Network/virtualNetworks",
      "location": "[resourceGroup().location]",
      "apiVersion": "2015-05-01-preview",
      "copy": {
        "name": "networkcopy",
        "count": "[parameters('count')]"
      },
      "dependsOn": [ ],
      "tags": {
        "displayName": "[concat('company',copyindex())]"
      },
      "properties": {
        "addressSpace": {
          "addressPrefixes": [
            "[variables('companyPrefix')]"
          ]
        },
        "subnets": [
          {
            "name": "[variables('companySubnet1Name')]",
            "properties": {
              "addressPrefix": "[variables('companySubnet1Prefix')]"
            }
          },
          {
            "name": "[variables('companySubnet2Name')]",
            "properties": {
              "addressPrefix": "[variables('companySubnet2Prefix')]"
            }
          }
        ]
      }
    }
  ],
  "outputs": {
  }
}

限界まで仮想ネットワークを作ってみる

己の限界も知っておきたいので、どれくらいでキャパシティ制限がかかるのかネットワークを作ってみました。
そんなクォータの話はどこに書いてあるの?って話なのですが、Azure サブスクリプションとサービスの制限、クォータ、制約に記載があります。
これによると、サブスクリプションあたりの仮想ネットワーク数は既定が50個で、申請後の上限は100個ですので、今回は50個作ってみました。

VNET5 VNET6 VNET7