チュートリアル: プライベート エンドポイントを使用して Azure Functions を Azure 仮想ネットワークに統合する

このチュートリアルでは、Azure Functions を使用して Azure 仮想ネットワーク内のリソースに、プライベート エンドポイントを使用して接続する方法について説明します。 Azure portal で、仮想ネットワークの背後にあるロックされた新しいストレージ アカウントを使用して新しい関数アプリを作成します。 仮想ネットワークでは、サービス バス キュー トリガーが使用されます。

このチュートリアルでは、次のことについて説明します。

  • 仮想ネットワークの統合とプライベート エンドポイントを使用して、Elastic Premium プランで関数アプリを作成する。
  • Service Bus などの Azure リソースを作成する。
  • プライベート エンドポイントの背後にあるサービス バスをロック ダウンする。
  • サービス バスと HTTP の両方のトリガーを使用する関数アプリをデプロイする。
  • 関数アプリが仮想ネットワークの内部でセキュリティ保護されているかどうかをテストする。
  • リソースをクリーンアップする。

Premium プランの 関数アプリ を作成する

C# 関数アプリを Elastic Premium プランで作成します。このプランを使用すると、サーバーレス スケールと共に、作成時の仮想ネットワークの統合などのネットワーク機能がサポートされます。 このチュートリアルでは、C# と Windows を使用します。 他の言語と Linux もサポートされています。

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

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

  3. [基本] ページで、下の表を使用して関数アプリの設定を構成します。

    設定 提案された値 説明
    サブスクリプション 該当するサブスクリプション この新しい関数アプリが作成されるサブスクリプション。
    リソース グループ myResourceGroup 関数アプリを作成する新しいリソース グループの名前。
    関数アプリ名 グローバルに一意の名前 新しい関数アプリを識別する名前。 有効な文字は、a-z (大文字と小文字の区別をしない)、0-9、および -です。
    発行 コード コード ファイルまたは Docker コンテナーの発行を選択します。
    ランタイム スタック .NET このチュートリアルでは、.NET を使用します。
    バージョン 6 (LTS) このチュートリアルでは、Functions ホストと同じプロセスで実行されている .NET 6.0 を使用します。
    リージョン 優先リージョン ユーザー、または関数がアクセスする他のサービスに近いリージョンを選択します。
    オペレーティング システム Windows このチュートリアルでは Windows を使用しますが、Linux にも対応します。
    プラン Functions Premium 関数アプリ にどのようにリソースが割り当てられるかを定義するホスティング プラン。 既定では、Premium を選択すると、新しい App Service プランが作成されます。 既定の SKU とサイズEP1 です。ここで、EP は "エラスティック Premium" を表します。 詳細については、Premium SKU の一覧を参照してください。

    Premium プランで JavaScript 関数を実行する場合は、vCPU の少ないインスタンスを選んでください。 詳しくは、シングルコア Premium プランの選択に関する記事をご覧ください。
  4. [Next:Storage](次へ: ストレージ) を選択します。 [ストレージ] ページで、次の設定を入力します。

    設定 提案された値 説明
    ストレージ アカウント グローバルに一意の名前 関数アプリ で使用されるストレージ アカウントを作成します。 ストレージ アカウント名の長さは 3 から 24 文字でなければなりません。 数字と小文字のみを含めることができます。 また、ファイアウォール規則によって制限されていない、ストレージ アカウントの要件を満たす既存のアカウントも使用できます。 ロックダウンされたストレージ アカウントで Functions を使用する場合は、v2 ストレージ アカウントが必要です。 これは、[作成] ブレードを使用してネットワーク機能を備えた関数アプリを作成するときに作成される、既定のストレージ バージョンです。
  5. [次へ: ネットワーク] を選択します。 [ネットワークの種類] ページで、次の設定を入力します。

    Note

    これらの設定のうち、一部は他のオプションが選択されるまで表示されません。

    設定 提案された値 説明
    パブリック アクセスを有効にする オフ パブリック ネットワーク アクセスを拒否すると、プライベート エンドポイントからのトラフィックを除くすべての受信トラフィックがブロックされます。
    ネットワーク インジェクションを有効にする オン このオプションを [オン] に切り替えると、作成時に VNet の統合を使用してアプリケーションを構成する機能がポータル ウィンドウに表示されます。
    Virtual Network 新規作成 [新規作成] フィールドを選択します。 ポップアウト画面で、仮想ネットワークの名前を指定し、[OK] を選択します。 作成時に関数アプリに対する受信および送信アクセスを制限するオプションが表示されます。 送信アクセスを制限するには、ウィンドウの送信アクセスの部分で VNet の統合を明示的に有効にする必要があります。

    [Inbound access] (受信アクセス) セクションに次の設定を入力します。 この手順で、関数アプリにプライベート エンドポイントを作成します。

    ヒント

    引き続きポータルから関数アプリを操作するには、ローカル コンピューターを仮想ネットワークに追加する必要があります。 受信アクセスを制限しない場合は、この手順をスキップします。

    設定 提案された値 説明
    プライベート エンドポイントを有効にする オン このオプションを有効にすると、作成時に VNet の統合を使用してアプリケーションを構成する機能がポータルに表示されます。
    プライベート エンドポイント名 myInboundPrivateEndpointName 新しい関数アプリのプライベート エンドポイントを識別する名前。
    受信サブネット 新規作成 このオプションを使って、受信プライベート エンドポイント用の新しいサブネットを作成します。 単一のサブネットに複数のプライベー ト エンドポイントを追加できます。 サブネット名を指定します。 サブネット アドレス ブロックは既定値のままでかまいません。 [OK] を選択します。 サブネットのサイズ設定の詳細については、「サブネット」を参照してください。
    DNS Azure プライベート DNS ゾーン この値は、プライベート エンドポイントで使用する DNS サーバーを示します。 ほとんどのケースでは、Azure 内で作業している場合、Azure プライベート DNS ゾーンは使用する必要がある DNS ゾーンです。カスタム DNS ゾーンに [手動] を使用すると、複雑さが増すためです。

    [Outbound access] (送信アクセス) セクションに次の設定を入力します。 この手順で、作成時に関数アプリを仮想ネットワークに統合します。 また、この手順を行うと、ストレージ アカウントにプライベート エンドポイントを作成するオプションと、作成時にストレージ アカウントへのネットワーク アクセスを制限するオプションも表示されます。 関数アプリが VNet に統合されると、既定ではすべての送信トラフィックが VNet を経由します。

    設定 提案された値 説明
    Enable VNet Integration (VNet 統合を有効にする) オン この設定を使って、作成時に関数アプリを VNet に統合し、すべての送信トラフィックが VNet を介して送信されるようにします。
    送信サブネット 新規作成 これで、関数アプリの VNet の統合用の新しいサブネットが作成されます。 関数アプリは、空のサブネットを使用する場合のみ VNet に統合できます。 サブネット名を指定します。 サブネット アドレス ブロックは既定値のままでかまいません。 構成する場合は、サブネットのサイズ設定の詳細を確認してください。 [OK] を選択します。 ストレージ プライベート エンドポイントを作成するオプションが表示されます。 仮想ネットワークで関数アプリを使用するには、それをサブネットに参加させる必要があります。

    [ストレージ プライベート エンドポイント] セクションに次の設定を入力します。 この手順で、作成時にストレージ アカウントで BLOB、キュー、ファイル、テーブル エンドポイント用のプライベート エンドポイントを作成します。 こうすると、ストレージ アカウントを効果的に VNet と統合できます。

    設定 提案された値 説明
    ストレージ プライベート エンドポイントの追加 オン このオプションを有効にすると、作成時に VNet の統合を使用してアプリケーションを構成する機能がポータルに表示されます。
    プライベート エンドポイント名 myInboundPrivateEndpointName ストレージ アカウントのプライベート エンドポイントを識別する名前。
    プライベート エンドポイントのサブネット 新規作成 これを使って、ストレージ アカウントで受信プライベート エンドポイント用の新しいサブネットを作成します。 単一のサブネットに複数のプライベー ト エンドポイントを追加できます。 サブネット名を指定します。 サブネット アドレス ブロックは既定値のままでかまいません。 構成する場合は、サブネットのサイズ設定の詳細を確認してください。 [OK] を選択します。
    DNS Azure プライベート DNS ゾーン この値は、プライベート エンドポイントで使用する DNS サーバーを示します。 ほとんどのケースでは、Azure 内で作業している場合、Azure プライベート DNS ゾーンは使用する必要がある DNS ゾーンです。カスタム DNS ゾーンに [手動] を使用すると、複雑さが増すためです。
  6. [Next:監視] を選択します。 [監視] ページで、次の設定を入力します。

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

  8. [確認と作成] ページで、設定を確認します。 次に、[作成] を選択して、関数アプリを作成し、デプロイします。

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

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

