チュートリアル: Azure 仮想ネットワーク NAT ゲートウェイを使用して Azure Functions の送信 IP を制御する

仮想ネットワーク アドレス変換 (NAT) を使用すると、仮想ネットワークで送信のみのインターネット接続が簡単になります。 これをサブネットに対して構成した場合、指定した静的パブリック IP アドレスがすべてのアウトバウンド接続で使用されます。 NAT は、セキュリティ対策として IP アドレスの許可リストが使われるサードパーティのサービスを使用する必要があるアプリで役に立つ場合があります。 詳細については、「Azure NAT Gateway とは」を参照してください。

このチュートリアルでは、NAT ゲートウェイを使用して、HTTP によってトリガーされる関数からの送信トラフィックをルーティングする方法について説明します。 この関数を使用すると、それ自体の送信 IP アドレスを確認できます。 このチュートリアルでは、以下のことを行います。

  • 仮想ネットワークの作成
  • Premium プランの関数アプリを作成する
  • パブリック IP アドレスの作成
  • NAT ゲートウェイを作成する
  • NAT ゲートウェイ経由で送信トラフィックをルーティングするように関数アプリを構成する

トポロジ

次の図は、作成するソリューションのアーキテクチャを示します。

UI for NAT gateway integration

Premium プランで実行されている関数には、VNet 統合機能を含む、Azure App Service の Web アプリと同じホスティング機能があります。 トラブルシューティングや高度な構成など、VNet 統合の詳細については、「アプリを Azure 仮想ネットワークに統合する」を参照してください。

前提条件

このチュートリアルでは、IP アドレスの割り当てとサブネット化を理解することが重要です。 アドレスの割り当てとサブネット化の基本を取り上げたこの記事から開始できます。 多くの記事およびビデオをオンラインで利用できます。

Azure サブスクリプションがない場合は、開始する前に無料アカウントを作成してください。

既に Functions と Azure 仮想ネットワークの統合に関するチュートリアルを完了している場合は、「HTTP トリガー関数の作成」に進むことができます。

仮想ネットワークの作成

  1. Azure portal メニューから [リソースの作成] を選択します。 Azure Marketplace で、 [ネットワーク]>[仮想ネットワーク] を選択します。

  2. [仮想ネットワークの作成] で、次の表で指定されている設定を入力するか選択します。

    設定
    サブスクリプション サブスクリプションを選択します。
    Resource group [新規作成] を選択し、「myResourceGroup」と入力して、 [OK] を選択します。
    名前 myResourceGroup-vnet」と入力します。
    場所 [米国東部] を選択します。
  3. [次へ: IP アドレス] を選択し、 [IPv4 アドレス空間] に「10.10.0.0/16」と入力します。

  4. [サブネットの追加] を選択し、 [サブネット名] に「Tutorial-Net」、 [サブネットのアドレス範囲] に「10.10.1.0/24」と入力します。

    IP Addresses tab for creating a vnet

  5. [追加] を選択し、 [Review + create](確認と作成) を選択します。 残りは既定値のままにして、 [作成] を選択します。

  6. [仮想ネットワークの作成] で、 [作成] を選択します。

次に、Premium プランで関数アプリを作成します。 このプランはサーバーレス スケールを提供しながら、仮想ネットワーク統合をサポートします。

Premium プランの Function App を作成する

このチュートリアルでは、Premium プランで関数アプリを作成する方法を紹介します。 専用 (App Service) プランを使用する場合も、同じ機能を使用できます。

Note

