Bicep を使用して Linux 仮想マシンをプロビジョニングする

完了

Bicep テンプレートの中核的な要素は resource であり、Azure リソースを指定します。 各 resource には、汎用およびリソース固有のプロパティのセットが含まれています。 たとえば、次の例で使用しているテンプレートは、Azure 仮想ネットワークについて記述したものです。 name と location プロパティは汎用ですが、addressPrefix はリソース固有です。 リソースの横にある Microsoft.Network/virtualNetworks@2021-05-01 という文字列は、その API バージョンを示しており、virtualNetwork エントリはリソースのシンボリック名を表し、テンプレート内でリソースを参照する方法を提供します。

以下のサンプル テンプレートには、resource 要素に加えて、デプロイ中に仮想ネットワークに名前を割り当てるために使用できるパラメーター要素も含まれています。 その時点で名前を割り当てない場合は、lnx-bcp-vnet の既定値が代わりに適用されます。 description 要素は、先頭の @ の文字で示されるように、デコレーターの例です。 その目的は、パラメーターの役割を記述することです。Azure portal を使用して対応する Azure Resource Manager テンプレートを確認またはデプロイすると、その出力がパラメーターのテキスト ボックスの横に表示されます。 Bicep を使用して Linux VM をプロビジョニングするには、次のコード例を使用します。

@description('Name of the virtual network')
param virtualNetworkName string = 'lnx-bcp-vnet'

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2021-05-01' = {
  name: virtualNetworkName
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [
        addressPrefix
      ]
    }
  }
}

Bicep テンプレートを使用して Linux VM をデプロイする

Bicep での作業には、テンプレートを作成してデプロイすることが含まれます。 作成エクスペリエンスを簡素化および強化するには、Visual Studio Code と Bicep 拡張機能を使用します。 同じ拡張機能で Bicep ベースのデプロイもサポートされます。 コマンド ラインから、またはスクリプト化されたタスクの一部としてデプロイをトリガーする場合は、Bicep CLI をインストールし、スタンドアロン ユーティリティとして使用するか、Azure CLI セッション内から直接使用できます。 Azure CLI は、任意の az bicep コマンドの最初の呼び出し時に Bicep CLI を自動的にインストールします。 ただし、Bicep の手動インストールを実行するには、az bicep install を実行します。

実際には、Linux を実行する Azure VM を、Bicep を使用してプロビジョニングするプロセスには、通常、次に大まかに示す一連の手順が含まれます。

  • 適切な VM イメージを特定する。
  • 適切な VM サイズを特定する。
  • Bicep テンプレートを作成する。
  • Bicep テンプレートのデプロイを開始する。

Bicep テンプレートをデプロイすると、トランスパイルと呼ばれるタスクによって、自動的に同等の Azure Resource Manager テンプレートに変換されます。 Bicep と Azure Resource Manager の間で形式変換を実行するには、それぞれ bicep buildbicep decompile のコマンドを実行します。

適切な VM イメージとサイズを特定するには、このモジュールの前のユニットで説明した手順に従います。 このユニットでは、Bicep 固有のタスクに焦点を当てます。

Bicep テンプレートを作成する

Bicep テンプレートを作成するには、まず、Bicep 拡張機能がインストールされた Visual Studio Code セッションを起動します。 次に、main.bicep という名前のファイルを作成します。 ファイルに次の内容を追加し、変更を保存します。

注意

Bicep ファイル用に選択するファイル名は任意ですが、ファイルの内容または目的を反映した名前を選ぶことをお勧めします。ファイル拡張子には ".bicep" を使用する必要があります。

@description('The name of your virtual machine')
param vmName string = 'lnx-bcp-vm'

@description('Username for the virtual machine')
param adminUsername string

@description('Type of authentication to use on the virtual machine')
@allowed([
  'sshPublicKey'
  'password'
])
param authenticationType string = 'password'

@description('SSH Key or password for the virtual machine')
@secure()
param adminPasswordOrKey string

@description('Unique DNS Name for the Public IP used to access the virtual machine')
param dnsLabelPrefix string = toLower('${vmName}-${uniqueString(resourceGroup().id)}')

@description('The allowed Linux distribution and version for the VM')
@allowed([
  'Ubuntu-2204'
])
param ubuntuOSVersion string = 'Ubuntu-2204'

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

@description('The size of the VM')
param vmSize string = 'Standard_F4s'

@description('Name of the virtual network')
param virtualNetworkName string = 'lnx-bcp-vnet'

@description('Name of the subnet in the virtual network')
param subnetName string = 'subnet0'

@description('Name of the network security group')
param networkSecurityGroupName string = 'lnx-bcp-nsg'

var imageReference = {
  'Ubuntu-2204': {
    publisher: 'Canonical'
    offer: '0001-com-ubuntu-server-jammy'
    sku: '22_04-lts-gen2'
    version: 'latest'
  }
}
var publicIPAddressName = '${vmName}-pip'
var networkInterfaceName = '${vmName}-nic'
var osDiskType = 'Standard_LRS'
var subnetAddressPrefix = '10.3.0.0/24'
var addressPrefix = '10.3.0.0/16'
var linuxConfiguration = {
  disablePasswordAuthentication: true
  ssh: {
    publicKeys: [
      {
        path: '/home/${adminUsername}/.ssh/authorized_keys'
        keyData: adminPasswordOrKey
      }
    ]
  }
}

