Azure Functions (App Service) が使用する通信用 IP について

Azure Functions、と言うよりはその基盤となる App Service の仕組みになるが、通信に使用する IP が、1 つだけ使用するとかの単純な構成ではない。

まず、受信と送信で、別の口が用意されている。受信は 1 つで、送信は 4 つから 5 つの複数個用意されている (スタンプと呼ばれる概念)。このスタンプの中に VM インスタンスを作成して実行する仕組みは、Functions の従量課金プランも App Service プランも同じ。

念の為それぞれの役割を簡単に説明すると、例えば、GET の REST API で処理を受け付け、SQL Database にクエリーを投げて、その結果を返すような Function があったとする。 この場合、まずクライアントからの REST API 呼び出しは受信用の IP で行い、SQL Database とのやり取りは、送信用の IP (複数あるうちのどれか) で行う。

上記のようなパターンで、セキュリティ強化のために SQL Database の IP 制限を行い、当該 Functions からのアクセスのみ許可したいとすると、当該 Functions の送信用 IP アドレスを全て SQL Database のファイアウォールで許可 IP に登録する必要がある。

(後述するが、従量課金プランの Functions の場合は使用スタンプが動的に変わる可能性がある為、ファイアウォール等の登録 IP としては使用不可)

App Service プランで注意する点としては、下記

  • 当該 App Service のプランを変更するレベルの作業を行わない限り、送信用 IP は基本的に変更されることはない (インスタンス再起動とかでは変わらない)。が、その場合でも変わる可能性はゼロではないらしく、大規模なメンテナンス等が発生した際に、変わる可能性があるらしい (数年に一度ぐらいのレベル?)
  • ファイアウォールの許可 IP 等で使用していた場合、送信 IP の変更発生後は、許可 IP も変更する必要がある
  • 上述した「スタンプ」と呼ばれる箱みたいな概念で受信の口と送信の口を分けて管理しているが、この「スタンプ」の箱に入るのは自分の App Service だけではなく、他ユーザーの App Service も含む複数の App Service がまとめて登録される。同じスタンプ内の App Service は、同じ受信口、送信口を使用する。上述したようなファイアウォールの許可 IP として設定できるのは App Service の IP ではなく、あくまでこの「スタンプ」の IP なので、制限できるのもこのスタンプレベルまでとなり、同じスタンプ内の別の App Service からの通信は、許可されることになる (IP 的には)

Functions の送信用 IP の確認方法は、以下の通り

  1. Azure ポータル画面を開く
  2. 当該 Functions の画面を開く
  3. [プラットフォーム機能] - [プロパティ] をクリックする
  4. [送信 IP アドレス] に複数の IP が表示されているので (表示されていない場合は次の手順に進む)、IP 制限を行いたい時はこの IP を全て登録する f:id:poke_dev:20180430111347p:plain
  5. (上記設定画面に [送信 IP アドレス] が表示されていない場合は、以降の作業を行う。因みに上記は Functions ではなく、Web Apps での例となっている)
  6. [プラットフォーム機能] - [リソース エクスプローラー] をクリックする f:id:poke_dev:20180430112825p:plain
  7. リソース エクスプローラーが別画面で開き、確認する必要がある JSON が自動的に表示される (はず)。[outboundIpAddresses] の IP が、送信 IP アドレスとなる。なお、そのすぐ下に表示されている [possibleOutboundIpAddresses] は気にしないで良いみたい (ドキュメントではこっちを見ると記載されているのもあるけど、詳細は不明) f:id:poke_dev:20180430114751p:plain

補足

  • 受信用 IP は、[プラットフォーム機能] - [カスタム ドメイン] - [IP アドレス] で確認できる
  • プランによらず、Functions の送信 IP を完全に固定するのは無理な様子。この問題に完全に対処しようとすると、スタンプを専有する App Service Environment (ASE) の利用が必要らしい (最低数十万からの使用料がかかる。大規模システム用らしく、単純に送信 IP 変更の問題を解決できるからとかそういう理由だけで使えるような代物ではないので、注意)
  • App Service プランを使用しても送信 IP が変わる可能性はゼロではないが、基本的には変わらず、大規模メンテナンスとかのタイミングで変わる可能性があるとか何とか。数年に一度あるかどうかのレベル(?)。計画が予定されている変更の場合は事前に通知があるらしいので、IP 制御に使っている場合はその通知を見て自分で手動で変更してくださいねというスタンスらしい (送信 IP アドレスの変更に備える方法)
  • MS ドキュメントでは、Azure データセンターの全 IP をホワイトリストに登録する方法もあるのではみたいな情報もあるが、ずっと固定とは思えないし凄い数だしで、正直現実的な方法とは思えない (Azure Functions の IP アドレス)

従量課金プランの Functions に関する補足

  • 従量課金プランの Functions では home と呼ばれるスタンプ (= スケール ユニット) が基本的に使用され、リソース エクスプローラーで確認できる outboundIpAddress も、この home スタンプのものとなる。 ただ、恒常的に home 以外のスタンプにインスタンスが作成される可能性があり、この場合、送信 IP も home スタンプのものとは異なる事になる (= IP を確定できない)。詳細は下記フォーラムを参照
  • Outbound IP Addresses

参考ドキュメント