このチュートリアルに最適なエクスペリエンスを実現するには、ランタイム スタックに .NET を選択し、オペレーティング システムに Windows を選択します。 また、仮想ネットワークと同じリージョンに関数アプリを作成します。

  1. Azure portal のメニューまたは [ホーム] ページから [リソースの作成] を選択します。

  2. [新規] ページで、 [計算]>、 [関数アプリ] の順に選択します。

  3. [基本] ページで、下の表に指定されている関数アプリの設定を使用します。

    設定 提案された値 説明
    サブスクリプション 該当するサブスクリプション この新しい Function App が作成されるサブスクリプション。
    リソース グループ myResourceGroup Function App を作成するための新しいリソース グループの名前。
    関数アプリ名 グローバルに一意の名前 新しい関数アプリを識別する名前。 有効な文字は、a-z (大文字と小文字の区別をしない)、0-9、および -です。
    発行 コード コード ファイルまたは Docker コンテナーの発行オプション。
    ランタイム スタック 優先言語 お気に入りの関数プログラミング言語をサポートするランタイムを選択します。 ポータルでの編集は現在、Python 開発ではサポートされません。
    リージョン 優先リージョン ユーザーに近いリージョン、または関数がアクセスする他のサービスの近くのリージョンを選択します。
  4. [Next:ホスティング] を選択します。 [ホスティング] ページで、次の設定を入力します。

    設定 提案された値 説明
    ストレージ アカウント グローバルに一意の名前 Function App で使用されるストレージ アカウントを作成します。 ストレージ アカウント名の長さは 3 ~ 24 文字で、数字と小文字のみを使用できます。 既存のアカウントを使用することもできますが、ストレージ アカウントの要件を満たしている必要があります。
    オペレーティング システム 優先オペレーティング システム オペレーティング システムは、ランタイム スタックの選択に基づいてあらかじめ選択されますが、必要に応じて設定を変更できます。 Python は Linux でのみサポートされています。 ポータルでの編集は Windows でのみサポートされます。
    プラン Premium Function App にどのようにリソースが割り当てられるかを定義するホスティング プラン。 [Premium] を選択します。 既定では、新しい App Service プランが作成されます。 既定の SKU とサイズEP1 です。ここで、EP は "エラスティック Premium" を表します。 詳細については、Premium SKU の一覧を参照してください。
    Premium プランで JavaScript 関数を実行する場合は、vCPU の少ないインスタンスを選ぶ必要があります。 詳しくは、シングルコア Premium プランの選択に関する記事をご覧ください。
  5. [Next:監視] を選択します。 [監視] ページで、次の設定を入力します。

    設定 提案された値 説明
    Application Insights Default 最も近いサポートされているリージョン内に同じアプリ名の Application Insights リソースを作成します。 この設定を展開することによって、 [新しいリソース名] を変更するか、データを格納する Azure 地域内の別の場所を選択することができます。
  6. [確認および作成] を選択して、アプリ構成の選択内容を確認します。

  7. [確認および作成] ページで設定を確認して、 [作成] を選択し、関数アプリをプロビジョニングしてデプロイします。

  8. ポータルの右上隅の [通知] アイコンを選択し、"デプロイメントに成功しました" というメッセージが表示されるまで待ちます。

  9. [リソースに移動] を選択して、新しい関数アプリを確認します。 また、 [ダッシュボードにピン留めする] を選択することもできます。 ピン留めすると、ダッシュボードからこの関数アプリ リソースに戻るのが容易になります。

    Deployment notification

Function App を仮想ネットワークに接続する

これで、関数アプリを仮想ネットワークに接続できるようになりました。

  1. 関数アプリで左側のメニューの [ネットワーク] を選択し、 [VNet 統合][ここをクリックして構成] を選択します。

    Choose networking in the function app

  2. [VNET 統合] ページで、 [VNet の追加] を選択します。

  3. [ネットワーク機能の状態] で、画像の下にある表の設定を使用します。

    Define the function app virtual network

    設定 提案された値 説明
    Virtual Network MyResourceGroup-vnet この仮想ネットワークは前に作成したものです。
    サブネット 新しいサブネットを作成します 使用する Function App 用の仮想ネットワークにサブネットを作成します。 VNet 統合は、空のサブネットを使用するように構成する必要があります。
    サブネット名 Function-Net 新しいサブネットの名前です。
    仮想ネットワーク アドレス ブロック 10.10.0.0/16 1 つのアドレス ブロックだけを定義してください。
    サブネット アドレス ブロック 10.10.2.0/24 サブネット サイズは、Premium プランの Function App がスケールアウトできるインスタンスの合計数を制限します。 この例では、254 のホスト アドレスが使用可能な /24 サブネットを使用します。 このサブネットはオーバープロビジョニングされていますが、計算は簡単です。
  4. [OK] を選択して、サブネットを追加します。 [VNet 統合] ページおよび [ネットワーク機能の状態] ページを閉じ、Function App のページに戻ります。

関数アプリから仮想ネットワークにアクセスできるようになりました。 接続が有効になっている場合、vnetrouteallenabled サイト設定は 1 に設定されます。 このサイト設定またはレガシ WEBSITE_VNET_ROUTE_ALL アプリケーション設定を 1 に設定する必要があります。

次に、HTTP によってトリガーされる関数を関数アプリに追加します。

HTTP トリガー関数の作成

  1. [関数] ウィンドウの左側のメニューで、 [関数] を選択し、上部のメニューから [追加] を選択します。

  2. [新しい関数] ウィンドウで、 [Http トリガー] を選択し、 [新しい関数] の既定の名前を受け入れるか、新しい名前を入力します。

  3. [Code + Test](コード + テスト) で、テンプレートによって生成された C# スクリプト (.csx) コードを次のコードに置き換えます。

    #r "Newtonsoft.Json"
    
    using System.Net;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Primitives;
    using Newtonsoft.Json;
    
    public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");
    
        var client = new HttpClient();
        var response = await client.GetAsync(@"https://ifconfig.me");
        var responseMessage = await response.Content.ReadAsStringAsync();
    
        return new OkObjectResult(responseMessage);
    }
    

    このコードは、呼び出し元 (この例ではこの関数) の IP アドレスを返す外部 Web サイトを呼び出します。 この方法では、関数アプリによって使用されている送信 IP アドレスを簡単に確認できます。

