Bicepでドメインに参加したWindowsVMのコード記述方法

■はじめに

本記事では、Bicepを用いて、ドメインに参加したWindowsVMを作成するためのコード記述方法について記載します。

WindowsVMを作成するためのBicepコードは、Microsoftの公式ドキュメント等でも記載されていますが、

ドメイン参加のBicepコードについては記載がなかったため、ドメインに参加したWindowsVMを作成したい方には需要がある内容になっているのではないかと思います。

また、ARMテンプレートを用いて、ドメインに参加したVMを作成する方法については下記記事にて記載しています。

ARMテンプレートからデプロイする#2

 

 

 

■Bicepとは

Bicepとは、宣言型の構文を使用して Azureリソースをデプロイするドメイン固有言語 (DSL) のことです。

従来のARMテンプレートに比べ、簡潔で読みやすく書きやすいという点がBicepの特徴になります。

また、Bicepファイルはデプロイされる際に、ARMテンプレートに自動で変換されます。

 

 

 

■ドメインに参加するためのBicepコード

ここでは、ドメインに参加するためのBicepコードについて記載しますが、基本的なBicepの構文については説明を省きます。

 

仮想マシンをドメインに参加させるためには、”子リソース”として”拡張機能リソース”をデプロイする必要があります。

 

まず、“拡張機能リソース”とは、Azureリソースの動作を拡張するもので、他のAzureリソースにアタッチする形で使用されます。

拡張機能リソースには様々な種類がありますが、今回は仮想マシンに対してドメインに参加するコードを付け足したいので、

仮想マシン拡張機能「Microsoft.Compute/virtualMachines/extensions」を使用します。

 

続いて、“子リソース”とは、別のリソース(親リソース)のコンテキスト内でのみ存在するリソースのことです。

上記に記載した仮想マシン拡張機能は、仮想マシンなしでは存在出来ません。

そのため、この仮想マシン拡張機能リソースを仮想マシンの子リソースとしてデプロイします。

その際、子リソースの構文内に「parent」を用いて、紐づく仮想マシン(親リソース)を定義します。

参照ドキュメント:Bicep の子リソース – Azure Resource Manager | Microsoft Learn

 

では、実際に仮想マシンをドメインに参加させるためのBicepコードを、例として以下に添付します。

@description(‘The FQDN of the AD domain’)
param domainToJoin string = ‘XXXX’

 

@description(‘Username of the account on the domain’)
param domainUsername string

 

@description(‘Password of the account on the domain’)
@secure()
param domainPassword string

 

resource virtualMachine ‘Microsoft.Compute/virtualMachines@2021-03-01’ = {
  …VM構成コード省略…
}

 

resource virtualMachineExtension ‘Microsoft.Compute/virtualMachines/extensions@2021-03-01′ = {
  parent: virtualMachine
  name: ‘joindomain’
  location: resourceGroup().location
  properties: {
    publisher: ‘Microsoft.Compute’
    type: ‘JsonADDomainExtension’
    typeHandlerVersion: ‘1.3’
    autoUpgradeMinorVersion: true
    settings: {
      name: domainToJoin
      ouPath: ‘OU=XXXX,DC=XXXX,DC=XXXX’
      user: ‘${domainToJoin}\\${domainUsername}’
      restart: true
      options: ‘3’
    }
    protectedSettings: {
      Password: domainPassword
    }
  }
}

・「domainToJoin」には、参加先のドメイン名を記載します。

・「ouPath」には、ドメインに参加させる仮想マシンを配置したいOUを記載します。

 

 

 

■ドメインに参加したWindowsVMを作成するための基本的なBicepコード例

ここでは、ドメインに参加したWindowsVMを作成するための基本的なBicepコードについて記載します。

 

※前提条件:ここで作成するWindowsVMは、ドメイン参加先のADサーバと同じVnet・リージョンにデプロイします。

上記の前提条件を満たすためには、Vnetは“既存リソース”を使用する必要があります。

既存リソースは、「existing」でリソースを宣言することで使用可能になります。

参照ドキュメント:Bicep で既存のリソースを参照する – Azure Resource Manager | Microsoft Learn

 

では、実際にデプロイする際に使用したBicepコードを、例として以下に添付します。

@description(‘The name of the administrator of the new VM.’)
param adminUsername string

 

@description(‘The password for the administrator account of the new VM.’)
@secure()
param adminPassword string

 

