はじめに
前回、Bicepのサンプルを利用して仮想マシンを構築しました。
-
Bicepのサンプルで仮想マシンを立ててみる - 技術的な何か。
はじめに Azureを構築するためにはPortal以外にも様々な手法があります。Azure PewerShell、Azure CLI、ARMテンプレート、Terraform、Ansibleなどマイクロ
level69.net
サンプルを利用して構築する手順を確認しましたが、テンプレートの中でどのようなことが行われているかを確認していきたいと思います。
テンプレート
@description('The name of you Virtual Machine.')
param vmName string = 'simpleLinuxVM'
@description('Username for the Virtual Machine.')
param adminUsername string
@description('Type of authentication to use on the Virtual Machine. SSH key is recommended.')
@allowed([
'sshPublicKey'
'password'
])
param authenticationType string = 'password'
@description('SSH Key or password for the Virtual Machine. SSH key is recommended.')
@secure()
param adminPasswordOrKey string
@description('Unique DNS Name for the Public IP used to access the Virtual Machine.')
param dnsLabelPrefix string = toLower('simplelinuxvm-${uniqueString(resourceGroup().id)}')
@description('The Ubuntu version for the VM. This will pick a fully patched image of this given Ubuntu version.')
@allowed([
'12.04.5-LTS'
'14.04.5-LTS'
'16.04.0-LTS'
'18.04-LTS'
])
param ubuntuOSVersion string = '18.04-LTS'
@description('Location for all resources.')
param location string = resourceGroup().location
@description('The size of the VM')
param vmSize string = 'Standard_B2s'
@description('Name of the VNET')
param virtualNetworkName string = 'vNet'
@description('Name of the subnet in the virtual network')
param subnetName string = 'Subnet'
@description('Name of the Network Security Group')
param networkSecurityGroupName string = 'SecGroupNet'
var publicIPAddressName = '${vmName}PublicIP'
var networkInterfaceName = '${vmName}NetInt'
var osDiskType = 'Standard_LRS'
var subnetAddressPrefix = '10.1.0.0/24'
var addressPrefix = '10.1.0.0/16'
var linuxConfiguration = {
disablePasswordAuthentication: true
ssh: {
publicKeys: [
{
path: '/home/${adminUsername}/.ssh/authorized_keys'
keyData: adminPasswordOrKey
}
]
}
}
resource nic 'Microsoft.Network/networkInterfaces@2020-06-01' = {
name: networkInterfaceName
location: location
properties: {
ipConfigurations: [
{
name: 'ipconfig1'
properties: {
subnet: {
id: subnet.id
}
privateIPAllocationMethod: 'Dynamic'
publicIPAddress: {
id: publicIP.id
}
}
}
]
networkSecurityGroup: {
id: nsg.id
}
}
}
resource nsg 'Microsoft.Network/networkSecurityGroups@2020-06-01' = {
name: networkSecurityGroupName
location: location
properties: {
securityRules: [
{
name: 'SSH'
properties: {
priority: 1000
protocol: 'Tcp'
access: 'Allow'
direction: 'Inbound'
sourceAddressPrefix: '*'
sourcePortRange: '*'
destinationAddressPrefix: '*'
destinationPortRange: '22'
}
}
]
}
}
resource vnet 'Microsoft.Network/virtualNetworks@2020-06-01' = {
name: virtualNetworkName
location: location
properties: {
addressSpace: {
addressPrefixes: [
addressPrefix
]
}
}
}
resource subnet 'Microsoft.Network/virtualNetworks/subnets@2020-06-01' = {
parent: vnet
name: subnetName
properties: {
addressPrefix: subnetAddressPrefix
privateEndpointNetworkPolicies: 'Enabled'
privateLinkServiceNetworkPolicies: 'Enabled'
}
}
resource publicIP 'Microsoft.Network/publicIPAddresses@2020-06-01' = {
name: publicIPAddressName
location: location
sku: {
name: 'Basic'
}
properties: {
publicIPAllocationMethod: 'Dynamic'
publicIPAddressVersion: 'IPv4'
dnsSettings: {
domainNameLabel: dnsLabelPrefix
}
idleTimeoutInMinutes: 4
}
}
resource vm 'Microsoft.Compute/virtualMachines@2020-06-01' = {
name: vmName
location: location
properties: {
hardwareProfile: {
vmSize: vmSize
}
storageProfile: {
osDisk: {
createOption: 'FromImage'
managedDisk: {
storageAccountType: osDiskType
}
}
imageReference: {
publisher: 'Canonical'
offer: 'UbuntuServer'
sku: ubuntuOSVersion
version: 'latest'
}
}
networkProfile: {
networkInterfaces: [
{
id: nic.id
}
]
}
osProfile: {
computerName: vmName
adminUsername: adminUsername
adminPassword: adminPasswordOrKey
linuxConfiguration: ((authenticationType == 'password') ? null : linuxConfiguration)
}
}
}
output adminUsername string = adminUsername
output hostname string = publicIP.properties.dnsSettings.fqdn
output sshCommand string = 'ssh ${adminUsername}@${publicIP.properties.dnsSettings.fqdn}'
定義
@description('The name of you Virtual Machine.')
param vmName string = 'simpleLinuxVM'
仮想マシンの名前を定義しています
@description('Username for the Virtual Machine.')
param adminUsername string
変数adminUsername への入力を求めます
@description('Type of authentication to use on the Virtual Machine. SSH key is recommended.')
@allowed([
'sshPublicKey'
'password'
])
param authenticationType string = 'password'
仮想マシンがLinuxの場合はssh keyかパスワードを選択しますが、ここではパスワードを選択しています。
@description('SSH Key or password for the Virtual Machine. SSH key is recommended.')
@secure()
param adminPasswordOrKey string
パスワードの入力、もしくはSSH Keyを入力します。
@description('Unique DNS Name for the Public IP used to access the Virtual Machine.')
param dnsLabelPrefix string = toLower('simplelinuxvm-${uniqueString(resourceGroup().id)}')
DNSラベルを自動生成します。
simplelinuxvm-{ランダムな文字列}で生成されます。
@description('The Ubuntu version for the VM. This will pick a fully patched image of this given Ubuntu version.')
@allowed([
'12.04.5-LTS'
'14.04.5-LTS'
'16.04.0-LTS'
'18.04-LTS'
])
param ubuntuOSVersion string = '18.04-LTS'
ubuntuの選択できるバージョンを定義しています。
@description('Location for all resources.')
param location string = resourceGroup().location
仮想マシンを構築するリージョンをリソースグループに設定されているロケーションを読み取っています。
@description('The size of the VM')
param vmSize string = 'Standard_B2s'
仮想マシンのサイズを定義しています。
@description('Name of the VNET')
param virtualNetworkName string = 'vNet'
仮想ネットワークの名前を定義しています。
@description('Name of the subnet in the virtual network')
param subnetName string = 'Subnet'
サブネットの名前を定義しています。
@description('Name of the Network Security Group')
param networkSecurityGroupName string = 'SecGroupNet'
ネットワークセキュリティグループの名前を定義しています。
var publicIPAddressName = '${vmName}PublicIP'
var networkInterfaceName = '${vmName}NetInt'
var osDiskType = 'Standard_LRS'
var subnetAddressPrefix = '10.1.0.0/24'
var addressPrefix = '10.1.0.0/16'
var linuxConfiguration = {
disablePasswordAuthentication: true
ssh: {
publicKeys: [
{
path: '/home/${adminUsername}/.ssh/authorized_keys'
keyData: adminPasswordOrKey
}
]
}
}
仮想マシン作成に必要なパラメーターを定義しています。
SSH Keyも作成しています。
作成
resource nic 'Microsoft.Network/networkInterfaces@2020-06-01' = {
name: networkInterfaceName
location: location
properties: {
ipConfigurations: [
{
name: 'ipconfig1'
properties: {
subnet: {
id: subnet.id
}
privateIPAllocationMethod: 'Dynamic'
publicIPAddress: {
id: publicIP.id
}
}
}
]
networkSecurityGroup: {
id: nsg.id
}
}
}
最初にネットワークインターフェースを作成しています。
resource nsg 'Microsoft.Network/networkSecurityGroups@2020-06-01' = {
name: networkSecurityGroupName
location: location
properties: {
securityRules: [
{
name: 'SSH'
properties: {
priority: 1000
protocol: 'Tcp'
access: 'Allow'
direction: 'Inbound'
sourceAddressPrefix: '*'
sourcePortRange: '*'
destinationAddressPrefix: '*'
destinationPortRange: '22'
}
}
]
}
}
ネットワークセキュリティグループを作成しています。
SSH用にポートを開けています。
resource vnet 'Microsoft.Network/virtualNetworks@2020-06-01' = {
name: virtualNetworkName
location: location
properties: {
addressSpace: {
addressPrefixes: [
addressPrefix
]
}
}
}
仮想ネットワークを作成しています
resource subnet 'Microsoft.Network/virtualNetworks/subnets@2020-06-01' = {
parent: vnet
name: subnetName
properties: {
addressPrefix: subnetAddressPrefix
privateEndpointNetworkPolicies: 'Enabled'
privateLinkServiceNetworkPolicies: 'Enabled'
}
}
サブネットを作成しています。
resource publicIP 'Microsoft.Network/publicIPAddresses@2020-06-01' = {
name: publicIPAddressName
location: location
sku: {
name: 'Basic'
}
properties: {
publicIPAllocationMethod: 'Dynamic'
publicIPAddressVersion: 'IPv4'
dnsSettings: {
domainNameLabel: dnsLabelPrefix
}
idleTimeoutInMinutes: 4
}
}
パブリックIPアドレスを作成しています。
上記で定義したDNSラベルを付けています。
resource vm 'Microsoft.Compute/virtualMachines@2020-06-01' = {
name: vmName
location: location
properties: {
hardwareProfile: {
vmSize: vmSize
}
storageProfile: {
osDisk: {
createOption: 'FromImage'
managedDisk: {
storageAccountType: osDiskType
}
}
imageReference: {
publisher: 'Canonical'
offer: 'UbuntuServer'
sku: ubuntuOSVersion
version: 'latest'
}
}
networkProfile: {
networkInterfaces: [
{
id: nic.id
}
]
}
osProfile: {
computerName: vmName
adminUsername: adminUsername
adminPassword: adminPasswordOrKey
linuxConfiguration: ((authenticationType == 'password') ? null : linuxConfiguration)
}
}
}
最後に仮想マシンを構築しています。
以下は接続情報を出力しています。
output adminUsername string = adminUsername
output hostname string = publicIP.properties.dnsSettings.fqdn
output sshCommand string = 'ssh ${adminUsername}@${publicIP.properties.dnsSettings.fqdn}'
出力結果
"outputs": {
"adminUsername": {
"type": "String",
"value": "azureuser"
},
"hostname": {
"type": "String",
"value": "simplelinuxvm-jse37geyedaxg.westus2.cloudapp.azure.com"
},
"sshCommand": {
"type": "String",
"value": "ssh azureuser@simplelinuxvm-jse37geyedaxg.westus2.cloudapp.azure.com"
}
},
まとめ
Bicepテンプレートの中を確認してみました。一見簡単そうに見えていますが、仮想マシン用のテンプレートを書くだけでも仮想マシンの構成サービスを理解して書く必要があります。ここら辺はTerraformなどとは違い自分で解決する必要があります。Azureを触って間もない人には難しいかもしれません。きちんとポータルからいちから作れる人向けだと思います。ARMテンプレートを書くよりは簡単なので、再利用可能なものとしての有効性はあると思いました。