【Microsoft Azure】Azure Functionsが使用するストレージアカウントとの接続を仮想ネットワークに制限してみた – プライベートエンドポイント編

こんばんは。今日は、Azure Functionsに関して実験したことを記録として残しておこうと思います。

今回のシナリオ

Azure Functionsは、その動作のために、ストレージアカウントが必要です。

このAzure FunctionsとFunctionsが既定で利用するストレージアカウントの接続は、規定ではパブリックIPを利用した通信となりますが、この通信をよりセキュアにするため、仮想ネットワークに閉じた通信にしたいことがあります。

Azure Functionsとストレージを仮想ネットワークに閉じて通信させるための方法としては、以下の2通りがあります。

1:Azure Functions -> (VNET統合) -> 仮想ネットワーク -> (プライベートエンドポイント) -> ストレージ

2:Azure Functions -> (VNET統合) -> 仮想ネットワーク -> (サービスエンドポイント) -> ストレージ

これらの方法については、以下の公式ドキュメントに説明がありますが、今回はこのドキュメントの説明をもとに、1のプライベートエンドポイント経由でストレージに接続できるようにしていきたいと思います。

https://docs.microsoft.com/ja-jp/azure/azure-functions/configure-networking-how-to#restrict-your-storage-account-to-a-virtual-network

構成してみる

前提

VNETとサブネット(VNET統合用先サブネットとして1つ、ストレージのプライベートエンドポイント構成用に1つの合計2つ)は事前に作成しているものとします。

Azure Functions (+規定のストレージ)を作成する

Functionsは、仮想ネットワーク経由での接続に対応しているランタイムで作成します。今回はElastic Premiumプラン/Linux/Javaで構成しました。

https://docs.microsoft.com/ja-jp/azure/azure-functions/configure-networking-how-to#restrict-your-storage-account-to-a-virtual-network

2022年1月11日現在の記載より

コンテンツをデプロイする(オプショナル)

これは、後の挙動確認のために事前に実施したものなので、すべての構成が完了した後に実施いただいても問題ありません。

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

2022年1月11日時点の記載より

既定で構成されるストレージのファイル共有をみてみると、確かにデプロイした関数コードの実体が格納されていることが分かります。

ちなみに、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を利用するため、それぞれに対するプライベートエンドポイントが必要です。

2022年1月11日時点の記事より

File共有/Blobのコンテンツを新しいストレージへコピーする

(割愛)

新しいストレージにつなぎ変える

Functionsが接続するストレージの情報は、アプリケーション設定で持っています。最後に、このアプリ設定の値を新しいストレージの接続文字列に更新します。加えて公式ドキュメントのガイドに従って以下のアプリ設定の追加・変更も行います。

2022年1月11日現在の記載より

つなぎかえた後、疎通確認を行ってみます。

Linuxの場合、以下の方法でアプリケーションコンテナ上(SSH)でtcppingコマンドを使えるようにできますので事前にこちらを設定しておきます。(Linux/Premiumプラン/Javaのインスタンスの場合、wgetコマンドも規定では使えなかったので、apt-get install wgetでインストールする必要がありました)

https://azureossd.github.io/2021/06/17/installing-tcpping-linux/

コマンド:

tcpping ホスト名

構成変更後:

上の結果を見ると、ちゃんとストレージアカウントに構成したプライベートエンドポイントのプライベートIPが利用されていることが分かります。

これで無事、Functionsとストレージの接続を閉域化することができました!ご参考になりましたら幸いです。

おしまい

この記事を気に入っていただけたらシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。

ABOUT US
Yuu113
初めまして。ゆうたろうと申します。 兵庫県出身、東京でシステムエンジニアをしております。現在は主にデータ分析、機械学習を活用してビジネスモデリングに取り組んでいます。 日々学んだことや経験したことを整理していきたいと思い、ブログを始めました。旅行、カメラ、IT技術、江戸文化が大好きですので、これらについても記事にしていきたいと思っています。