Azure App ServiceのVNet統合を使ってStorage Accountにセキュアにアクセスする
2020-07-22
azblob://2022/11/11/eyecatch/2020-07-22-appservice-storageaccount-vnet-integrate-000.jpg

こんにちは。cloud.config Div の神田です。
今回はApp ServiceでVNet統合を用いてStorage Accountへセキュアにアクセスさせます。

App ServiceとStorage Accountの通信について

Microsoft社のドキュメントにも記載されていますが、
App ServiceとStorage Accountが同一リージョンにある場合、
App ServiceはパブリックIPではなく、プラットフォーム側のプライベートIPを用いて通信します。

そのため、Storage Account側でIP制限をかける場合、
App ServiceのパブリックIPを許可していても、アクセスが拒否されてしまいます。

この事象はApp ServiceにデプロイされたアプリケーションでのSASや接続文字列を使った接続だけでなく、
Azureポータル上で設定できるApp Serviceのバックアップやログの格納でも発生します。

この事象を回避するには、App Service Environment を用いてApp ServiceをVirtual Networkの中に入れる、
またはApp ServiceとStorage Accountを別々のリージョンに立てるといった方法があります。

参考 : Azure Web Apps / Azure Functions から同じリージョンの Azure Storage Account へ接続する時の注意点
https://docs.microsoft.com/ja-jp/archive/blogs/jpcie/azure-web-apps-azure-functions-%E3%81%8B%E3%82%89%E5%90%8C%E3%81%98%E3%83%AA%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%AE-azure-storage-account-%E3%81%B8%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E6%99%82

今回の目標

上記の通り、App ServiceとStorage Accountを同一リージョンに立てつつ、Storage Account側でIP制限をかける場合にはASEを使うしかなかったのですが、
最近VNet統合がプレビューから正式にGAされたので、今回はこのVNet統合を用いて実現させます。

参考 : Integrate your app with an Azure virtual network
https://docs.microsoft.com/en-us/azure/app-service/web-sites-integrate-with-vnet#new-vnet-integration

BlobコンテナにアクセスするWebアプリの作成

下記ドキュメントにてBlobコンテナに画像をアップロードする機能、
Blobコンテナの画像を取得しサムネイル表示する機能を持ったWebアプリを
App Serviceにデプロイする手順が公開されているのでこちらに従いWebアプリを作成します。

ただし、今回使用するVNet統合はApp Serivce PlanのStandard以上でのみサポートされているので、
ドキュメントではFreeで作成していますが、今回はStandardで作成します。

参考 : チュートリアル:Azure Storage を使用してクラウドに画像データをアップロードする
https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-upload-process-images?tabs=dotnet

Storage AccountにIP制限をかけてみる

Azureポータル上でStorage Accountから[ファイアウォールと仮想ネットワーク]にアクセスし、
[許可するアクセス元]を[すべてのネットワーク]から[選択されたネットワーク]に変更し、
[アドレス範囲]にAppServiceの[プロパティ]に表示されるグローバルIPを入力し保存します。

その後Webアプリにアクセスすると、App ServiceからStorage Accountへのアクセスが拒否されるので、
画像のアップロード、サムネイル表示が失敗します。

VNet統合を構成する

Virtual Networkと Subnet を新たに作成します。
その後App Serviceの[ネットワーク] > [VNet統合] を作成し、
新たに作成した Virtual Network、Subnetを選択します。

Storage AccountでVirtual Networkからのアクセスを許可

再びStorage Accountの[ファイアウォールと仮想ネットワーク]にアクセスし、
先ほど設定したAppServiceのグローバルIPを削除し、
[仮想ネットワーク]に先ほど作成したVirtual Networkを追加します。
※Subnetのサービスエンドポイントもこのとき自動で設定される模様

Webアプリにアクセス

Webアプリにアクセスし、Blobコンテナへの画像アップロードと、
Blobコンテナの画像のサムネイル表示ができることを確認します。
※VNet統合を構成してから、アクセス可能になるまで1時間ほどかかる場合があります。

最後に

以上でStorage AccountにIP制限をかけつつ、
同一リージョンのApp Serviceからのアクセスを許可することが出来ました。

注意点ですが、AppServiceのバックアップは
ファイアウォールが設定されたStorage Accountに対してはサポートされていないので、
VNet統合を構成しても失敗します。

この理由はAzure内部でAppServiceがホストされている仮想マシンとは異なる仮想マシンが
AppServiceのバックアップジョブを実行しているからです。
AppServiceのバックアップを構成する際は
ファイアウォールのかかっていないStorage Accountに保存するようにしましょう。