おめでとうございます。 これで、Premium 版の関数アプリを作成できました。

注意

一部のデプロイでは、"StorageAccountOperationInProgress" というエラーでストレージ アカウントにプライベート エンドポイントを作成できないことがあります。 このエラーは、関数アプリ自体が正常に作成された場合でも発生します。 このようなエラーが発生した場合は、関数アプリを削除して、操作を再試行します。 代わりに、手動でストレージ アカウントにプライベート エンドポイントを作成することもできます。

Service Bus の作成

次に、このチュートリアルでは、関数アプリのネットワーク機能の機能性をテストするために使用する、Service Bus インスタンスを作成します。

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

  2. [新規] ページで、「サービス バス」を検索します。 [作成] を選択します。

  3. [基本] タブで、次の表を使用してサービス バスの設定を構成します。 その他の設定はすべて、既定値を使用できます。

    設定 提案された値 説明
    サブスクリプション 該当するサブスクリプション リソースが作成されるサブスクリプション。
    リソース グループ myResourceGroup 関数アプリで作成したリソース グループ。
    名前空間名 myServiceBus プライベート エンドポイントが有効になっている Service Bus インスタンスの名前。
    場所 myFunctionRegion 関数アプリを作成したリージョン。
    価格レベル Premium Azure Service Bus でプライベート エンドポイントを使用するには、このレベルを選択します。
  4. [Review + create](レビュー + 作成) を選択します。 検証が終了したら、 [作成] を選択します。

