😸

Azure Functions で VNET 統合する方法

2023/09/01に公開1

Azure Functions のアプリから仮想ネットワーク内のリソースにアクセスできるようにするためには、Azure Functions で Virtual Network 統合 (VNET 統合) が必要です。
VNET 統合を使用するユースケースとしては、例えば、以下のようなものが挙げられます。

  • Service Bus に対して Public アクセスを不許可とし、Private Endpoint 経由でのみアクセスを許可する (下図: Azure Functions → 赤色矢印の通信) 。
  • Azure Functions の設定ファイルが配置されている Azure Storage Account に対して、Public アクセスを不許可とし、Private Endpoint 経由でのみアクセスを許可する (下図: Azure Functions → 緑色矢印の通信) 。
    architecture

仮想ネットワーク統合とは?

アプリから仮想ネットワーク内のリソースにアクセスできるようにするための機能です。しかし、公開ドキュメントの中でも口酸っぱく記述されているように、仮想ネットワークからそのアプリへの受信プライベートアクセスが許可されるわけではありません。あくまで、送信側のネットワークを制御するための機能です。

仮想ネットワーク統合を使用するためのホスティング方法

Azure Functions のホスティング方法としては、様々な方法がございます。

  • マルチテナント
    • 従量課金プラン: 負荷に応じて動的なスケーリングが行われ、最小限のネットワークの分離オプションが提供されます。
    • Premium プラン: 動的なスケーリングが行われますが、より包括的なネットワークの分離が提供されます。
    • App Service プラン: 固定されたスケールで動作し、Premium プランと同様のネットワークの分離が提供されます。
  • シングルテナント
    • App Service Environment (ASE): 関数を仮想ネットワークにデプロイし、完全なネットワーク制御と分離を提供します。

これらのホスティング方法のうち、マルチテナントの従量課金プランでは、仮想ネットワーク統合の機能が利用できません。そのため、仮想ネットワーク統合を実施した場合は、Premium プラン、専用プラン、ASE を利用する必要があります。
netowrk-matrix

仮想ネットワーク統合の種類

仮想ネットワーク統合機能には 2 つのバリエーションがあります。

  • リージョン仮想ネットワーク統合: 同じリージョン内の仮想ネットワークに接続するときは、統合する仮想ネットワークに専用のサブネットが必要です。
  • ゲートウェイが必要な仮想ネットワーク統合: 他のリージョン内の仮想ネットワークまたはリージョン内のクラシック仮想ネットワークに直接接続する場合、ターゲットの仮想ネットワークに作成された Azure Virtual Network ゲートウェイが必要です。

本記事では以下のアーキテクチャのものを Azure Portal より作成 (再掲)

architecture

1. Virtual Network の作成

任意の名前の仮想ネットワークを作成していきます。
また、仮想ネットワークを作成する際に、ついでに以下の 3 つのサブネットを作成します。

  • Azure Functions の仮想ネットワーク統合用のサブネット (vnet-integration-subnet)
  • ストレージアカウントのプライベートエンドポイント用のサブネット (storageaccount-pep-subnet)
  • Service Bus のプライベートエンドポイント用のサブネット (servicebus-pep-subnet)

virtualnetwork-subnet-info

2. Premium プランの関数アプリの作成

Functions Premium ホスティングプランで、任意の名前の関数アプリを作成します。
基本設定タブでは、下記のように設定します。

設定名
関数アプリ名 任意の名前
コードまたはコンテナイメージをデプロイしますか? コード
ランタイムスタック .NET
バージョン 6 (LST)
地域 Japan East
オペレーティングシステム Windows
ホスティングオプションとプラン Functions Premium
Windowsプラン (Japan East) 任意の名前
価格プラン エラスティック Premium EP1
ゾーン冗長 無効

functions-basic-info

Storage 設定タブでは、下記のような設定にします。

設定名
ストレージアカウント 任意の名前

functions-storage-info

ネットワーク設定タブでは、下記のような設定にします。

設定名
パブリックアクセスを有効にする オン (今回は関数アプリの受信設定については特に言及しない)
ネットワーク インジェクションを有効にする オン
仮想ネットワーク 「1. Virtual Network の作成」セクションで作成したもの
VNet 統合を有効にする オン
送信サブネット vnet-integration-subnet (「1. Virtual Network の作成」セクションで作成したもの)
ストレージプライベートエンドポイントの追加 オン
プライベートエンド名 任意の名前
プライベートエンドポイントのサブネット storageaccount-pep-subnet (「1. Virtual Network の作成」セクションで作成したもの)
DNS Azure プライベート DNS ゾーン

