■はじめに
本記事では、Bicepを用いて、ドメインに参加したWindowsVMを作成するためのコード記述方法について記載します。
WindowsVMを作成するためのBicepコードは、Microsoftの公式ドキュメント等でも記載されていますが、
ドメイン参加のBicepコードについては記載がなかったため、ドメインに参加したWindowsVMを作成したい方には需要がある内容になっているのではないかと思います。
また、ARMテンプレートを用いて、ドメインに参加したVMを作成する方法については下記記事にて記載しています。
■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 | パーソルプロセス&テクノロジー株式会社