こんばんは。今日は、Azure Functionsに関して実験したことを記録として残しておこうと思います。
Contents
今回のシナリオ
Azure Functionsは、その動作のために、ストレージアカウントが必要です。
このAzure FunctionsとFunctionsが既定で利用するストレージアカウントの接続は、規定ではパブリックIPを利用した通信となりますが、この通信をよりセキュアにするため、仮想ネットワークに閉じた通信にしたいことがあります。
Azure Functionsとストレージを仮想ネットワークに閉じて通信させるための方法としては、以下の2通りがあります。
1:Azure Functions -> (VNET統合) -> 仮想ネットワーク -> (プライベートエンドポイント) -> ストレージ
2:Azure Functions -> (VNET統合) -> 仮想ネットワーク -> (サービスエンドポイント) -> ストレージ
これらの方法については、以下の公式ドキュメントに説明がありますが、今回はこのドキュメントの説明をもとに、1のプライベートエンドポイント経由でストレージに接続できるようにしていきたいと思います。
構成してみる
前提
VNETとサブネット(VNET統合用先サブネットとして1つ、ストレージのプライベートエンドポイント構成用に1つの合計2つ)は事前に作成しているものとします。
Azure Functions (+規定のストレージ)を作成する
Functionsは、仮想ネットワーク経由での接続に対応しているランタイムで作成します。今回はElastic Premiumプラン/Linux/Javaで構成しました。
コンテンツをデプロイする(オプショナル)
これは、後の挙動確認のために事前に実施したものなので、すべての構成が完了した後に実施いただいても問題ありません。
Javaのプロジェクトをデプロイする手順は以下の通りです。(VSCodeからのデプロイ)
https://docs.microsoft.com/ja-jp/azure/azure-functions/create-first-function-vs-code-java
適当な関数を作ってそのままデプロイします。
デプロイが正常に完了した後、関数はAzureポータル上でも確認できるはずです。
ご参考ですが、このときコンテンツがStorage上どのように格納されているかも確認しておきます。公式ドキュメントによると、従量課金/Premiumプランの場合は、関数コードの実体はストレージのFile共有に保存されるとあります。
https://docs.microsoft.com/ja-jp/azure/azure-functions/storage-considerations
既定で構成されるストレージのファイル共有をみてみると、確かにデプロイした関数コードの実体が格納されていることが分かります。
ちなみに、Blobの方には、SyncTriggerなど、関数の同期や実行を管理するための情報が格納されていることが分かります。
Azure Functionsを仮想ネットワークに統合する
Azure Functionsを仮想ネットワークに統合するために、VNET統合機能を利用します。
VNET統合:https://docs.microsoft.com/ja-jp/azure/app-service/overview-vnet-integration
なお、この段階ではまだFunctionsとストレージは通信できる状態です。
プライベートエンドポイント構成用に新たなストレージアカウントを作成する
続いて、プライベートエンドポイント構成用に新たなストレージを作成します。ストレージ作成時、ネットワークの構成で、「接続方法」として「プライベートエンドポイント」を選択しておきます。
プライベートエンドポイントの追加は後ほど行うため、この段階ではスキップします。
新しいストレージアカウントにファイル共有を作成する
公式ドキュメントの説明に従って、新しいストレージアカウントにファイル共有を作成します。
新しいストレージに対してプライベートエンドポイントを構成する
続いて、プライベートエンドポイントの構成です。先ほど確認した通り、FunctionsはFile共有とBlob Storageを利用するため、それぞれに対するプライベートエンドポイントが必要です。
File共有/Blobのコンテンツを新しいストレージへコピーする
(割愛)
新しいストレージにつなぎ変える
Functionsが接続するストレージの情報は、アプリケーション設定で持っています。最後に、このアプリ設定の値を新しいストレージの接続文字列に更新します。加えて公式ドキュメントのガイドに従って以下のアプリ設定の追加・変更も行います。
つなぎかえた後、疎通確認を行ってみます。
Linuxの場合、以下の方法でアプリケーションコンテナ上(SSH)でtcppingコマンドを使えるようにできますので事前にこちらを設定しておきます。(Linux/Premiumプラン/Javaのインスタンスの場合、wgetコマンドも規定では使えなかったので、apt-get install wgetでインストールする必要がありました)
https://azureossd.github.io/2021/06/17/installing-tcpping-linux/
コマンド:
tcpping ホスト名
構成変更後:
上の結果を見ると、ちゃんとストレージアカウントに構成したプライベートエンドポイントのプライベートIPが利用されていることが分かります。
これで無事、Functionsとストレージの接続を閉域化することができました!ご参考になりましたら幸いです。
おしまい
コメントを残す