@description(‘Unique public DNS prefix for the deployment. The fqdn will look something like \'<dnsname>.westus.cloudapp.azure.com\’. Up to 62 chars, digits or dashes, lowercase, should start with a letter: must conform to \’^[a-z][a-z0-9-]{1,61}[a-z0-9]$\’.’)
@minLength(1)
@maxLength(15)
param dnsLabelPrefix string

 

@description(‘Existing VNET that contains the domain controller’)
param existingVnetName string = ‘bicepVNET’

 

@description(‘Existing subnet that contains the domain controller’)
param existingSubnetName string = ‘default’

 

@description(‘Public IP address name’)
param publicIPAddressName string = ‘${dnsLabelPrefix}-pip’

 

@description(‘The FQDN of the AD domain’)
param domainToJoin string = ‘XXXX’

 

@description(‘Username of the account on the domain’)
param domainUsername string

 

@description(‘Password of the account on the domain’)
@secure()
param domainPassword string

 

@description(‘The name of the storage account.’)
param storageAccountName string = uniqueString(resourceGroup().id, deployment().name)

 

@description(‘Location for all resources.’)
param location string = resourceGroup().location

 

resource existingVirtualNetwork ‘Microsoft.Network/virtualNetworks@2021-02-01’ existing = {
  name: existingVnetName
}

 

resource existingSubnet ‘Microsoft.Network/virtualNetworks/subnets@2021-02-01’ existing = {
  parent: existingVirtualNetwork
  name: existingSubnetName
}

 

resource publicIp ‘Microsoft.Network/publicIPAddresses@2021-02-01’ = {
  name: publicIPAddressName
  location: location
  properties: {
    publicIPAllocationMethod: ‘Dynamic’
    dnsSettings: {
      domainNameLabel: dnsLabelPrefix
    }
  }
}

 

resource storageAccount ‘Microsoft.Storage/storageAccounts@2021-04-01’ = {
  name: storageAccountName
  location: location
  kind: ‘Storage’
  sku: {
    name: ‘Standard_LRS’
  }
}

 

resource nic ‘Microsoft.Network/networkInterfaces@2021-02-01’ = {
  name: ‘${dnsLabelPrefix}-nic’
  location: location
  properties: {
    ipConfigurations: [
      {
        name: ‘ipconfig1’
        properties: {
          privateIPAllocationMethod: ‘Dynamic’
          publicIPAddress: {
            id: publicIp.id
          }
          subnet: {
            id: existingSubnet.id
          }
        }
      }
    ]
  }
}

 

resource virtualMachine ‘Microsoft.Compute/virtualMachines@2021-03-01’ = {
  name: dnsLabelPrefix
  location: location
  properties: {
    hardwareProfile: {
      vmSize: ‘Standard_D4as_v4’
    }
    osProfile: {
      computerName: dnsLabelPrefix
      adminUsername: adminUsername
      adminPassword: adminPassword
    }
    storageProfile: {
      imageReference: {
        publisher: ‘MicrosoftWindowsServer’
        offer: ‘WindowsServer’
        sku: ‘2022-datacenter-azure-edition-core’
        version: ‘latest’
      }
      osDisk: {
        name: ‘${dnsLabelPrefix}-OsDisk’
        caching: ‘ReadWrite’
        createOption: ‘FromImage’
        managedDisk: {
          storageAccountType: ‘StandardSSD_LRS’
        }
      }
      dataDisks: [
        {
          name: ‘${dnsLabelPrefix}-DataDisk’
          caching: ‘None’
          createOption: ‘Empty’
          diskSizeGB: 1024
          lun: 0
        }
      ]
    }
    networkProfile: {
      networkInterfaces: [
        {
          id: nic.id
        }
      ]
    }
    diagnosticsProfile: {
      bootDiagnostics: {
        enabled: true
        storageUri: storageAccount.properties.primaryEndpoints.blob
      }
    }
  }
}

 

resource virtualMachineExtension ‘Microsoft.Compute/virtualMachines/extensions@2021-03-01’ = {
  parent: virtualMachine
  name: ‘joindomain’
  location: location
  properties: {
    publisher: ‘Microsoft.Compute’
    type: ‘JsonADDomainExtension’
    typeHandlerVersion: ‘1.3’
    autoUpgradeMinorVersion: true
    settings: {
      name: domainToJoin
      ouPath: ‘OU=XXXX,DC=XXXX,DC=XXXX’
      user: ‘${domainToJoin}\\${domainUsername}’
      restart: true
      options: ‘3’
    }
    protectedSettings: {
      Password: domainPassword
    }
  }
}

参照サイト:Bicep Playground 0.9.1 (windows.net)

 

・上記Bicepコードでは、Vnetとサブネットは既存リソースを使用していますが、それ以外のリソースは全て新規で作成しています。

・上記Bicepコードでは、変数「dnsLabelPrefix」の最大文字数をあえて”15文字”で制限しています。

 DNS名の各ラベル自体の文字数は、最大63文字まで指定可能となっていますが、

 この変数に格納した値をVM名にも利用しているため、WindowsVMのコンピュータ名の最大文字数”15文字”に合わせて制限しています。

 

 

 

■おわりに

本記事では、Bicepを用いて、ドメインに参加したWindowsVMを作成するためのコード記述方法について記載しました。

Bicepを用いたドメインの参加は、通常のWindowsVM作成のコードに20行程度のコードを追記するだけで簡単に出来るので、

BicepでWindowsVM作成後にGUIでドメイン参加するのであれば、

ドメイン参加もBicepコードで記載した方が簡単かつ早く設定できるのではないかと思います。

また、Bicepコードをデプロイする方法については、下記記事にて記載しています。

Bicepで記述したWindowsVMのデプロイ – Cloud Steady | パーソルプロセス&テクノロジー株式会社

 

いいね (この記事が参考になった人の数:1)
(↑参考になった場合はハートマークを押して評価お願いします)
読み込み中...

注意事項・免責事項

※技術情報につきましては投稿日時点の情報となります。投稿日以降に仕様等が変更されていることがありますのでご了承ください。

※公式な技術情報の紹介の他、当社による検証結果および経験に基づく独自の見解が含まれている場合がございます。

※これらの技術情報によって被ったいかなる損害についても、当社は一切責任を負わないものといたします。十分な確認・検証の上、ご活用お願いたします。

※当サイトはマイクロソフト社によるサポートページではございません。パーソルクロステクノロジー株式会社が運営しているサイトのため、マイクロソフト社によるサポートを希望される方は適切な問い合わせ先にご確認ください。
 【重要】マイクロソフト社のサポートをお求めの方は、問い合わせ窓口をご確認ください