BicepでAzure VM作ってみた

Azure

今日から始めるIaC第二弾でAzure VMをBicepで作ってみます。

前の記事

全体の流れ

  1. VSCodeでBicepファイルを作成
  2. GitHubで管理
  3. Azure CLIかPowerShellでデプロイ

構成

VMはVNetやらNICなど依存関係があるリソースがあるので、それらも併せてデプロイする必要があります。

一つのBicepファイルに全部書くと後からややこしいので、モジュール呼び出し用のBicepファイル(main.bicep)を作成し、各リソースをモジュールとしてそれぞれ作成していきます。

.
├── main.bicep # メインデプロイファイル (モジュールの連携と実行)
└── modules/
├── vnet.bicep # 仮想ネットワーク (VNet) モジュール
├── nic.bicep # ネットワークインターフェース (NIC) モジュール
└── vm.bicep # 仮想マシン (VM) モジュール (新規)

Bicepファイル

それぞれのBicepファイルを添付します。

一から書けって言われたら無理だけど、Geminiに作らせたやつ見る分にはなんとなくわかりますね。流石KeyValue

main.bicep

// main.bicep

@description('デプロイする場所 (リージョン)')
param location string = resourceGroup().location

// --- 必須パラメータ ---
@description('VM名')
param vmName string
@description('管理者ユーザー名')
param adminUsername string
@description('管理者パスワードまたはSSH公開鍵')
@secure()
param adminPassword string

// --- ネットワーク/VM設定パラメータ ---
@description('仮想ネットワーク名')
param vnetName string = 'vnet-deploy-bicep'
@description('サブネット名')
param subnetName string = 'subnet-deploy-bicep'
@description('NIC名')
param nicName string = 'nic-deploy-bicep'
@description('VMのサイズ (例: Standard_B1s)')
param vmSize string = 'Standard_B1s'


// 1. 仮想ネットワークモジュールのデプロイ
module vnetModule 'modules/vnet.bicep' = {
  name: 'vnet-deployment'
  params: {
    location: location
    vnetName: vnetName
    subnetName: subnetName
  }
}

// 2. ネットワークインターフェースモジュールのデプロイ
module nicModule 'modules/nic.bicep' = {
  name: 'nic-deployment'
  params: {
    location: location
    nicName: nicName
    // VNetモジュールの出力からサブネットIDを取得
    subnetId: vnetModule.outputs.subnetId 
  }
}

// 3. 仮想マシンモジュールのデプロイ
module vmModule 'modules/vm.bicep' = {
  name: 'vm-deployment'
  params: {
    location: location
    vmName: vmName
    adminUsername: adminUsername
    adminPassword: adminPassword
    vmSize: vmSize
    // NICモジュールの出力からNIC IDを取得
    nicId: nicModule.outputs.nicId 
  }
}

// 最終的なVM IDを出力
output virtualMachineId string = vmModule.outputs.vmId
modules/nic.bicep

// modules/nic.bicep (変更なし)

@description('デプロイする場所 (リージョン)')
param location string

@description('NIC名')
param nicName string

@description('サブネットのリソースID')
param subnetId string

@description('プライベートIPアドレスの割り当て方法 (Dynamic or Static)')
param privateIpAllocationMethod string = 'Dynamic'

// ネットワークインターフェースのリソース定義
resource nic 'Microsoft.Network/networkInterfaces@2023-09-01' = {
  name: nicName
  location: location
  properties: {
    ipConfigurations: [
      {
        name: 'ipconfig1'
        properties: {
          privateIPAllocationMethod: privateIpAllocationMethod
          subnet: {
            id: subnetId // VNetのサブネットIDを参照
          }
        }
      }
    ]
  }
}

// NICのリソースIDを外部に出力
output nicId string = nic.id
modules/vnet.bicep

// modules/vnet.bicep (変更なし)

@description('デプロイする場所 (リージョン)')
param location string

@description('仮想ネットワーク名')
param vnetName string

@description('VNetのアドレス空間')
param addressPrefix string = '192.168.150.0/24'

@description('サブネット名')
param subnetName string

@description('サブネットのアドレスプレフィックス')
param subnetPrefix string = '192.168.150.128/25'

