読者です 読者をやめる 読者になる 読者になる

BEACHSIDE BLOG

MicrosoftとかC#を好むレンジャーの個人的メモ

Azure Functions に IPアドレス制限をかける

2017年4月の現時点では「従量課金プラン」ではできないです。
「AppServiceプラン」でやる必要があります。むむ。
今回はこの方法の手順メモです。

ガチなエンタープライズ系で予算潤沢なら、高機能で料金もお高い API Management でやればいいんでしょうね。

ちなみに(英語力に乏しい私は)会社の同僚に質問を投げてもらい、中の人が返信してくれたのを参考にしています。

c# - Azure Functions and restricting IPs - Stack Overflow

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 プラン/場所」をクリックして、プランは必ず確認しましょう。勝手に変なのが設定されてて無駄に課金ががガガガガとならないように…。

f:id:beachside:20170419192928p:plain


必要に応じで既存のプランを選択するか、新規作成をしましょう。選択できるのは、Basic以上のプランとなります。
(そのあたりのドキュメントはこちら
つまり課金がかかるので、不要になったら削除を忘れずに。

確認をしたら 作成 をクリックしましょう。

f:id:beachside:20170419192936p:plain


関数の作成

作成したFunction Appを開き、関数を追加します。
前回この関数を作成する って方法を使ったので、今回は カスタム関数 から作成しましょう。

f:id:beachside:20170419192943p:plain


私が試したいのがC#でHttpTriggerなので、「言語」と「シナリオ」でフィルターをかけて「HttpTrigger-CSharp」を選択します。

f:id:beachside:20170419192951p:plain


「関数名の指定」には適当な関数名(今回は「Func1」にしました」を入れ、作成 をクリックして作成です。

f:id:beachside:20170419193022p:plain


生成された関数を実行して、ちゃんと動くことだけは、実行して確認しておきましょう。

f:id:beachside:20170419193214p:plain


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 をダウンロードします。

f:id:beachside:20170419193227p:plain


Kuduで Site Extension の設定

まずはFunction App名をクリックして表示される関数のURLを取得します。

f:id:beachside:20170419193236p:plain

今回の例だと関数のURLが

https://yokofunctionsapp12.azurewebsites.net

なので、Kuduへのアクセスは azurewebsites.net の前に scm. を付けたURL、

https://yokofunctionsapp12.scm.azurewebsites.net

となります。ブラウザーで開いて、Debug console > CMD を開きましょう(PowerShellでもどっちでもいいですが)。

f:id:beachside:20170419193248p:plain


画面を開いて表示されたディレクトリ(コンソールでみると D:\home )に、先ほどダウンロードした「Functions.Private.zip」をzipのままドラッグアンドドロップします。 (Edgeでやったらフリーズしてチーンなったので、Chromeでやりました)

f:id:beachside:20170419193334p:plain


正常に完了すると、SiteExtension というディレクトリが作られます。SiteExtension > Functions の下に 「Web.config」があります。
これを編集してIP制限をかけることができます。編集ボタンっぽいやつをクリックしましょう。

f:id:beachside:20170419193721p:plain


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 ボタンをクリックして保存しましょう。

f:id:beachside:20170419205021p:plain


プロセスを再起動する必要があるようなので、Process explorer の画面に移動します。w3wp.exe (scmとついていない方!)を右クリックしてkillします。
(その後勝手に再起動します。)

f:id:beachside:20170419193542p:plain


Web.configの編集で事故ると、Azure ポータルでFunctionAppのテストの実行ができなくなります。念のため試しておきましょう。
(この時点で制限がかかっているので、接続できるIPアドレスからしかテストもできません)

f:id:beachside:20170419193549p:plain


3. 動作確認

Postman を使って動作確認

RESTのクライアントなら何でもいいのですが、Postmanを使って動作を確認します。

アクセスするURLは、Azure ポータルの テストで実行した画面から取得できます。

f:id:beachside:20170419193736p:plain


Postmanで、メソッドをPOSTに設定してURLを上記で取得したものをいれます。

「Headers」は、key Content-Type のvalueに application/json をセットしておけば大丈夫です。

f:id:beachside:20170419193744p:plain


Bodyには、こんなJsonをセット。

{
    "name": "BEACHSIDE"
}

f:id:beachside:20170419204733p:plain


設定したグローバルIPから送信すると、正常に返ってきます。

f:id:beachside:20170419193802p:plain


ネットワークを切り替えて別のIPからアクセスすると、こんな感じでエラーが出ます(エラーコードとかは、IP制限をかけるときに設定できます)。

f:id:beachside:20170419193818p:plain


おわりに

念のため確認した点ですが、App Service プランにてFunctionのIP制限をかけているため、WebAppをデプロイしても影響がありません。 当たり前ですが、逆にWebAppでIP制限をかけてもFunctionsには反映されないです。

この手の情報がなかったので、これで本当に大丈夫か…とりあえず正常に動いていますが…今のところ不安しかないです。
KuduとかSite Extensionで設定した内容をちゃんと理解しよう…そのうち…。

AzureのUserVoiceに、「Azure Functions ProxiesからIP制限かけれる機能がほしーなー」とFeedbackしてみたので、Voteしていただけると幸いです♪

How can we improve Microsoft Azure Functions?
  • 4 votes
  • 0 comments

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.

feedback.azure.com

あとは不要なインスタンスの削除をお忘れなく(ここでさんざん書いてる私が2日ほど削除し忘れてました…)。

参考

Deploying the Functions runtime as a private site extension · Azure/azure-webjobs-sdk-script Wiki · GitHub