azure Basic SKUロードバランサーをTerraformで構築する手順|Standard移行との比較

運営:リナックスマスター.JP(代表 宮崎智広)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Azure > azure Basic SKUロードバランサーをTerraformで構築する手順|Standard移行との比較
「AzureのTerraformコードを継承したら、Basic SKUのロードバランサーが定義されていた」「Standard SKUに移行しようとしても、何をどう変えればいいか分からない」という声をよく聞きます。

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への移行後はアウトバウンドルールの追加が必要になる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

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

適用後、ロードバランサーのパブリックIPアドレスを確認します。

az network public-ip show --resource-group rg-basic-lb-demo --name pip-basic-lb --query "ipAddress" -o tsv # 出力例(環境により異なります) # 20.XXX.XXX.XXX

バックエンドVMにNginxやApacheをインストールした状態で、取得したPublic IPへcurlを送信してHTTP 200が返ることを確認します。バックエンドVMが応答しない場合は、VM上のポート開放状態をssコマンドで確認するのが有効です(Linux ポート確認の全コマンド)。

# バックエンド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 に変更 }

変更2:ロードバランサー本体のSKU

# Basic SKU(変更前) resource "azurerm_lb" "lb" { sku = "Basic" } # Standard SKU(変更後) resource "azurerm_lb" "lb" { sku = "Standard" }

変更3:ヘルスプローブのプロトコル(任意・拡張)

# 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" }

変更4:アウトバウンドルールの追加(必須)
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" } }

変更5:Availability Setの要否
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実務スキルを確実に習得できます。

>> Azure実践ハンズオン講座の詳細を見る

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

運営

リナックスマスター.JP(代表 宮崎智広)

株式会社イーネットマーキュリーが運営するLinux教育サイトです。代表の宮崎智広は現役のLinuxサーバー管理者として20年以上の実務経験を持ち、累計3,100名以上のエンジニアを指導してきました。実践型のLinuxセミナーや無料マニュアルの配布を通じてLinux人材の育成に取り組んでいます。