サービス バスをロック ダウンする

サービス バスをロック ダウンするためのプライベート エンドポイントを作成します。

  1. 新しいサービス バスで、左側のメニューの [ネットワーク] を選択します。

  2. [プライベート エンドポイント接続] タブで、 [プライベート エンドポイント] を選択します。

    Screenshot of how to go to private endpoints for the Service Bus.

  3. [基本] タブで、次の表に示すプライベート エンドポイント設定を使用します。

    設定 提案された値 説明
    サブスクリプション 該当するサブスクリプション リソースが作成されるサブスクリプション。
    リソース グループ myResourceGroup 関数アプリで作成したリソース グループ。
    名前 sb-endpoint サービス バスのプライベート エンドポイントの名前。
    リージョン myFunctionRegion ストレージ アカウントを作成したリージョン。
  4. [リソース] タブで、次の表に示すプライベート エンドポイント設定を使用します。

    設定 提案された値 説明
    サブスクリプション 該当するサブスクリプション リソースが作成されるサブスクリプション。
    リソースの種類 Microsoft.ServiceBus/namespaces サービス バスのリソースの種類。
    リソース myServiceBus チュートリアルで作成した Service Bus。
    ターゲット サブリソース namespace Service Bus の名前空間に使用されるプライベート エンドポイント。
  5. [仮想ネットワーク] タブで、[サブネット] 設定に [既定値] を選択します。

  6. [Review + create](レビュー + 作成) を選択します。 検証が終了したら、 [作成] を選択します。

  7. プライベート エンドポイントが作成されたら、Service Bus 名前空間の [ネットワークの種類] セクションに戻り、[パブリック アクセス] タブを確認します。

  8. 選択したネットワークが確実に選択されているようにします。

  9. [+ 既存の仮想ネットワークの追加] を選択 して、最近作成した仮想ネットワークを追加します。

  10. [ネットワークの追加] タブで、次の表のネットワーク設定を使用します。

    設定 提案された値 説明
    サブスクリプション 該当するサブスクリプション リソースが作成されるサブスクリプション。
    仮想ネットワーク myVirtualNet 関数アプリの接続先となる仮想ネットワークの名前。
    サブネット functions 関数アプリの接続先となるサブネットの名前。
  11. 現在のクライアント IP にその名前空間へのアクセスを許可するには、 [クライアント IP アドレスを追加する] を選択します。

    Note

    クライアント IP アドレスの許可は、このチュートリアルの後半でキューにメッセージを Azure portal が発行できるようにするために必要です。

  12. [有効にする] を選択して、サービス エンドポイントを有効にします。

  13. [追加] を選択して、選択した仮想ネットワークとサブネットをサービス バスのファイアウォール規則に追加します。

  14. [保存] を選択して、更新したファイアウォール規則を保存します。

