2018/3 更新: 機能が追加されたので、以下を参照ください♪
(↓↓↓ 以下は古い情報です! ↓↓↓)
2017年4月の現時点では「従量課金プラン」ではできないです。
「AppServiceプラン」でやる必要があります。むむ。
今回はこの方法の手順メモです。
ガチなエンタープライズ系で予算潤沢なら、高機能で料金もお高い API Management か ASE でやればいいんでしょうね。
Overview
Function App作って、KuduのSite Extension使ってIPアドレス制限をかけます。動作確認は、RESTクライアントのツール「Postman」を使いました。
1. Function App の作成
2. IP制限をかける
3. 動作確認
1. Function App の作成
検証で使ったものをサクッと削除できるよう(特に今回は課金必須なので)、リソースグループを作成してその中でFunctionAppを作りましょう(手順は省略)。
Function Appのインスタンス作成
今回のFunction App のアプリ名は「yokofunctionsApp12」にしています。ホスティングプランは、冒頭で書いたようにApp Service プランでしか利用できないので、App Service プランを選択します。 「App Service プラン/場所」をクリックして、プランは必ず確認しましょう。勝手に変なのが設定されてて無駄に課金ががガガガガとならないように...。
必要に応じで既存のプランを選択するか、新規作成をしましょう。選択できるのは、Basic以上のプランとなります。
(そのあたりのドキュメントはこちら)
つまり課金がかかるので、不要になったら削除を忘れずに。
確認をしたら 作成
をクリックしましょう。
関数の作成
作成したFunction Appを開き、関数を追加します。
前回は この関数を作成する
って方法を使ったので、今回は カスタム関数
から作成しましょう。
私が試したいのがC#でHttpTriggerなので、「言語」と「シナリオ」でフィルターをかけて「HttpTrigger-CSharp」を選択します。
「関数名の指定」には適当な関数名(今回は「Func1」にしました」を入れ、作成
をクリックして作成です。
生成された関数を実行して、ちゃんと動くことだけは、実行して確認しておきましょう。
2. IP制限をかける
azure-webjobs-sdk-script をダウンロード
https://ci.appveyor.com/project/appsvc/azure-webjobs-sdk-script-y8o14/build/1.0.10650/artifacts にて、Functions.Private.zip
をダウンロードします。
Kuduで Site Extension の設定
まずはFunction App名をクリックして表示される関数のURLを取得します。
今回の例だと関数のURLが
https://yokofunctionsapp12.azurewebsites.net
なので、Kuduへのアクセスは azurewebsites.net
の前に scm.
を付けたURL、
https://yokofunctionsapp12.scm.azurewebsites.net
となります。ブラウザーで開いて、Debug console
> CMD
を開きましょう(PowerShellでもどっちでもいいですが)。
画面を開いて表示されたディレクトリ(コンソールでみると D:\home
)に、先ほどダウンロードした「Functions.Private.zip」をzipのままドラッグアンドドロップします。
(Edgeでやったらフリーズしてチーンなったので、Chromeでやりました)
正常に完了すると、SiteExtension
というディレクトリが作られます。SiteExtension
> Functions
の下に 「Web.config」があります。
これを編集してIP制限をかけることができます。編集ボタンっぽいやつをクリックしましょう。
Web.confingのIP制限に関して不明な場合はここら辺がまとまっている感じです。
今回のサンプルでは192.168.0.101
のみを許可する制限をしてみます。(IPアドレスは、もちろんグローバルIPを指定です。)
ざっくりな説明ですが、Web.configの<system.webServer>
セクションの中に
<security> <ipSecurity allowUnlisted="false" denyAction="NotFound"> <add allowed="true" ipAddress="192.168.0.101" /> </ipSecurity> </security>
という感じで設定します。Save
ボタンをクリックして保存しましょう。
プロセスを再起動する必要があるようなので、Process explorer の画面に移動します。w3wp.exe
(scmとついていない方!)を右クリックしてkillします。
(その後勝手に再起動します。)
Web.configの編集で事故ると、Azure ポータルでFunctionAppのテストの実行ができなくなります。念のため試しておきましょう。
(この時点で制限がかかっているので、接続できるIPアドレスからしかテストもできません)
3. 動作確認
Postman を使って動作確認
RESTのクライアントなら何でもいいのですが、Postmanを使って動作を確認します。
アクセスするURLは、Azure ポータルの テストで実行した画面から取得できます。
Postmanで、メソッドをPOST
に設定してURLを上記で取得したものをいれます。
「Headers」は、key Content-Type
のvalueに application/json
をセットしておけば大丈夫です。
Bodyには、こんなJsonをセット。
{ "name": "BEACHSIDE" }
設定したグローバルIPから送信すると、正常に返ってきます。
ネットワークを切り替えて別のIPからアクセスすると、こんな感じでエラーが出ます(エラーコードとかは、IP制限をかけるときに設定できます)。
おわりに
念のため確認した点ですが、App Service プランにてFunctionのIP制限をかけているため、WebAppをデプロイしても影響がありません。 当たり前ですが、逆にWebAppでIP制限をかけてもFunctionsには反映されないです。
この手の情報がなかったので、これで本当に大丈夫か...とりあえず正常に動いていますが...今のところ不安しかないです。
KuduとかSite Extensionで設定した内容をちゃんと理解しよう...そのうち...。
AzureのUserVoiceに、「Azure Functions ProxiesからIP制限かけれる機能がほしーなー」とFeedbackしてみたので、Vote
していただけると幸いです♪
Restrict IPs in Azure Functions Proxies
I want IP restriction in Azure Functions Proxies. My customer has a security policy that IPs are whitelisted. Current solutions are to host AppServices plan or API management. This feature is essential for enterprise customers.
あとは不要なインスタンスの削除をお忘れなく(ここでさんざん書いてる私が2日ほど削除し忘れてました...)。