azure-vms について
azure-vms は Azure Virtual Machines のデプロイと運用を支援するスキルです。クラウドやインフラ担当者向けに、サイズ選定、ディスク、スケーリング、高可用性、Terraform による構成を扱います。
主な機能
- 01Linux・Windows VM の作成
- 02VM サイズと機能の選定
- 03マネージドディスクの操作
- 04カスタムイメージの作成
- 05可用性セットとゾーンの構成
- 06スケールセットと Terraform の設定
活用シーン
- 01コンテナ化できないレガシーアプリの実行
- 02ML やレンダリング向け GPU 計算環境の用意
- 03高可用性 VM 環境の構築
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ bagelhole/ devops-security-agent-skills --skill azure-vmsインストール後、Claude Code で/azure-vmsを入力して読み込まれたか確認します。
同梱ファイルreferences/vm-operations.md
詳細
Azure Virtual Machines
Azure VM、可用性セット、スケールセット、カスタムイメージ、マネージドディスクをデプロイおよび管理します。本番環境向けの VM 作成、サイズ選択、ディスク管理、自動スケーリング、Terraform 構成を扱います。
使用する場面
- オペレーティングシステムとランタイム環境を完全に制御する必要がある場合。
- アプリケーションで特定の OS 構成やカーネルモジュールが必要な場合。
- コンテナー化できないレガシーアプリケーションを実行している場合。
- ML トレーニングやレンダリングに GPU アクセラレーション対応のコンピューティングが必要な場合。
- 可用性ゾーンやスケールセットによる高可用性のコンピューティングが必要な場合。
前提条件
# Install Azure CLI
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
# Login and set subscription
az login
az account set --subscription "my-subscription-id"
# Create resource group
az group create --name compute-rg --location eastus
# List available VM sizes in a region
az vm list-sizes --location eastus --output table
# List available VM images
az vm image list --output table
az vm image list --publisher Canonical --offer 0001-com-ubuntu-server-jammy --all --output table
VM の作成
SSH キーを使用した Linux VM
az vm create \
--resource-group compute-rg \
--name myapp-vm \
--image Ubuntu2204 \
--size Standard_D4s_v5 \
--admin-username azureuser \
--generate-ssh-keys \
--vnet-name myapp-vnet \
--subnet app-subnet \
--nsg "" \
--public-ip-address "" \
--os-disk-size-gb 64 \
--os-disk-caching ReadWrite \
--storage-sku Premium_LRS \
--zone 1 \
--assign-identity \
--tags environment=prod team=platform app=myapp
# SSH into the VM (if public IP assigned)
ssh azureuser@$(az vm show -g compute-rg -n myapp-vm -d --query publicIps -o tsv)
Windows VM
az vm create \
--resource-group compute-rg \
--name myapp-win-vm \
--image Win2022Datacenter \
--size Standard_D4s_v5 \
--admin-username azureadmin \
--admin-password 'S3cur3P@ssw0rd!' \
--vnet-name myapp-vnet \
--subnet app-subnet \
--public-ip-address "" \
--os-disk-size-gb 128 \
--storage-sku Premium_LRS \
--zone 1
Cloud-Init を使用した VM
# cloud-init.yaml
# #cloud-config
# package_update: true
# packages:
# - nginx
# - docker.io
# runcmd:
# - systemctl enable nginx
# - systemctl start nginx
# - usermod -aG docker azureuser
az vm create \
--resource-group compute-rg \
--name web-vm \
--image Ubuntu2204 \
--size Standard_B2s \
--admin-username azureuser \
--generate-ssh-keys \
--custom-data cloud-init.yaml \
--tags role=web
VM サイズガイド
| ファミリー | サイズの例 | 用途 |
|---|---|---|
| B シリーズ | Standard_B1s, Standard_B2s | 開発/テスト、トラフィックの少ない Web サーバー |
| D シリーズ | Standard_D4s_v5, Standard_D8s_v5 | 汎用、ほとんどの本番ワークロード |
| E シリーズ | Standard_E4s_v5, Standard_E16s_v5 | メモリ負荷の高い処理(データベース、キャッシュ) |
| F シリーズ | Standard_F4s_v2, Standard_F16s_v2 | CPU 負荷の高い処理(バッチ処理、分析) |
| L シリーズ | Standard_L8s_v3, Standard_L32s_v3 | ストレージ最適化(ビッグデータ、SQL) |
| N シリーズ | Standard_NC6s_v3, Standard_NC24ads_A100_v4 | GPU ワークロード(ML トレーニング、レンダリング) |
| M シリーズ | Standard_M128s | SAP HANA、大規模なインメモリワークロード |
# Find VM sizes with specific capabilities
az vm list-sizes --location eastus \
--query "[?numberOfCores >= \`4\` && memoryInMb >= \`16000\`]" \
--output table
# Check VM size availability in a zone
az vm list-skus --location eastus \
--size Standard_D4s_v5 \
--output table
マネージドディスク
# Add a data disk to existing VM
az vm disk attach \
--resource-group compute-rg \
--vm-name myapp-vm \
--name myapp-data-disk \
--size-gb 256 \
--sku Premium_LRS \
--new \
--lun 0
# Create a standalone managed disk
az disk create \
--resource-group compute-rg \
--name shared-data-disk \
--size-gb 512 \
--sku Premium_LRS \
--zone 1
# Resize a disk (VM must be deallocated)
az vm deallocate --resource-group compute-rg --name myapp-vm
az disk update \
--resource-group compute-rg \
--name myapp-data-disk \
--size-gb 512
az vm start --resource-group compute-rg --name myapp-vm
# Snapshot a disk for backup
az snapshot create \
--resource-group compute-rg \
--name myapp-disk-snapshot \
--source myapp-data-disk
# Create disk from snapshot
az disk create \
--resource-group compute-rg \
--name myapp-disk-from-snap \
--source myapp-disk-snapshot \
--sku Premium_LRS
# List disks attached to a VM
az vm show \
--resource-group compute-rg \
--name myapp-vm \
--query "storageProfile.dataDisks" \
--output table
カスタムイメージ
# Generalize the VM (run inside the VM first)
# sudo waagent -deprovision+user -force
# Deallocate and generalize
az vm deallocate --resource-group compute-rg --name myapp-vm
az vm generalize --resource-group compute-rg --name myapp-vm
# Create image from VM
az image create \
--resource-group compute-rg \
--name myapp-golden-image \
--source myapp-vm \
--os-type Linux
# Create VM from custom image
az vm create \
--resource-group compute-rg \
--name myapp-from-image \
--image myapp-golden-image \
--size Standard_D4s_v5 \
--admin-username azureuser \
--generate-ssh-keys
# Use Azure Compute Gallery for shared images
az sig create \
--resource-group compute-rg \
--gallery-name myAppGallery
az sig image-definition create \
--resource-group compute-rg \
--gallery-name myAppGallery \
--gallery-image-definition myapp-image \
--publisher myorg \
--offer myapp \
--sku 1.0 \
--os-type Linux \
--os-state Generalized
az sig image-version create \
--resource-group compute-rg \
--gallery-name myAppGallery \
--gallery-image-definition myapp-image \
--gallery-image-version 1.0.0 \
--managed-image myapp-golden-image \
--target-regions eastus westus \
--replica-count 2
可用性セットとゾーン
# Create availability set
az vm availability-set create \
--resource-group compute-rg \
--name myapp-avset \
--platform-fault-domain-count 3 \
--platform-update-domain-count 5
# Create VM in availability set
az vm create \
--resource-group compute-rg \
--name myapp-vm-1 \
--image Ubuntu2204 \
--size Standard_D4s_v5 \
--availability-set myapp-avset \
--admin-username azureuser \
--generate-ssh-keys
# Create VMs across availability zones
for zone in 1 2 3; do
az vm create \
--resource-group compute-rg \
--name "myapp-vm-zone${zone}" \
--image Ubuntu2204 \
--size Standard_D4s_v5 \
--zone "$zone" \
--admin-username azureuser \
--generate-ssh-keys \
--no-wait
done
Virtual Machine Scale Sets
# Create VMSS with autoscaling
az vmss create \
--resource-group compute-rg \
--name myapp-vmss \
--image Ubuntu2204 \
--vm-sku Standard_D4s_v5 \
--instance-count 2 \
--admin-username azureuser \
--generate-ssh-keys \
--vnet-name myapp-vnet \
--subnet app-subnet \
--upgrade-policy-mode Rolling \
--health-probe "/" \
--load-balancer myapp-lb \
--zones 1 2 3 \
--custom-data cloud-init.yaml \
--tags environment=prod
# Configure autoscale rules
az monitor autoscale create \
--resource-group compute-rg \
--resource myapp-vmss \
--resource-type Microsoft.Compute/virtualMachineScaleSets \
--name myapp-autoscale \
--min-count 2 \
--max-count 20 \
--count 3
# Scale out when CPU > 70%
az monitor autoscale rule create \
--resource-group compute-rg \
--autoscale-name myapp-autoscale \
--condition "Percentage CPU > 70 avg 5m" \
--scale out 2
# Scale in when CPU < 30%
az monitor autoscale rule create \
--resource-group compute-rg \
--autoscale-name myapp-autoscale \
--condition "Percentage CPU < 30 avg 10m" \
--scale in 1
# Manual scale
az vmss scale \
--resource-group compute-rg \
--name myapp-vmss \
--new-capacity 5
# Update VMSS image
az vmss update \
--resource-group compute-rg \
--name myapp-vmss \
--set virtualMachineProfile.storageProfile.imageReference.version=latest
# Rolling upgrade of instances
az vmss rolling-upgrade start \
--resource-group compute-rg \
--name myapp-vmss
# List VMSS instances
az vmss list-instances \
--resource-group compute-rg \
--name myapp-vmss \
--output table
VM の管理操作
# Start / Stop / Restart / Deallocate
az vm start --resource-group compute-rg --name myapp-vm
az vm stop --resource-group compute-rg --name myapp-vm
az vm restart --resource-group compute-rg --name myapp-vm
az vm deallocate --resource-group compute-rg --name myapp-vm
# Run command on a VM
az vm run-command invoke \
--resource-group compute-rg \
--name myapp-vm \
--command-id RunShellScript \
--scripts "df -h && free -m && uptime"
# Enable boot diagnostics
az vm boot-diagnostics enable \
--resource-group compute-rg \
--name myapp-vm
# Get boot diagnostics log
az vm boot-diagnostics get-boot-log \
--resource-group compute-rg \
--name myapp-vm
# Enable Azure Backup
az backup protection enable-for-vm \
--resource-group compute-rg \
--vault-name myapp-vault \
--vm myapp-vm \
--policy-name DefaultPolicy
# Resize a VM
az vm resize \
--resource-group compute-rg \
--name myapp-vm \
--size Standard_D8s_v5
Terraform の構成
resource "azurerm_linux_virtual_machine" "main" {
name = "myapp-vm"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
size = "Standard_D4s_v5"
admin_username = "azureuser"
zone = "1"
network_interface_ids = [azurerm_network_interface.main.id]
admin_ssh_key {
username = "azureuser"
public_key = file("~/.ssh/id_rsa.pub")
}
os_disk {
caching = "ReadWrite"
storage_account_type = "Premium_LRS"
disk_size_gb = 64
}
source_image_reference {
publisher = "Canonical"
offer = "0001-com-ubuntu-server-jammy"
sku = "22_04-lts-gen2"
version = "latest"
}
identity {
type = "SystemAssigned"
}
tags = var.tags
}
resource "azurerm_managed_disk" "data" {
name = "myapp-data-disk"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
storage_account_type = "Premium_LRS"
create_option = "Empty"
disk_size_gb = 256
zone = "1"
tags = var.tags
}
resource "azurerm_virtual_machine_data_disk_attachment" "data" {
managed_disk_id = azurerm_managed_disk.data.id
virtual_machine_id = azurerm_linux_virtual_machine.main.id
lun = 0
caching = "ReadOnly"
}
resource "azurerm_linux_virtual_machine_scale_set" "main" {
name = "myapp-vmss"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
sku = "Standard_D4s_v5"
instances = 3
admin_username = "azureuser"
zones = [1, 2, 3]
admin_ssh_key {
username = "azureuser"
public_key = file("~/.ssh/id_rsa.pub")
}
source_image_reference {
publisher = "Canonical"
offer = "0001-com-ubuntu-server-jammy"
sku = "22_04-lts-gen2"
version = "latest"
}
os_disk {
caching = "ReadWrite"
storage_account_type = "Premium_LRS"
}
network_interface {
name = "vmss-nic"
primary = true
ip_configuration {
name = "internal"
primary = true
subnet_id = azurerm_subnet.app.id
}
}
automatic_os_upgrade_policy {
disable_automatic_rollback = false
enable_automatic_os_upgrade = true
}
rolling_upgrade_policy {
max_batch_instance_percent = 20
max_unhealthy_instance_percent = 20
max_unhealthy_upgraded_instance_percent = 5
pause_time_between_batches = "PT0S"
}
tags = var.tags
}
トラブルシューティング
| 症状 | 原因 | 対処方法 |
|---|---|---|
| VM が起動しない | リージョンのクォータ超過 | az vm list-usage --location eastus でクォータを確認し、上限引き上げを申請します |
| SSH 接続が拒否される | NSG がポート 22 をブロックしている、または VM が稼働していない | NSG ルールと VM の電源状態を確認します。プライベート VM には Azure Bastion を使用します |
| VM ディスクの空き容量がない | OS ディスクが小さすぎる、またはログがローテーションされていない | 割り当てを解除してからディスクをサイズ変更します。ログローテーションを構成します |
| VM のパフォーマンスが低い | VM サイズが適切でない、またはディスクがスロットリングされている | az monitor metrics list でメトリックを確認し、サイズまたはディスク階層をアップグレードします |
| スケールセットがスケールアウトしない | 自動スケーリングのルールしきい値に達していない | 自動スケーリング設定を確認し、メトリックのしきい値がワークロードに合っていることを確認します |
| カスタムイメージの VM が起動しない | イメージが正しく一般化されていない | キャプチャ前に waagent -deprovision を再実行し、ブート診断を確認します |
| VMSS のローリングアップグレードが停止する | 新しいインスタンスでヘルスプローブが失敗している | アプリケーションのヘルスエンドポイントを修正し、az vmss rolling-upgrade get-latest を確認します |
| Spot VM が予期せず退避される | Azure が容量を回収した | 退避ポリシー Deallocate を使用し、退避通知を設定します |
関連スキル
azure-networking-- VM 接続用の VNet および NSG 構成。azure-aks-- VM が不要な場合のコンテナーによる代替手段。arm-templates-- Bicep ベースの VM デプロイテンプレート。terraform-azure-- Terraform ベースの VM および VMSS のプロビジョニング。
コメント
Markdown 対応