これで、関数を実行し、現在の送信 IP を確認する準備ができました。

現在の送信 IP を確認する

これで、関数を実行できるようになりました。 ただし、まずはポータルにチェックインし、関数アプリによってどの送信 IP が使用されているかを確認します。

  1. 自分の関数アプリで、 [プロパティ] を選択し、 [送信 IP アドレス] フィールドを確認します。

    View function app outbound IP addresses

  2. 次に、HTTP トリガー関数に戻り、 [Code + Test](コード + テスト)[Test/Run](テスト/実行) の順に選択します。

    Test function

  3. [実行] を選択して関数を実行し、 [出力] に切り替えます。

    Test function output

  4. HTTP 応答本文の IP アドレスが、前に表示した送信 IP アドレスの値のうちの 1 つであることを確認します。

これで、パブリック IP を作成し、NAT ゲートウェイを使用してこの送信 IP アドレスを変更できるようになりました。

パブリック IP を作成する

  1. 自分のリソース グループで [追加] を選択し、Azure Marketplace で [パブリック IP アドレス] を検索して、 [作成] を選択します。 画像の下の表に示した設定を使用してください。

    Create Public IP Address

    設定 推奨値
    IP バージョン IPv4
    SKU Standard
    レベル 地域
    名前 Outbound-IP
    サブスクリプション 自分のサブスクリプションが表示されていることを確認します
    リソース グループ myResourceGroup (または自分がリソース グループに割り当てた名前)
    場所 米国東部 (または他のリソースに割り当てた場所)
    可用性ゾーン ゾーンなし
  2. [作成] を選択してデプロイを送信します。

  3. デプロイが完了したら、新しく作成されたパブリック IP アドレス リソースに移動し、 [概要] で IP アドレスを確認します。

    View Public IP Address

NAT ゲートウェイの作成

次に、NAT ゲートウェイを作成しましょう。 前の仮想ネットワークのチュートリアルから始めた場合、そのチュートリアルで推奨されたサブネット名は Function-Net であり、推奨された仮想ネットワーク名は MyResourceGroup-vnet でした。

  1. 自分のリソース グループで [追加] を選択し、Azure Marketplace で [NAT ゲートウェイ] を検索して、 [作成] を選択します。 図の下の表の設定を使用して、 [基本] タブに値を指定します。

    Create NAT gateway

    設定 推奨値
    サブスクリプション 該当するサブスクリプション
    リソース グループ myResourceGroup (または自分がリソース グループに割り当てた名前)
    NAT ゲートウェイ名 myNatGateway
    リージョン 米国東部 (または他のリソースに割り当てた場所)
    可用性ゾーン なし
  2. [次へ: 送信 IP] を選択します。 [パブリック IP アドレス] フィールドで、前に作成したパブリック IP アドレスを選択します。 [パブリック IP プレフィックス] は、選択しないままにしておきます。

  3. [次へ: サブネット] を選択します。 [仮想ネットワーク] フィールドの myResourceGroup-vnet リソースと、サブネット Function-Net を選択します。

    Select subnet

  4. [確認および作成][作成] の順に選択し、デプロイを送信します。

デプロイが完了すると、NAT ゲートウェイは、関数アプリのサブネットからインターネットにトラフィックをルーティングできるようになります。

新しい送信 IP を確認する

前の手順を繰り返して、関数を再度実行します。 これで、NAT で構成した送信 IP アドレスが、関数の出力に表示されるようになったはずです。

リソースをクリーンアップする

このチュートリアルを完了するためにリソースを作成しました。 これらのリソースには、アカウントの状態サービスの価格に応じて課金されます。 追加のコストが発生しないようにするには、リソースが不要になったときに削除します。

  1. Azure Portal で、 [リソース グループ] ページに移動します。

    関数アプリ ページからこのページに移動するには、[概要] タブを選択し、[リソース グループ] の下にあるリンクを選択します。

    Screenshot that shows select the resource group to delete from the function app page.

    ダッシュボードからこのページに移動するには、 [リソース グループ] を選択してから、この記事用に使用したリソース グループを選択します。

  2. [リソース グループ] ページで、含まれているリソースの一覧を確認し、削除するものであることを確認します。

  3. [リソース グループの削除] を選択し、指示に従います。

    削除には数分間かかることがあります。 実行されると、通知が数秒間表示されます。 ページの上部にあるベルのアイコンを選択して、通知を表示することもできます。

次のステップ