仮想ネットワーク内のリソースは、プライベート エンドポイントを使用してサービス バスと通信できるようになりました。

キューを作成する

Azure Functions Service Bus トリガーでイベントが取得されるキューを作成します。

  1. サービス バスの左側のメニューで、 [キュー] を選択します。

  2. [キュー] を選択します。 このチュートリアルでは、新しいキューの名前 として名前 キューを指定することが目的です。

    Screenshot of how to create a Service Bus queue.

  3. [作成] を選択します

サービス バスの接続文字列を取得する

  1. サービス バスで、左側のメニューの [共有アクセス ポリシー] を選択します。

  2. [RootManageSharedAccessKey] を選択します。 [プライマリ接続文字列] をコピーして保存します。 この接続文字列は、アプリ設定を構成するときに必要になります。

    Screenshot of how to get a Service Bus connection string.

関数アプリの設定を構成する

  1. 関数アプリの左側のメニューで、 [構成] を選択します。

  2. 仮想ネットワークとサービス バスで関数アプリを使用するには、次の表に示すアプリ設定を更新します。 設定を追加または編集するには、 [+ 新しいアプリケーション設定] 、またはアプリ設定の表の右端の列にある [編集] アイコンを選択します。 終了したら、 [保存] を選択します。

    設定 提案された値 説明
    SERVICEBUS_CONNECTION myServiceBusConnectionString サービス バスの接続文字列に、このアプリ設定を作成します。 このストレージの接続文字列は、「サービス バスの接続文字列を取得する」セクションのものです。
    WEBSITE_CONTENTOVERVNET 1 このアプリ設定を作成します。 値 1 を指定すると、ストレージ アカウントを仮想ネットワークに制限している場合に、関数アプリをスケーリングできます。
  3. Elastic Premium ホスティング プランを使用しているので、[構成] ビューで [関数のランタイム設定] タブを選択します。[Runtime Scale Monitoring] (ランタイム スケールの監視)[オン] に設定します。 次に、 [保存] を選択します。 ランタイム駆動型のスケーリングを使用すると、仮想ネットワーク内で実行されているサービスに非 HTTP トリガー関数を接続できます。

    Screenshot of how to enable runtime-driven scaling for Azure Functions.

Note

専用 App Service プランでホストされている関数アプリでは、ランタイム スケールは必要ありません。

サービス バス トリガーと HTTP トリガーをデプロイする

Note

関数アプリでプライベート エンドポイントを有効にすると、ソース管理マネージャー (SCM) サイトもパブリックにはアクセスできなくなります。 以下に示したのは、関数アプリ内からデプロイ センターを使用してデプロイする手順です。 代わりに、仮想ネットワーク上のサブネットにデプロイされるセルフホステッド エージェントまたは ZIP デプロイを使用してください。

  1. GitHub で、次のサンプル リポジトリにアクセスします。 これには、関数アプリと 2 つの関数、HTTP トリガー、およびサービス バス キュー トリガーが含まれています。

    https://github.com/Azure-Samples/functions-vnet-tutorial

  2. ページの上部で、 [フォーク] を選択して、独自の GitHub アカウントまたは組織にこのリポジトリのフォークを作成します。

  3. 関数アプリの左側のメニューで、 [デプロイ センター] を選択します。 次に、 [設定] を選択します。

  4. [設定] タブで、次の表に示すデプロイ設定を使用します。

    設定 提案された値 説明
    ソース GitHub 手順 2 のサンプル コードに GitHub リポジトリを作成しておく必要があります。
    組織 myOrganization リポジトリがチェックインされる組織。 通常は自分のアカウントです。
    リポジトリ functions-vnet-tutorial https://github.com/Azure-Samples/functions-vnet-tutorial からフォークされたリポジトリ。
    ブランチ メイン 作成したリポジトリのメイン ブランチ。
    ランタイム スタック .NET サンプル コードは C# で作成されています。
    [バージョン] .NET Core 3.1 ランタイム バージョン。
  5. [保存] を選択します。

    Screenshot of how to deploy Azure Functions code through the portal.

  6. 最初のデプロイには数分かかる場合があります。 アプリが正常にデプロイされると、 [ログ] タブに [成功 (アクティブ)] のステータス メッセージが表示されます。 必要に応じて、ページを更新してください。