// 仮想ネットワークのリソース定義
resource vnet 'Microsoft.Network/virtualNetworks@2023-09-01' = {
  name: vnetName
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [
        addressPrefix
      ]
    }
    subnets: [
      {
        name: subnetName
        properties: {
          addressPrefix: subnetPrefix
        }
      }
    ]
  }
}

// サブネットのリソースIDを外部に出力
output subnetId string = vnet.properties.subnets[0].id
modules/vm.bicep

// modules/vm.bicep

@description('デプロイする場所 (リージョン)')
param location string

@description('VM名')
param vmName string

@description('管理者ユーザー名')
param adminUsername string

@description('管理者パスワードまたはSSH公開鍵')
@secure()
param adminPassword string // Windows/Linuxのパスワード、またはLinuxのSSH公開鍵

@description('VMのサイズ (例: Standard_B1s)')
param vmSize string = 'Standard_B1s'

@description('OSイメージのパブリッシャー')
param imagePublisher string = 'MicrosoftWindowsServer'

@description('OSイメージのオファー')
param imageOffer string = 'WindowsServer'

@description('OSイメージのSKU')
param imageSku string = '2019-Datacenter'

@description('ネットワークインターフェースのリソースID')
param nicId string

// 仮想マシンのリソース定義
resource vm 'Microsoft.Compute/virtualMachines@2023-09-01' = {
  name: vmName
  location: location
  properties: {
    hardwareProfile: {
      vmSize: vmSize
    }
    osProfile: {
      computerName: vmName
      adminUsername: adminUsername
      // Windows VMを想定してadminPasswordを使用
      adminPassword: adminPassword 
    }
    storageProfile: {
      imageReference: {
        publisher: imagePublisher
        offer: imageOffer
        sku: imageSku
        version: 'latest'
      }
      osDisk: {
        createOption: 'FromImage'
        managedDisk: {
          storageAccountType: 'Standard_LRS'
        }
      }
    }
    networkProfile: {
      networkInterfaces: [
        {
          id: nicId // NICモジュールの出力を参照
        }
      ]
    }
  }
}

// VMのリソースIDを外部に出力
output vmId string = vm.id

Gitリポジトリの作成

GitHubでリポジトリを作成します。

寄り道(前のGitリポジトリが残ってた)

VSCodeに前使ってたGitのリポジトリが残ってたので、新しく作ったやつに乗せ換えます。

> git remote -v
> git init
> git remote add origin 新しいリポジトリのURL
> git remote -v

変わりました。

コミットやらプッシュしていきます。このあたりの用語は今度理解します。

>git add .
>git commit -m "vmを作るよ"]
>git push -u origin master

GitHubに上がりました。(デフォルトはmainなんですね。。。masterってブランチ作ってしまいましたが問題ないのでこのままにします。)

デプロイ

PowerShellを立ち上げてAzureにログインします。

> Connect-AzAccount

※コマンドがないとかで失敗する場合はAzコマンドのインストールが必要です。

# Az モジュールをインストール (管理者権限で実行してください) 実行後再起動
> Install-Module -Name Az -Repository PSGallery -Force
> Import-Module Az.Resources
> Import-Module Az.Accounts

※Import-Moduleも失敗するのでGeminiに聞いたら以下のコマンドがいるらしい

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process

認証画面が出るので、デプロイしたいテナントユーザーでログインします。

続いてリソースグループの作成を行います。

New-AzResourceGroup -Name rg-vmdeploy-bicep -Location "Japan East"

最後に作成したリソースグループに対して、main.bicepを使ってリソースをデプロイします。

cdコマンドでmain.bicepがあるフォルダまで移動して

$parameters = @{
    vmName        = 'vm-deploy-bicep'
    adminUsername = 'XXXX'
    adminPassword = 'YYYY'
    location      = 'japaneast'
}

New-AzResourceGroupDeployment -ResourceGroupName rg-vmdeploy-bicep `
    -TemplateFile main.bicep `
    -TemplateParameterObject $parameters

すると、コマンドが実行できないとのことで、調べるとbicep CLIというのをインストールする必要があるみたいです。

> az bicep install
> > $env:Path += ";$HOME\.azure\bin"
> bicep --version
Bicep CLI version 0.38.5 (066c05483e)

上記の感じでインストール出来たら、2個前の$parametersからのコマンドでリソース作成していきます。

少し待つとPowerShellにデプロイ情報が現れ、ポータルでもリソースが作成されていること確認できました。

以上

次の記事

コメント