💻️

Azure App ServiceでVNET統合Multi-plan subnet joinを試す

2024/04/10に公開

はじめに

Azure App ServiceのVNET統合にて、複数のApp Service(厳密にはApp Service Plan)を同一サブネットに接続することができるようになりました。※2024年4月時点でプレビュー
従来はApp Service Planごとにサブネットを分割する必要があり、サブネットが乱立することが多かったのですが、かなりスッキリできそうです。

https://azure.microsoft.com/ja-jp/updates/appservicempsjpp/

VNET統合とは

App Service、Function、Logic Appsは既定では仮想ネットワーク内部のリソースにはアクセスできません。VNET統合を使用することで、仮想ネットワーク内部、または接続された他VNET、オンプレミスネットワークにアクセスすることができるようになります。
内部的にはサブネット内に専用の仮想NICをマウントすることでプライベート通信を実現しています。
各サービスごとに一定以上のSKUを使用する必要があります。
https://learn.microsoft.com/ja-jp/azure/app-service/overview-vnet-integration

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.

Multi-plan subnet join
統合サブネットが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