Azure App ServiceでVNET統合Multi-plan subnet joinを試す
はじめに
Azure App ServiceのVNET統合にて、複数のApp Service(厳密にはApp Service Plan)を同一サブネットに接続することができるようになりました。※2024年4月時点でプレビュー
従来はApp Service Planごとにサブネットを分割する必要があり、サブネットが乱立することが多かったのですが、かなりスッキリできそうです。
VNET統合とは
App Service、Function、Logic Appsは既定では仮想ネットワーク内部のリソースにはアクセスできません。VNET統合を使用することで、仮想ネットワーク内部、または接続された他VNET、オンプレミスネットワークにアクセスすることができるようになります。
内部的にはサブネット内に専用の仮想NICをマウントすることでプライベート通信を実現しています。
各サービスごとに一定以上のSKUを使用する必要があります。
VNET統合で実現できること
- 統合されたVNET内のプライベートIPへのアクセス(VM、LB、プライベートエンドポイント等)
- 統合されたVNETに接続されているネットワーク(VNET Peering、VPN、ExpressRoute)へのアクセス
- NAT Gateway、NSG、ルートテーブル(UDR)の使用
- Azure FirewallやProxyの利用
Multi-plan subnet joinとは
ところが、VNET統合はApp Service Planごとに /28以上の専用サブネットが必要です。環境によっては新しくApp Serviceをデプロイするたびにサブネットを追加する必要があり、ネットワーク管理が煩雑でした。
そこで登場したのが本機能になります。
といっても、App Service Plan = 1サブネットの原則がなくなったくらいで、大きな変化はありません。
GAされた場合、サブネットサイズの要件が /26以上になる、ということが言及されていました。
For GA, the minimum requirement for subnet size will be /26. This is currently not enforced.
統合サブネットが1つになる
試してみる
VNET作成
Azure VNETおよびサブネットを作成します。
サブネットの委任については、Azureポータルで作業する場合は気にしなくても構いませんが、PowerShellやTerraformで作業している場合は設定に含めておく必要があります。
Terraform記載例
resource "azurerm_virtual_network" "main" {
for_each = var.vnet_parameters
name = "Name of VNET"
address_space = ["10.0.0.0/16"]
location = "japaneast"
resource_group_name = "Name of Resource Group"
}
resource "azurerm_subnet" "main" {
name = "Name of Subnet"
resource_group_name = azurerm_virtual_network.main.resource_group_name
virtual_network_name = azurerm_virtual_network.main.name
address_prefixes = ["10.0.0.0/24"]
delegation {
name = "delegation"
service_delegation {
name = "Microsoft.Web/serverFarms"
}
}
lifecycle {
ignore_changes = [
delegation["actions"] # actionは自動追加されるため変更無視
]
}
}
App Serviceデプロイ
App Serviceをデプロイします。VNET統合が使用可能なBasic以上のSKUを選択してデプロイします。
VNET統合設定
VNET統合を設定します。ポータルからは「ネットワーク」タブ→仮想ネットワーク統合「未構成」をクリックし設定します。
他のプランで利用されているサブネットという注釈付きで、設定可能なサブネットが表示されます。選択して保存します。
App Service 1インスタンスについて、IPアドレスが1つ消費されます。IPアドレスの残数はAzureポータルで確認可能です。
Terraform記載例
通常のVNET統合と同様です。
# App Service 1つめ
resource "azurerm_service_plan" "appplan1" {
name = "Name of App Service Plan 1"
location = "japaneast"
resource_group_name = "Name of Resource Group"
os_type = "Windows"
sku_name = "S1"
}
resource "azurerm_windows_web_app" "appservice1" {
name = "Name of App Service 1"
location = azurerm_service_plan.appplan1.location
resource_group_name = azurerm_service_plan.appplan1.resource_group_name
service_plan_id = azurerm_service_plan.appplan1.id
site_config {
vnet_route_all_enabled = true
}
virtual_network_subnet_id = azurerm_subnet.main.id
}
# App Service 2つめ
resource "azurerm_service_plan" "appplan2" {
name = "Name of App Service Plan 2"
location = "japaneast"
resource_group_name = "Name of Resource Group"
os_type = "Linux"
sku_name = "S1"
}
resource "azurerm_linux_web_app" "appservice2" {
name = "Name of App Service 2"
location = azurerm_service_plan.appplan2.location
resource_group_name = azurerm_service_plan.appplan2.resource_group_name
service_plan_id = azurerm_service_plan.appplan2.id
site_config {
vnet_route_all_enabled = true
}
virtual_network_subnet_id = azurerm_subnet.main.id
}
設定確認
VNET統合が適切に行われているか確認してみましょう。NATゲートウェイを使用することで簡単に確認可能です。
NATゲートウェイを作成し、VNET統合を設定したサブネットに関連付けます。
NATゲートウェイのIPアドレスを確認します。
App Serviceでコンソール(またはSSH)を開き、以下のコマンドで送信IPを確認します。
$ curl -Ss ifconfig.io
NATゲートウェイのIPアドレスが返ってきましたね。
Function, Logic Apps
Azure Function(EP plan)、Logic Apps(WS plan)でも同様にVNET統合が設定可能です。
従量課金プランではVNET統合自体が利用できないため注意が必要です。
感想
PaaSをメインで利用する環境において、VNET統合の仕様はアドレス設計を複雑化する要因となり、新規導入、追加開発問わずかなりの足かせでした。今回のアップデートにより設計/管理が単純化でき、気軽にVNET統合を利用できるようになります。ほとんどのリージョンでMulti-plan subnet joinが使えるようになったので、あとはGAを待つのみですね。
Discussion