Azure Functions + VNet統合で BLOB にアクセスする例
前回まとめた内容で Azure Functions の基本的な部分は実装できたので、続いて VNet統合 を利用してプライベートな環境で実行できるようにしたい。
Azure Functions を利用した BLOB トリガーの実装例
Azure Functions の VNet統合について
Azure Functions の従量課金プランでは、主にパブリックなアクセスが対象となります。 よくある ExpressRoute や VPN などで構成した閉じた環境に準じて、Azure Functions から Azure 上の各リソースにプライベート、つまり内側からのアクセスに制限したい場合は VNet統合 や、プライベート エンドポイント が利用可能な Premium プラン等の利用する必要があります。
機能 | Flex 従量課金プラン | 従量課金プラン | Premium プラン | 専用プラン/ASE | Container Apps |
---|---|---|---|---|---|
受信 IP の制限 | ✔ | ✔ | ✔ | ✔ | ✔ |
受信プライベート エンドポイント | ✔ | ✔ | ✔ | ||
仮想ネットワークの統合 | ✔ | ✔ | ✔ | ✔ | |
送信 IP の制限 | ✔ | ✔ | ✔ | ✔ |
VNet 統合 や、プライベート エンドポイント を利用する事で下記のようなメリットがあります。
- Function のアウトバウンド通信を VNet 統合で固定
- サービス エンドポイントにより、Blob へのアクセスを特定のサブネットに限定
- プライベート エンドポイントを利用することで、パブリックネットワーク経由のアクセスを完全に遮断できる (ただし、DNS 設定による名前解決の構成が必要)
- これらを組み合わせることで、よりセキュアな内部通信環境を構築可能
用語の整理
Azure 上のプライベートな接続については、幾つか見慣れない用語や、イメージがつきにくい方もいると思うので補足です。要約しているだけなので、詳細は公式ドキュメのを見てください。
受信ネットワークの機能
受信アクセス制限
Azure Functions 側からみた受信の制限で、端的に言うと外部からのアクセス制限になります。
注意点として完全に外部からの通信を遮断してしまうと、Visual Studio Code からのデプロイも出来なくなります。その場合は特定のIPからだけの通信を許可するか、VPN または ExpressRoute などを利用する必要があるので注意しましょう。
プライベート エンドポイント
プライベート エンドポイントを利用すると、仮想ネットワークのプライベート IP アドレスを使用してアクセスさせる事ができるようになります。
Flex 従量課金、Premium、専用 (App Service) の各プランでプライベート エンドポイントを使用できますが、プライベート エンドポイントを呼び出す場合は、DNS 参照がプライベート エンドポイントに解決されるようにする必要があります。
サービス エンドポイント
サービス エンドポイントを利用すると Azure Functions へのアクセスを特定の VNet / Subnet に制限する事ができます。
送信ネットワーク機能
こちらは VNet統合 で実現します。 以下、公式ドキュメントからの抜粋です。
Azure Functions では、2 種類の仮想ネットワーク統合がサポートされています。
- Flex 従量課金、エラスティック Premium、専用 (App Service)、Container Apps の各ホスティング プランで実行されているアプリ用のリージョンの仮想ネットワーク統合 (推奨)
- 専用 (App Service) ホスティング プランで実行されているアプリ用のゲートウェイが必要な仮想ネットワーク統合
やりたいこと
- Azure Functions を Premium プラン で作成し、VNet統合を有効にしたい。
- Blob へのアクセスをサービス エンドポイント経由にしたい (外部公開はせずセキュアにしたい)
検証環境のデプロイ
ローカル環境の準備や、基本的なところは前回の記事を参照してください。
Azure Functions を利用した BLOB トリガーの実装例
今回必要となるリソースは以下の通りです。
- 仮想ネットワーク (VNet) と対象サブネット
- Azure Functions (Premium プラン)
- Blob ストレージアカウントおよび対象の Blob コンテナ(例:"mycontainer")
- サービス エンドポイントの設定対象となるサブネット
VNet サブネットの作成
VNet 統合先となる VNet を作成します。 説明は割愛します。
- リソースグループの作成
- 仮想ネットワーク (VNet) の作成 ( 前段で作成していたリソースグループを指定 )
- 作成した仮想ネットワークにサブネットを作成
Azure Functions の作成
Azure Functions リソースを作成します。 今回は VNet統合 を利用したいので Premium プランで作成します。注意点として ネットワークの設定 で VNet 統合を有効にしている点に注意してください。
- Azure Portal から 関数アプリ を選択し、Premium プランでリソースを作成
- ランタイムスタックは Python を選択
- ネットワークの設定で “仮想ネットワーク統合” を有効にする。
Storage Account の作成
次に Storage Account を作成します。 ここも通常の手順で作成しますが、こちらも 仮想ネットワーク の設定で制限を入れている点に注意してください。
- ストレージアカウント → 作成 を選択して、リソースの作成を進める。
- 途中の ネットワーク接続 の設定で、接続元を仮想ネットワークと、指定した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やルート設定など) と考えられるので、その際にはネットワーク設定を見直してください。
参考情報・備忘メモ
Discussion