resource networkInterface 'Microsoft.Network/networkInterfaces@2021-05-01' = {
  name: networkInterfaceName
  location: location
  properties: {
    ipConfigurations: [
      {
        name: 'ipconfig1'
        properties: {
          subnet: {
            id: subnet.id
          }
          privateIPAllocationMethod: 'Dynamic'
          publicIPAddress: {
            id: publicIPAddress.id
          }
        }
      }
    ]
    networkSecurityGroup: {
      id: networkSecurityGroup.id
    }
  }
}

resource networkSecurityGroup 'Microsoft.Network/networkSecurityGroups@2021-05-01' = {
  name: networkSecurityGroupName
  location: location
  properties: {
    securityRules: [
      {
        name: 'ssh'
        properties: {
          priority: 1000
          protocol: 'Tcp'
          access: 'Allow'
          direction: 'Inbound'
          sourceAddressPrefix: '*'
          sourcePortRange: '*'
          destinationAddressPrefix: '*'
          destinationPortRange: '22'
        }
      }
    ]
  }
}

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2021-05-01' = {
  name: virtualNetworkName
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [
        addressPrefix
      ]
    }
  }
}

resource subnet 'Microsoft.Network/virtualNetworks/subnets@2021-05-01' = {
  parent: virtualNetwork
  name: subnetName
  properties: {
    addressPrefix: subnetAddressPrefix
    privateEndpointNetworkPolicies: 'Enabled'
    privateLinkServiceNetworkPolicies: 'Enabled'
  }
}

resource publicIPAddress 'Microsoft.Network/publicIPAddresses@2021-05-01' = {
  name: publicIPAddressName
  location: location
  sku: {
    name: 'Basic'
  }
  properties: {
    publicIPAllocationMethod: 'Dynamic'
    publicIPAddressVersion: 'IPv4'
    dnsSettings: {
      domainNameLabel: dnsLabelPrefix
    }
    idleTimeoutInMinutes: 4
  }
}

resource vm 'Microsoft.Compute/virtualMachines@2021-11-01' = {
  name: vmName
  location: location
  properties: {
    hardwareProfile: {
      vmSize: vmSize
    }
    storageProfile: {
      osDisk: {
        createOption: 'FromImage'
        managedDisk: {
          storageAccountType: osDiskType
        }
      }
      imageReference: imageReference[ubuntuOSVersion]
    }
    networkProfile: {
      networkInterfaces: [
        {
          id: networkInterface.id
        }
      ]
    }
    osProfile: {
      computerName: vmName
      adminUsername: adminUsername
      adminPassword: adminPasswordOrKey
      linuxConfiguration: ((authenticationType == 'password') ? null : linuxConfiguration)
    }
    securityProfile: json('null')
  }
}

output adminUsername string = adminUsername
output fqdn string = publicIPAddress.properties.dnsSettings.fqdn
output sshCommand string = 'ssh ${adminUsername}@${publicIPAddress.properties.dnsSettings.fqdn}'

注意

このテンプレートは、GitHub リポジトリの Azure クイックスタート テンプレートの内容に基づいています。

Bicep テンプレートのデプロイを開始する

main.bicep ファイルを保存したら、テンプレート ベースのデプロイを進めることができます。 まず、ローカル コンピューターで Azure CLI セッションを起動し、az login を実行して認証を行います。 Azure サブスクリプションのリソースをプロビジョニングするための十分な権限があるユーザーの資格情報を指定する必要があります。 次に、現在のディレクトリを、main.bicep ファイルが存在するディレクトリに変更します。 または、Azure Cloud Shell Bash セッションを開始し、そのファイルを Azure Cloud Shell 環境内のホーム ディレクトリにアップロードすることもできます。

次に、認証された Azure CLI セッションから、次のコマンドを実行してリソース グループを作成します。これには、以降のデプロイの一部であるすべてのリソースが含まれます。

az group create --name rg-lnx-bcp --location eastus

先に進む前に、次のコマンドを実行して、最新バージョンの Bicep CLI を使用していることを確認します。

az bicep upgrade

最後に、次のコマンドを実行してデプロイを開始します。

az deployment group create --resource-group rg-lnx-bcp --template-file main.bicep --parameters adminUsername=azureuser

注意

このコマンドには --parameters スイッチが含まれています。ここでは、デプロイする Azure VM のローカル管理者の名前を設定します。 adminPasswordOrKey パラメーターの既定値が設定されていないため、Azure CLI は、対応するパスワードを入力するよう利用者に求めます。

すぐに (通常は数分以内に) Azure VM の実行が開始されます。 これに接続するには、デプロイによって生成された出力を確認して、そのネットワーク インターフェイスに関連付けられている完全修飾ドメイン名 (FQDN) を特定します。 別の方法として、shCommand の値を使用することもできます。 プロンプトが表示されたら、SSH 接続を確立するときに認証を行うために新しく設定したパスワードを指定します。

Bicep デプロイの出力値を記録しなかった場合は、次のコマンドを実行して再度表示できます。

az deployment group show \
  --resource-group rg-lnx-bcp \
  --name main \
  --query properties.outputs

JSON 形式の出力は次のような内容になります。

{
  "adminUsername": {
    "type": "String",
    "value": "azureuser"
  },
  "fqdn": {
    "type": "String",
    "value": "lnx-bcp-vm-example.eastus.cloudapp.azure.com"
  },
  "sshCommand": {
    "type": "String",
    "value": "ssh azureuser@lnx-bcp-vm-example.eastus.cloudapp.azure.com"
  }
}