ARMテンプレートを使ってサブネットをデプロイ

ARM Template,Azure,Virtual Network

既存の仮想ネットワークへのサブネットデプロイをAzure Resource Manager(ARM)テンプレート+Power Shellでやってみました。

パラメータをCSVから分けて読み込むようにする事で、デプロイ先の仮想ネットワークを別にしたり、複数のサブネットを纏めてを作れるようにしてみました。

サブネットのデプロイは下記の3つのファイルで実施しています。

    • サブネットを定義するARMテンプレート(JSONファイル)
    • パラメータを指定するCSV
    • テンプレートをデプロイするPower Shell

今回作成したものはGitHubにも公開しております。

仮想ネットワークのARMテンプレートを使ったデプロイに関してはこちら。

スポンサーリンク

Azure Portalで既存仮想ネットワーク(VNET) へサブネットを追加

Azure Portal上でサブネットを追加するのは、仮想ネットワークのメニューになります。

メニューで仮想ネットワーク>サブネットと選びます。そうすると+サブネットが表示されますをクリックすると下記のような画面が表示されます。

名前やサブネットのアドレスレンジやNSGを選択した後にOKボタンをクリックすると、仮想ネットワークに対して、サブネットが作成されます。

今回はこの作業と同等の作業をARMテンプレートやパラメータ指定するCSVを使ってやってみます。ARMテンプレートのデプロイはAzure Portalを使用せずにPower Shellでデプロイしています。

サブネットのAzure Resource Manager(ARM)テンプレート

今回は、基本的な設定で確認する為に、以下の条件で設定で作成してみました。

    • サービスエンドポイントの指定は行わない
    • NSGを指定する

作成したサブネット単体でのARMテンプレートのサンプルは以下のようになります。

{{

    “$schema": “http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    “contentVersion": “1.0.0.0",
    “parameters": {
        “location": {
            “type": “string",
            “metadata":{} 
        },
        “vnetName": {
            “type": “string",
            “metadata": {}
        },
        “subnet_name": {
            “type": “string",
            “metadata":{} 
        },
        “subnet_addressRange": {
            “type": “string",
            “metadata":{} 
        },
        “NSG_Name": {
            “type": “string",
            “metadata":{}
        }
    },
        “variables": {
            “NSG_ID":"[resourceId('Microsoft.Network/networkSecurityGroups’, parameters('NSG_Name’))]",
            “privateEndpointNetworkPolicies":"Enabled",
            “privateLinkServiceNetworkPolicies":"Enabled"
        },
        “resources": [
        {
            “type": “Microsoft.Network/virtualNetworks/subnets",
            “apiVersion": “2018-10-01",
            “location": “[parameters('location’)]",
            “name": “[concat(parameters('vnetName’) ,’/’,parameters('subnet_name’))]",
            “properties": {
                “addressPrefix": “[parameters('subnet_addressRange’)]",
                “networkSecurityGroup": {
                                “id": “[variables('NSG_ID’)]"
                                },
                            “serviceEndpoints": [],
                            “delegations": [],
                            “privateEndpointNetworkPolicies": “[variables('privateEndpointNetworkPolicies’)]",
                            “privateLinkServiceNetworkPolicies": “[variables('privateLinkServiceNetworkPolicies’)]"
                            }
        }        
    ]
}

ARMテンプレート作成時にドはまりしました。嵌ったのは2点あります。 

1つ目は、サブネットのNameは、仮想ネットワーク名/サブネット名で作成する必要がありました。

“name": “[concat(parameters('vnetName’) ,’/’,parameters('subnet_name’))]",

contactを使用する事で、仮想ネットワーク名/サブネット名となるようにしています

2つ目は、depends Onで仮想ネットワークをアタッチしない点になります。

depends Onで仮想ネットワークをアタッチするようなサンプルが多く見かけたのですが、この方法で実施すると、同じ仮想ネットワークに複数のサブネットをデプロイ出来ませんでした。最後のサブネットで上書きされてしまい結果、1つのサブネットしか出来ない形になってしまいました。

サブネット設定用のパラメータCSVを作成

サブネット を作成する為にCSVから読み込むパラメータは以下の通りになります。リソースグループ名はデプロイ先のリソースグループ名になります。

    • リソースグループ名(ResourceGroupName)
    • リージョン名(location)
    • 仮想ネットワーク名(vnetName)
    • サブネット名(subnet_name)
    • サブネットのアドレス範囲(subnet_addressRange)
    • ネットワークセキュリティグループ名(NSG_name)

パラメータCSVのサンプルは以下のようになります。

ResourceGroupName,location,vnetName,subnet_name,subnet_addressRange,NSG_name,
デプロイ先RG名,リージョン名,仮想ネットワーク名,サブネット名,サブネットのアドレスレンジ,ネットワークセキュリティグループ名,
RG-1,japaneast,VNET-Name,Snbnet-Name,192.168.1.0/24,NSG-Name,

サブネットの設定内容に合わせてCSVを作成します。

ARMテンプレート+Power Shell使ってサブネットをデプロイ

ARMテンプレートのパス、CSVのパスを指定してデプロイを実施します。

#Subnet Template Deploy

#基本設定(SubnetのNSGを指定する)

$TemplateFilePath = “テンプレートのファイルパス"
$ImportCSVPath = “CSVファイルのファイルパス"

# Inclued Configure Entries
$csv = Import-Csv -path $ImportCSVPath

# Template Deploy
 foreach( $c in $csv ){

New-AzResourceGroupDeployment `
 -ResourceGroupName $c.ResourceGroupName `
 -TemplateFile $TemplateFilePath `
 -location $c.location `
 -vnetName $c.vnetName `
 -subnet_name $c.subnet_name `
 -subnet_addressRange $c.subnet_addressRange `
 -NSG_Name $c.NSG_name `
}

デプロイが成功すると、以下の通りにProvisioningState : Succeededと表示されます。(ログは途中省略しています。)

ResourceGroupName : デプロイ先のリソースグループ名
OnErrorDeployment :
DeploymentName : Subnet作成(NSG付き)_template_20200515
CorrelationId :
ProvisioningState : Succeeded
Timestamp : 2020/YY/MM hh:ss:mm
Mode : Incremental

===================== ========================= ==========
location String リージョン名
vnetName String 仮想ネットワーク名
subnet_name String サブネット名
subnet_addressRange String サブネットアドレスレンジ
NSG_Name String NSG名 

CSVで指定した値で作成した値で作成されている事が確認できます。

※ARMテンプレート作成時にドはまりした時に、マイクロソフトサポート様に助けて頂きました。本当に有難うございました。

スポンサーリンク