App Service EnvironmentとAzure Firewallを構成する
2019-12-11
azblob://2022/11/11/eyecatch/2019-12-11-ase-firewall-000.jpg

この記事はFIXER Advent Calendar 2019 (https://adventar.org/calendars/4579) 11日目の記事です。前日は関根さんの『Managed Disk Burst Suppotが気になる件』です。 

App Service Environmentとは何か

ざっくり説明すると、VNET内からAzure App Serviceを利用可能にしたものです。
App Service Environment(以下ASE)には内部ASEと外部ASEがそれぞれ存在し、要件によって使い分けることが可能です。
詳しくはこちら

今回は内部ASEとAzure Firewallを組み合わせた環境の構築を行います。
構成については下図のようなイメージです。

必要なもの

・VNET
・NSG
・ルートテーブル
・Azure Firewall
・ASE

構築手順

1.VNETやNSGなど
ASEを配置するVNETやNSGを構成します。サブネットではサービスエンドポイントを有効にする必要があります。 NSGはこちらを参考にします。

有効にするサービスエンドポイントの種類
・Microsoft.Sql
・Microsoft.Storage
・Microsoft.EventHub

サブネットでサービスエンドポイントが有効なことを確認

2.ルーティングの構成
ASEからの送信トラフィックをAzure Firewallを経由するようルーティングを構成します。一部の通信は仕様でFirewallを経由せずに行う必要があるため、↓のPowershellでルートを一括追加します。

$rg = "resource group name"
$rt = "route table name"
$location = "azure location"
$managementAddresses = "13.64.115.203", "13.66.140.0", "13.67.8.128", "13.69.64.128", "13.69.227.128", "13.70.73.128", "13.71.170.64", "13.71.194.129", "13.75.34.192", "13.75.127.117", "13.77.50.128", "13.78.109.0", "13.89.171.0", "13.94.141.115", "13.94.143.126", "13.94.149.179", "20.36.106.128", "20.36.114.64", "23.100.226.236", "23.102.135.246", "23.102.188.65", "40.69.106.128", "40.70.146.128", "40.71.13.64", "40.74.100.64", "40.78.194.128", "40.79.130.64", "40.79.178.128", "40.83.120.64", "40.83.121.56", "40.83.125.161", "40.90.240.166", "40.91.126.196", "40.112.242.192", "40.119.4.111", "40.124.47.188", "51.140.146.64", "51.140.210.128", "52.151.25.45", "52.162.80.89", "52.162.106.192", "52.165.152.214", "52.165.153.122", "52.165.154.193", "52.165.158.140", "52.174.22.21", "52.178.177.147", "52.178.184.149", "52.178.190.65", "52.178.195.197", "52.187.56.50", "52.187.59.251", "52.187.63.19", "52.187.63.37", "52.224.105.172", "52.225.177.153", "52.231.18.64", "52.231.146.128", "65.52.14.230", "65.52.172.237", "65.52.193.203", "70.37.57.58", "70.37.89.222", "104.43.242.137", "104.44.129.141", "104.44.129.243", "104.44.129.255", "104.44.134.255", "104.208.54.11", "104.211.81.64", "104.211.146.128", "104.214.49.0", "157.55.176.93", "157.55.208.185", "191.233.203.64", "191.236.154.88"

az network route-table create --name $rt --resource-group $rg --location $location
foreach ($ip in $managementAddresses) {
    az network route-table route create -g $rg --route-table-name $rt -n $ip --next-hop-type Internet --address-prefix ($ip + "/32")
}

Azure Firewall宛へのルーティングは下記の内容で登録を行います。

・ルート名:任意の名称
・アドレスプレフィックス:0.0.0.0/0(デフォルトルート)
・次ホップの種類:仮想アプライアンス
・次ホップアドレス:Azure FirewallのプライベートIPアドレス

Azure Firewall宛のルーティング規則

追加されたルート定義はポータルから確認可能です。

追加したルート一覧

これでASEから外部への通信がAzure Firewall経由となります。

3.Azure Firewallの設定
アプリケーションルールのFQDNタグに「WindowsUpdate」、「AppServiceEnvironment」を追加します。

アプリケーションルールコレクションの追加

続いてネットワークルールでは宛先アドレスをAnyで、ポート123と12000を許可します。

ネットワークルールコレクションの追加

4.ASEのデプロイ
構成したサブネットにASEを配置します。デプロイには1~2時間ほど時間が必要となります。
ここでNSGやルーティング設定が誤っていると、いつまでもデプロイが完了せず失敗するので注意しましょう。

「仮想IPの種類」を内部に指定

5.App Serviceの配置
ASEの構築が完了したらApp Servie Planを配置します。こちらも時間がかかります。
App Serviceも配置したら、環境構築は完了となります。

「地域」でASEを指定すると、Isolatedプランが自動的に選択されます

注意点

注意しなければならない点が多いので記載します。

1.ASE上のApp Serviceへの接続について
内部ASEを構成した場合、受信パブリックIPを持たないため直接インターネット経由での接続ができません。 また、App Serviceに割り当てられるドメイン名(*.appserviceenvironment.net)がデフォルトでは名前解決できないため、hostsファイルやDNSサーバへのレコード追加で対処する必要があります。その際iLBのプライベートIPアドレスを宛先にすると接続が可能です。

hostsファイルで名前解決を行う

2.NSGの構成
NSGはサブネットに対して割り当てます。管理用の通信を許可しないとAzureポータルからASEを操作不能になります。

3.ルーティングの構成
Azure Firewallなどを利用する場合、ルーティングの構成が必要となります。
しかし、ASEはすべての通信でFirewallを利用できるわけではないため、サービスエンドポイントの利用やルートテーブルへの例外追加が必要となります。

4.送信用IPについて
内部ASEを構成する場合でもASEは送信用のパブリックIPを持ちます。このIPを利用してAzure基盤側との通信を行いますが、停止などによりIPアドレスが再割り当てされる可能性があります。

5.サービスエンドポイントの構成
Azure Firewallを利用する場合、一部PaaSへの接続はサービスエンドポイントの利用が必須となるようです。しかしサービスエンドポイントではペアリージョンにアクセスが不可など、条件があるため注意が必要です。

6.Azure Functionsのランタイムエラー
ポータルからAzure Functionsのランタイムを確認するためには、App Serviceの持つKuduサイトへアクセスできる環境が必須となります。しかし内部ASEのKuduサイトはプライベートネットワーク内のため、ポータルで直接Functionの開発をする場合は工夫が必要となります。

関数(アクセス不可)と、ランタイムのエラーが表示されている画面

所感

VNETやNSGで管理できることから、閉じた環境でApp Serviceを利用する要件がある場合に便利なサービスです。ただし通常のApp Service以上にランニングコストが発生するため、利用する場合は注意しましょう。
今後App Service Environmentを利用する場合、参考にしていただければ幸いです。