functions-network-info

3. Service Bus の作成

基本設定タブでは、下記のような設定にします。

設定名
名前空間の名前 任意の名前
場所 Japan East
価格レベル Premium
メッセージングユニット 1

servicebus-basic-info

ネットワークタブの設定は以下の通りです。

設定名
接続方法 プライベートアクセス

また、ついでにプライベートエンドポイントを作成します。

設定名
場所 Japan East
名前 任意の名前
ターゲットサブリソース namespace
仮想ネットワーク 「1. Virtual Network の作成」セクションで作成したもの
サブネット servicebus-pep-subnet
プライベート DNS ゾーンと統合する はい
プライベート DNS ゾーン 任意の名前

servicebus-network-info

Service Bus キュー の作成

Service Bus に queue という名前のキューを作成します。
servicebus-queue-info

4. 関数アプリからサービスバスへの接続設定

アプリケーション設定に、SERVICEBUS_CONNECTION と WEBSITE_CONTENTOVERVNET を作成します。
SERVICEBUS_CONNECTION の値はアプリケーションコードから使用する環境変数になります。一方、WEBSITE_CONTENTOVERVNET は、公開ドキュメントに記載の通り、ストレージアカウントを仮想ネットワークに制限する場合に有効にする必要がある値です。

1 の値を指定すると、ストレージ アカウントを仮想ネットワークに制限している場合に、関数アプリをスケーリングできます。 ストレージ アカウントを仮想ネットワークに制限する場合は、この設定を有効にする必要があります。 詳細については、「ストレージ アカウントを仮想ネットワークに制限する」を参照してください。

Key 値の例
WEBSITE_CONTENTOVERVNET 1

Premium および Dedicated (App Service) プラン (Standard 以上) でサポートされています。 従量課金プランで実行している場合はサポートされません。

アプリケーション設定名
SERVICEBUS_CONNECTION Service Bus の共有アクセスポリシーのプライマリ接続文字列の値
WEBSITE_CONTENTOVERVNET 1

functions-appsettings

"Service Bus の共有アクセスポリシーのプライマリ接続文字列の値" は Service Bus の [共有アクセスポリシー] ブレードより確認できます。

servicebus-namespace-sharedpolicy

5. アプリをデプロイする

Github に本構成に使用可能なアプリケーションコードが Azure Samples として公開されています。
こちらのアプリケーションコードをフォークし、デプロイします。
functions-deploycenter

関数アプリより、関数を確認すると、HttpTrigger と ServiceBusQueueTrigger という名前の関数が作成されます。
ServiceBusQueueTrigger では、名前の通り、トリガーは、"ServiceBusQueueTrigger" です。Service Bus Queue にメッセージが追加されると、ServiceBusQueueTrigger 関数がトリガーされ、メッセージの内容をログとして記録するというアプリケーションです。
functions-contents

6. 実際に Service Bus にメッセージを追加し、Functions がメッセージの内容をログとして記録するかのテスト

Service Bus はインターネットからのアクセスが禁止され、プライベートエンドポイント経由のみのアクセスが可能となっています。
今回はテストのために一時的に自身のネットワークのクライアント IP アドレスからのアクセスを許可します。
servicebus-network-update

作成した Service Bus キュー の [Service Bus エクスプローラー] ブレード より、任意のメッセージをキューに追加します。今回の場合は、「hello tya」というメッセージを送信しました。
servicebus-test

Azure Functions の [ログ] ブレード より、ログを確認します。Service Bus キューに追加した「hello tya」というメッセージが記録されていることがわかります。
servicebus-log

まとめ

仮想ネットワーク統合は送信側のネットワークを制御するための機能です。仮想ネットワーク統合することで、関数アプリから仮想ネットワーク内のリソースにアクセスできるようになります。Azure Functions の従量課金プランでは、仮想ネットワーク統合の機能は使用できないので、ネットワーク制御をしたい際には気を付ける必要があります。

(参考画像では作成したリソースをモザイクかけていますが、既に今回作成したリソースは削除済みです)

参考情報

Discussion

yamapanyamapan

Vnet統合周りの操作イメージの概要がつかめて助かりました!