おめでとうございます。 サンプルの関数アプリが正常にデプロイされました。

ロック ダウンした関数アプリをテストする

  1. 関数アプリの左側のメニューで、 [Functions] を選択します。

  2. [ServiceBusQueueTrigger] を選択します。

  3. 左側のメニューで [監視] を選択します。

アプリを監視できないことがわかります。 お使いのブラウザーが仮想ネットワークにアクセスできず、仮想ネットワーク内のリソースに直接アクセスできないためです。

Application Insights を使用して関数を監視する別の方法を次に示します。

  1. 関数アプリの左側のメニューで、 [Application Insights] を選択します。 次に、 [Application Insights データの表示] を選択します。

    Screenshot of how to view application insights for a function app.

  2. 左側のメニューで [Live metrics] を選択します。

  3. 新しいタブを開きます。サービス バスの左側のメニューで、 [キュー] を選択します。

  4. キューを選択します。

  5. 左側のメニューで、 [Service Bus Explorer] を選択します。 [送信][コンテンツ タイプ] で、 [Text/Plain] を選択します。 次に、メッセージを入力します。

  6. [送信] を選択してメッセージを送信します。

    Screenshot of how to send Service Bus messages by using the portal.

  7. [Live metrics] タブに、サービス バス キュー トリガーが起動したことが表示されます。 確認できない場合は、 [Service Bus Explorer] からメッセージを再送信します。

    Screenshot of how to view messages by using live metrics for function apps.

お疲れさまでした。 これで、プライベート エンドポイントを使用した関数アプリの設定のテストが成功しました。

プライベート DNS ゾーンについて

プライベート エンドポイントを使用して Azure リソースに接続しました。 パブリック エンドポイントではなく、プライベート IP アドレスに接続しています。 既存の Azure サービスは、既存の DNS を使用してパブリック エンドポイントに接続するように構成されています。 プライベート エンドポイントに接続するには、DNS 構成を上書きする必要があります。

プライベート DNS ゾーンは、プライベート エンドポイントで構成された各 Azure リソースに対して作成されています。 DNS レコードは、プライベート エンドポイントに関連付けられているプライベート IP アドレスごとに作成されます。

このチュートリアルでは、次の DNS ゾーンを作成しました。

  • privatelink.file.core.windows.net
  • privatelink.blob.core.windows.net
  • privatelink.servicebus.windows.net
  • privatelink.azurewebsites.net

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

前の手順では、リソース グループ内に Azure リソースを作成しました。 これらのリソースが将来必要になると思わない場合は、リソース グループを削除してリソースを削除できます。

Azure portal メニューまたは [ホーム] ページから、 [リソース グループ] を選択します。 次に、 [リソース グループ] ページで [myResourceGroup] を選択します。

[myResourceGroup] ページで、一覧表示されたリソースが、削除しようとするリソースであることを確認します。

[リソース グループの削除] を選択し、確認のためテキスト ボックスに「myResourceGroup」と入力して、 [削除] を選択します。

次のステップ

このチュートリアルでは、Premium 関数アプリ、ストレージ アカウント、およびサービス バスを作成しました。 これらのリソースをすべて、プライベート エンドポイントの背後でセキュリティ保護しました。

ネットワーク オプションとプライベート エンドポイントの詳細については次のリンクを参照してください。