Azure Functions で VNET 統合する方法
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 → 緑色矢印の通信) 。
仮想ネットワーク統合とは?
アプリから仮想ネットワーク内のリソースにアクセスできるようにするための機能です。しかし、公開ドキュメントの中でも口酸っぱく記述されているように、仮想ネットワークからそのアプリへの受信プライベートアクセスが許可されるわけではありません。あくまで、送信側のネットワークを制御するための機能です。
仮想ネットワーク統合を使用するためのホスティング方法
Azure Functions のホスティング方法としては、様々な方法がございます。
- マルチテナント
- 従量課金プラン: 負荷に応じて動的なスケーリングが行われ、最小限のネットワークの分離オプションが提供されます。
- Premium プラン: 動的なスケーリングが行われますが、より包括的なネットワークの分離が提供されます。
- App Service プラン: 固定されたスケールで動作し、Premium プランと同様のネットワークの分離が提供されます。
- シングルテナント
- App Service Environment (ASE): 関数を仮想ネットワークにデプロイし、完全なネットワーク制御と分離を提供します。
これらのホスティング方法のうち、マルチテナントの従量課金プランでは、仮想ネットワーク統合の機能が利用できません。そのため、仮想ネットワーク統合を実施した場合は、Premium プラン、専用プラン、ASE を利用する必要があります。
仮想ネットワーク統合の種類
仮想ネットワーク統合機能には 2 つのバリエーションがあります。
- リージョン仮想ネットワーク統合: 同じリージョン内の仮想ネットワークに接続するときは、統合する仮想ネットワークに専用のサブネットが必要です。
- ゲートウェイが必要な仮想ネットワーク統合: 他のリージョン内の仮想ネットワークまたはリージョン内のクラシック仮想ネットワークに直接接続する場合、ターゲットの仮想ネットワークに作成された Azure Virtual Network ゲートウェイが必要です。
本記事では以下のアーキテクチャのものを Azure Portal より作成 (再掲)
1. Virtual Network の作成
任意の名前の仮想ネットワークを作成していきます。
また、仮想ネットワークを作成する際に、ついでに以下の 3 つのサブネットを作成します。
- Azure Functions の仮想ネットワーク統合用のサブネット (vnet-integration-subnet)
- ストレージアカウントのプライベートエンドポイント用のサブネット (storageaccount-pep-subnet)
- Service Bus のプライベートエンドポイント用のサブネット (servicebus-pep-subnet)
2. Premium プランの関数アプリの作成
Functions Premium ホスティングプランで、任意の名前の関数アプリを作成します。
基本設定タブでは、下記のように設定します。
設定名 | 値 |
---|---|
関数アプリ名 | 任意の名前 |
コードまたはコンテナイメージをデプロイしますか? | コード |
ランタイムスタック | .NET |
バージョン | 6 (LST) |
地域 | Japan East |
オペレーティングシステム | Windows |
ホスティングオプションとプラン | Functions Premium |
Windowsプラン (Japan East) | 任意の名前 |
価格プラン | エラスティック Premium EP1 |
ゾーン冗長 | 無効 |
Storage 設定タブでは、下記のような設定にします。
設定名 | 値 |
---|---|
ストレージアカウント | 任意の名前 |
ネットワーク設定タブでは、下記のような設定にします。
設定名 | 値 |
---|---|
パブリックアクセスを有効にする | オン (今回は関数アプリの受信設定については特に言及しない) |
ネットワーク インジェクションを有効にする | オン |
仮想ネットワーク | 「1. Virtual Network の作成」セクションで作成したもの |
VNet 統合を有効にする | オン |
送信サブネット | vnet-integration-subnet (「1. Virtual Network の作成」セクションで作成したもの) |
ストレージプライベートエンドポイントの追加 | オン |
プライベートエンド名 | 任意の名前 |
プライベートエンドポイントのサブネット | storageaccount-pep-subnet (「1. Virtual Network の作成」セクションで作成したもの) |
DNS | Azure プライベート DNS ゾーン |
3. Service Bus の作成
基本設定タブでは、下記のような設定にします。
設定名 | 値 |
---|---|
名前空間の名前 | 任意の名前 |
場所 | Japan East |
価格レベル | Premium |
メッセージングユニット | 1 |
ネットワークタブの設定は以下の通りです。
設定名 | 値 |
---|---|
接続方法 | プライベートアクセス |
また、ついでにプライベートエンドポイントを作成します。
設定名 | 値 |
---|---|
場所 | Japan East |
名前 | 任意の名前 |
ターゲットサブリソース | namespace |
仮想ネットワーク | 「1. Virtual Network の作成」セクションで作成したもの |
サブネット | servicebus-pep-subnet |
プライベート DNS ゾーンと統合する | はい |
プライベート DNS ゾーン | 任意の名前 |
Service Bus キュー の作成
Service Bus に queue という名前のキューを作成します。
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 |
"Service Bus の共有アクセスポリシーのプライマリ接続文字列の値" は Service Bus の [共有アクセスポリシー] ブレードより確認できます。
5. アプリをデプロイする
Github に本構成に使用可能なアプリケーションコードが Azure Samples として公開されています。
こちらのアプリケーションコードをフォークし、デプロイします。
関数アプリより、関数を確認すると、HttpTrigger と ServiceBusQueueTrigger という名前の関数が作成されます。
ServiceBusQueueTrigger では、名前の通り、トリガーは、"ServiceBusQueueTrigger" です。Service Bus Queue にメッセージが追加されると、ServiceBusQueueTrigger 関数がトリガーされ、メッセージの内容をログとして記録するというアプリケーションです。
6. 実際に Service Bus にメッセージを追加し、Functions がメッセージの内容をログとして記録するかのテスト
Service Bus はインターネットからのアクセスが禁止され、プライベートエンドポイント経由のみのアクセスが可能となっています。
今回はテストのために一時的に自身のネットワークのクライアント IP アドレスからのアクセスを許可します。
作成した Service Bus キュー の [Service Bus エクスプローラー] ブレード より、任意のメッセージをキューに追加します。今回の場合は、「hello tya」というメッセージを送信しました。
Azure Functions の [ログ] ブレード より、ログを確認します。Service Bus キューに追加した「hello tya」というメッセージが記録されていることがわかります。
まとめ
仮想ネットワーク統合は送信側のネットワークを制御するための機能です。仮想ネットワーク統合することで、関数アプリから仮想ネットワーク内のリソースにアクセスできるようになります。Azure Functions の従量課金プランでは、仮想ネットワーク統合の機能は使用できないので、ネットワーク制御をしたい際には気を付ける必要があります。
(参考画像では作成したリソースをモザイクかけていますが、既に今回作成したリソースは削除済みです)
Discussion
Vnet統合周りの操作イメージの概要がつかめて助かりました!