今日から始めるIaC第二弾でAzure VMをBicepで作ってみます。
前の記事
全体の流れ
- VSCodeでBicepファイルを作成
- GitHubで管理
- 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にデプロイ情報が現れ、ポータルでもリソースが作成されていること確認できました。

以上



コメント