⚒️

Azure Functions + VNet統合で BLOB にアクセスする例

に公開

前回まとめた内容で Azure Functions の基本的な部分は実装できたので、続いて VNet統合 を利用してプライベートな環境で実行できるようにしたい。
Azure Functions を利用した BLOB トリガーの実装例

Azure Functions の VNet統合について

Azure Functions の従量課金プランでは、主にパブリックなアクセスが対象となります。 よくある ExpressRoute や VPN などで構成した閉じた環境に準じて、Azure Functions から Azure 上の各リソースにプライベート、つまり内側からのアクセスに制限したい場合は VNet統合 や、プライベート エンドポイント が利用可能な Premium プラン等の利用する必要があります。

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-networking-options?tabs=azure-portal

機能 Flex 従量課金プラン 従量課金プラン Premium プラン 専用プラン/ASE Container Apps
受信 IP の制限
受信プライベート エンドポイント
仮想ネットワークの統合
送信 IP の制限

VNet 統合 や、プライベート エンドポイント を利用する事で下記のようなメリットがあります。

  • Function のアウトバウンド通信を VNet 統合で固定
  • サービス エンドポイントにより、Blob へのアクセスを特定のサブネットに限定
  • プライベート エンドポイントを利用することで、パブリックネットワーク経由のアクセスを完全に遮断できる (ただし、DNS 設定による名前解決の構成が必要)
  • これらを組み合わせることで、よりセキュアな内部通信環境を構築可能

用語の整理

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-networking-options?tabs=azure-portal
https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-networking-faq

Azure 上のプライベートな接続については、幾つか見慣れない用語や、イメージがつきにくい方もいると思うので補足です。要約しているだけなので、詳細は公式ドキュメのを見てください。

受信ネットワークの機能

受信アクセス制限

Azure Functions 側からみた受信の制限で、端的に言うと外部からのアクセス制限になります。

注意点として完全に外部からの通信を遮断してしまうと、Visual Studio Code からのデプロイも出来なくなります。その場合は特定のIPからだけの通信を許可するか、VPN または ExpressRoute などを利用する必要があるので注意しましょう。

プライベート エンドポイント

プライベート エンドポイントを利用すると、仮想ネットワークのプライベート IP アドレスを使用してアクセスさせる事ができるようになります。

Flex 従量課金、Premium、専用 (App Service) の各プランでプライベート エンドポイントを使用できますが、プライベート エンドポイントを呼び出す場合は、DNS 参照がプライベート エンドポイントに解決されるようにする必要があります。

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-create-VNet

サービス エンドポイント

サービス エンドポイントを利用すると Azure Functions へのアクセスを特定の VNet / Subnet に制限する事ができます。

送信ネットワーク機能

こちらは VNet統合 で実現します。 以下、公式ドキュメントからの抜粋です。

Azure Functions では、2 種類の仮想ネットワーク統合がサポートされています。

やりたいこと

  • Azure Functions を Premium プラン で作成し、VNet統合を有効にしたい。
  • Blob へのアクセスをサービス エンドポイント経由にしたい (外部公開はせずセキュアにしたい)

検証環境のデプロイ

ローカル環境の準備や、基本的なところは前回の記事を参照してください。

Azure Functions を利用した BLOB トリガーの実装例

今回必要となるリソースは以下の通りです。

  • 仮想ネットワーク (VNet) と対象サブネット
  • Azure Functions (Premium プラン)
  • Blob ストレージアカウントおよび対象の Blob コンテナ(例:"mycontainer")
  • サービス エンドポイントの設定対象となるサブネット

VNet サブネットの作成

VNet 統合先となる VNet を作成します。 説明は割愛します。

  1. リソースグループの作成
  2. 仮想ネットワーク (VNet) の作成 ( 前段で作成していたリソースグループを指定 )
  3. 作成した仮想ネットワークにサブネットを作成

Azure Functions の作成

Azure Functions リソースを作成します。 今回は VNet統合 を利用したいので Premium プランで作成します。注意点として ネットワークの設定 で VNet 統合を有効にしている点に注意してください。

  • Azure Portal から 関数アプリ を選択し、Premium プランでリソースを作成
  • ランタイムスタックは Python を選択
  • ネットワークの設定で “仮想ネットワーク統合” を有効にする。

Storage Account の作成

次に Storage Account を作成します。 ここも通常の手順で作成しますが、こちらも 仮想ネットワーク の設定で制限を入れている点に注意してください。

  1. ストレージアカウント → 作成 を選択して、リソースの作成を進める。
  2. 途中の ネットワーク接続 の設定で、接続元を仮想ネットワークと、指定したIP だけからのアクセスに制限する。
    ( IP Address の項目で自身のグローバルIP を指定するともお忘れなく (そうしないと BLOB にアクセスできない) )

動作確認と検証

Azure Functions で実行するコード自体は、前回と同じものを利用します。
Azure Functions を利用した BLOB トリガーの実装例

コードをデプロイした後で、Blob ストレージにファイルをアップロードすると、問題なくコードが動作する事が確認できます。

ストレージアカウント側では “選択した仮想ネットワークと IP アドレスから有効” としているため、今は VNet統合 (または設定した自身のIP) からだけしかアクセスできません。 つまり Azure Functions と Blob の間は Microsoft ネットワークルーティング上の動作になっています。

試しに上記図の “仮想ネットワーク” から VNet を削除してみると、ファイルをアップロードしても Azure Functions は動作しません。
この事からもサービス エンドポイント経由で動作している事が確認できます。

トラブルシューティング

VNet 統合を有効にした後、デプロイが出来ない。 Application Insight にログが出ない (=実行できているのかも分からない) などの事象が起こる事があるが、大抵はネットワーク側の設定 (NSGやルート設定など) と考えられるので、その際にはネットワーク設定を見直してください。

https://jpazmon-integ.github.io/blog/applicationInsights/troubleshooting_telemetry/

参考情報・備忘メモ

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-networking-options?tabs=azure-portal
https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-networking-faq

Discussion