Azure Basic SKUロードバランサーは2025年9月30日に廃止されましたが、移行作業の前提知識として、あるいは既存コードの読み解きとして、Basic SKUのTerraform構成を正確に把握しておく必要がある場面は今も多くあります。Standard SKUとの差分を理解しないまま移行すると、アウトバウンド通信の遮断や可用性設計のやり直しという落とし穴にはまることになります。
この記事では、Azure Basic SKUロードバランサーをTerraformで構築する手順を解説し、Standard SKUへの移行で変更が必要なコード差分をあわせて比較します。AzureおよびTerraformの基本操作ができることを前提に、RHEL 9系/Rocky Linux 9系のバックエンドVMを想定環境として説明します。
この記事のポイント
・Basic SKU LBはTerraformで sku = "Basic" を指定するだけで定義できる
・Basic SKUはAvailability Setが必須、Standard SKUはVNet内の任意VMに対応
・Standard移行時はPublic IPのSKUとallocation_methodも同時に変更が必要
・Standard SKUへの移行後はアウトバウンドルールの追加が必要になる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
Azure Basic SKUロードバランサーとStandard SKUの違い
Azure Load BalancerにはBasicとStandardの2つのSKUがあります。2025年9月30日のBasic SKU廃止以降、新規作成はStandard SKUのみとなりましたが、移行作業や既存Terraformコードの保守のためにBasic SKUの仕様を正確に把握しておくことは引き続き重要です。| 比較項目 | Basic SKU | Standard SKU |
|---|---|---|
| バックエンドプール | 同一Availability Set内のVMのみ | 同一VNet内の任意のVM |
| Availability Zone対応 | 非対応 | ゾーン冗長対応 |
| ヘルスプローブ | TCP・HTTP | TCP・HTTP・HTTPS |
| Public IP SKU | Basic(Dynamic) | Standard(Static) |
| アウトバウンド通信 | デフォルトで許可 | アウトバウンドルール要設定 |
| SLA | なし | 99.99% |
最も重要な違いは2点です。第一に、バックエンドに追加できるVMの条件です。Basic SKUはAvailability Setに所属しているVMしかバックエンドに登録できません。Standard SKUはVNet内であれば任意のVMを登録できるため、柔軟なスケールアウト設計が可能です。第二に、アウトバウンド通信の扱いです。Basic SKUはデフォルトでアウトバウンドが許可されていましたが、Standard SKUでは明示的なアウトバウンドルールが必要です。移行後に「VMからインターネットへの通信が突然遮断された」というトラブルはここに原因があります。
TerraformでBasic SKUロードバランサーを構築する手順
1. 前提条件と作業ディレクトリの準備
以下のツールがインストールされていることを確認してください。・Terraform 1.5以上
・Azure CLI(az login 済み)
・Azureサブスクリプション(Contributor以上の権限)
作業ディレクトリを作成します。
mkdir azure-basic-lb-terraform cd azure-basic-lb-terraform
2. provider.tf の作成
AzureRM providerのバージョンを固定します。# provider.tf terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "~> 3.95" } } required_version = ">= 1.5.0" } provider "azurerm" { features {} }
~> を使うことで、マイナーバージョンのみ自動追従しメジャー破壊変更を防ぎます。3. main.tf:ネットワーク基盤の定義
リソースグループ・VNet・サブネット・Availability Setを定義します。Basic SKUロードバランサーのバックエンドにVMを追加するには、VMをAvailability Setに所属させることが必須条件です。# main.tf resource "azurerm_resource_group" "rg" { name = "rg-basic-lb-demo" location = "japaneast" } resource "azurerm_virtual_network" "vnet" { name = "vnet-basic-lb" address_space = ["10.0.0.0/16"] location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name } resource "azurerm_subnet" "subnet" { name = "subnet-backend" resource_group_name = azurerm_resource_group.rg.name virtual_network_name = azurerm_virtual_network.vnet.name address_prefixes = ["10.0.1.0/24"] } # Basic SKUでは Availability Set が必須 resource "azurerm_availability_set" "avset" { name = "avset-basic-lb" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name managed = true }
4. lb.tf:ロードバランサーと関連リソースの定義
Public IP・LB本体・バックエンドプール・ヘルスプローブ・負荷分散ルールをまとめて定義します。Basic SKUではPublic IPのSKUも"Basic"、allocation_method は "Dynamic" を使います。ここをStandardやStaticにするとデプロイ時にSKU不一致エラーが発生します。# lb.tf resource "azurerm_public_ip" "pip" { name = "pip-basic-lb" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name # Basic SKU は Dynamic のみ指定可 allocation_method = "Dynamic" sku = "Basic" } resource "azurerm_lb" "lb" { name = "lb-basic-demo" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name sku = "Basic" frontend_ip_configuration { name = "frontend-config" public_ip_address_id = azurerm_public_ip.pip.id } } resource "azurerm_lb_backend_address_pool" "backend_pool" { name = "backend-pool" loadbalancer_id = azurerm_lb.lb.id } resource "azurerm_lb_probe" "http_probe" { name = "http-probe" loadbalancer_id = azurerm_lb.lb.id # Basic SKU は TCP・HTTP のみ(HTTPS 不可) protocol = "Http" port = 80 request_path = "/" } resource "azurerm_lb_rule" "http_rule" { name = "http-rule" loadbalancer_id = azurerm_lb.lb.id protocol = "Tcp" frontend_port = 80 backend_port = 80 frontend_ip_configuration_name = "frontend-config" backend_address_pool_ids = [azurerm_lb_backend_address_pool.backend_pool.id] probe_id = azurerm_lb_probe.http_probe.id }
5. vm.tf:バックエンドVMとNICの定義
バックエンドVMを2台作成し、NICをバックエンドプールに関連付けます。availability_set_id でAvailability Setを指定することがBasic SKUの必須条件です。# vm.tf resource "azurerm_network_interface" "nic" { count = 2 name = "nic-vm-${count.index}" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name ip_configuration { name = "ipconfig" subnet_id = azurerm_subnet.subnet.id private_ip_address_allocation = "Dynamic" } } resource "azurerm_network_interface_backend_address_pool_association" "nic_assoc" { count = 2 network_interface_id = azurerm_network_interface.nic[count.index].id ip_configuration_name = "ipconfig" backend_address_pool_id = azurerm_lb_backend_address_pool.backend_pool.id } resource "azurerm_linux_virtual_machine" "vm" { count = 2 name = "vm-backend-${count.index}" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name size = "Standard_B1s" # Availability Set への所属(Basic SKU の必須条件) availability_set_id = azurerm_availability_set.avset.id admin_username = "azureuser" network_interface_ids = [azurerm_network_interface.nic[count.index].id] admin_ssh_key { username = "azureuser" public_key = file("~/.ssh/id_rsa.pub") } os_disk { caching = "ReadWrite" storage_account_type = "Standard_LRS" } source_image_reference { publisher = "RedHat" offer = "RHEL" sku = "9-gen2" version = "latest" } }
6. terraform apply の実行と動作確認
初期化と実行計画の確認を行ってから適用します。terraform init terraform plan -out=tfplan terraform apply tfplan
az network public-ip show --resource-group rg-basic-lb-demo --name pip-basic-lb --query "ipAddress" -o tsv # 出力例(環境により異なります) # 20.XXX.XXX.XXX
# バックエンドVM上でポートのLISTEN状態を確認 ss -tlnp | grep :80 # 出力例(環境により異なります) # LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))
Standard SKUへの移行|Terraformの変更箇所と注意点
2025年9月30日のBasic SKU廃止を受け、既存リソースをStandard SKUに移行する必要があります。Azureポータルには「SKUアップグレード」機能(インプレース移行)がありますが、Terraformで管理している場合はこの機能を使うとstateと実態がずれてしまいます。Terraformコードを変更してapplyするか、terraform import で再取り込みする対応が必要です。Standard SKUへの移行を検討しているなら、Azure実践ハンズオン講座でVNetやLBの設計パターンを体系的に学ぶことをお勧めします。Terraformでの移行における主な変更箇所は次のとおりです。
変更1:Public IPのSKUとallocation_method
# Basic SKU(変更前) resource "azurerm_public_ip" "pip" { allocation_method = "Dynamic" sku = "Basic" } # Standard SKU(変更後) resource "azurerm_public_ip" "pip" { allocation_method = "Static" # Dynamic から Static に変更 sku = "Standard" # Basic から Standard に変更 }
# Basic SKU(変更前) resource "azurerm_lb" "lb" { sku = "Basic" } # Standard SKU(変更後) resource "azurerm_lb" "lb" { sku = "Standard" }
# Standard SKU では HTTPS プローブが使える resource "azurerm_lb_probe" "https_probe" { name = "https-probe" loadbalancer_id = azurerm_lb.lb.id protocol = "Https" # Basic では不可・Standard のみ対応 port = 443 request_path = "/health" }
Standard SKUに変更するとアウトバウンド通信が自動で許可されなくなります。VMからインターネットへの通信が必要な場合は、アウトバウンドルールを追加してください。
# Standard SKU でアウトバウンドを許可する場合 resource "azurerm_lb_outbound_rule" "outbound" { name = "outbound-rule" loadbalancer_id = azurerm_lb.lb.id protocol = "All" backend_address_pool_id = azurerm_lb_backend_address_pool.backend_pool.id frontend_ip_configuration { name = "frontend-config" } }
Standard SKUに移行した場合、バックエンドVMをAvailability Setに所属させる必要はなくなります。Availability Zoneを設定した構成に変更することで、ゾーン障害に対する耐性を高められます。ただし、Availability SetからZone構成への変更はVMの再作成を伴うため、段階的な移行計画を立てておくことをお勧めします。
よくあるエラーと対処法
「SKU of PublicIPAddress does not match the SKU of the Load Balancer」
Basic LBにStandard Public IPを組み合わせた場合(またはその逆)に発生します。Public IPとLBのSKUは必ず一致させてください。・Basic LB → Basic Public IP(Dynamic)
・Standard LB → Standard Public IP(Static)
「NIC cannot be associated with a Load Balancer backend pool if the NIC is not in an Availability Set」
Basic SKU LBのバックエンドプールに、Availability Set未所属のVMのNICを追加しようとした場合に発生します。azurerm_linux_virtual_machine の availability_set_id にAvailability SetのIDを指定してください。「The SKU of resource cannot be downgraded」
Standard SKUをBasic SKUにダウングレードしようとした場合のエラーです。LBとPublic IPのSKUはアップグレード(Basic→Standard)のみ対応しており、ダウングレードはできません。2025年9月廃止後はBasic SKUの新規作成自体が不可のため、実質的にダウングレードの選択肢はなくなっています。terraform plan で「Changes made outside of Terraform」が表示される
AzureポータルのSKUアップグレード機能を使ってインプレース移行を行うと、Terraformのstateと実リソースがずれてこのメッセージが出ます。terraform refresh でstateを更新するか、terraform import で再取り込みしてからコードを合わせてください。まとめ
| やりたいこと | Terraformの設定 |
|---|---|
| Basic SKU LBを定義する | azurerm_lb { sku = "Basic" } |
| Basic SKU用Public IPを定義する | azurerm_public_ip { sku = "Basic", allocation_method = "Dynamic" } |
| Basic SKUのバックエンドVM条件を満たす | azurerm_linux_virtual_machine { availability_set_id = ... } |
| Standard SKUに移行する | LBとPublic IPの両方のsku・allocation_methodを変更 |
| Standard SKUでHTTPSプローブを使う | azurerm_lb_probe { protocol = "Https" } |
| Standard SKUでアウトバウンドを許可する | azurerm_lb_outbound_rule を追加 |
Azure Basic SKUロードバランサーは2025年9月30日に廃止済みです。既存のTerraformコードを保守している場合は、早めにStandard SKUへの移行を完了させてください。移行のポイントはLBとPublic IPのSKU変更、allocation_methodのDynamic→Static変更、そしてアウトバウンドルールの追加の3点です。Availability Zone対応への刷新もあわせて計画することで、より堅牢な構成に移行できます。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、
Linux Master Pro Seminarでは、AzureやAWSのLinux VM構築から本番運用までを2日間のハンズオンで学べます。受講者3,100名超の実績と現役サーバー管理者による指導で、クラウド時代のLinux実務スキルを確実に習得できます。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:azure VMのSKU一覧をAZ CLIで確認する方法|リージョン別スペック比較
- この記事の属するカテゴリ:Azureへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます