🍄

Azure WebAppsにAzure Storageをセキュアにマウントする

2022/11/03に公開

はじめに

Azure WebAppsにデプロイしたコンテナーにAzure Storageをマウントします。
セキュリティを考慮してプライベートエンドポイント経由で接続します。

シリーズもの第4回です。

第1回はこちら
https://zenn.dev/ibaraki/articles/82cd0e70bb1c78

この記事でやること

第1回の記事で、Azure WebAppsを使いコンテナーで作ったWebアプリを公開しました。
コンテナーはステートレスですので、ファイルにデータを保存しても再起動すれば消えてしまいます。そもそもアプリはステートレスにするべきというのが定説ですので、ファイルでデータを扱うということは好ましくないです。
とはいえ、実態としてはファイルとしてデータを扱いたいことも発生するかと思います。
この記事では、Azure WebAppsにAzure Storageをマウントすることで永続化されたAzure Storageのデータをファイルシステムの一部のように扱う方法を紹介します。

最終的に目指すもの

今回で一通り揃うはずです。

下記の思想で設計しています。

  • それなりの柔軟性を持たせつつ、それなりのセキュリティは確保したいが、その為に糞みたいに高いリソース(例えば最低月10万円のAzure Firewall等)は使いたくない。
  • といってもAzureなのでそれなりの金額になります。課金しないと、それなりの柔軟性もそれなりのセキュリティも確保できないです。Azureなので。
    • 安くWebアプリを構築したい時はAWS Amplify等の他サービスを使おう(本末転倒)

本シリーズのほか記事へのリンク

1. Azureにコンテナーで作ったWebアプリを公開する
2. Azure WebAppsの手前にApplication Gatewayを設置する
3. Azure WebAppsとAzure SQL Databaseをセキュアに接続する
4. Azure WebAppsにPrivate Linkで接続したAzure Storageをマウントする ← いまココ
5. (番外編)Django + SQLServer(Azure SQL Database) + SQLAlchemyで、Webアプリを構築

ネットワーク周りの構成について

今回、WebAppsからVNetを経由して、Storageをマウントする構成にします。
この構成は、前回記事のSQLをStorageに置き換えただけですので、説明は大幅に割愛します。
前提として、そちらを見ていただければと思います。
https://zenn.dev/ibaraki/articles/2dca271069c851

Azure WebAppsにAzure Storageをマウント

https://learn.microsoft.com/ja-jp/azure/app-service/configure-connect-to-azure-storage?tabs=portal&pivots=container-linux
冒頭にも書いたように、コンテナーはステートレスですので永続化したデータを保存したい場合は、WebAppsの外部に持つ必要があります。
新規に設計するアプリであれば、それを前提とした構成にすることもできますが、なんだかんだでファイルとして永続化できないのは不便なこともあります。
ということで、Azure WebApps上のコンテナーに永続化可能なAzure Storageをマウントしてしまえば、ファイルとして使えて便利です。

実際に構築する

WebAppsを用意する

WebAppsは、第1回の記事を参照してください。
https://zenn.dev/ibaraki/articles/82cd0e70bb1c78

VNetを用意する

使用するVNet上にstorage接続用のサブネットを追加してください。

詳細は、第3回の記事を参照してください。

Azure WebAppsとVNetをVNet Integrationで接続する

これも第3回の記事を参照してください。

Azure Storageを用意する

価格

https://azure.microsoft.com/ja-jp/pricing/details/storage/blobs/#pricing
テストで使う範囲のStorageなんて金額が小さすぎて無視出来るレベルです。
月額10円もあれば十分でしょう。本格的に使う場合はちゃんと見積もってください。

リソースを作る

Azureのコンソールから画面に従って、ストレージのリソースを作ります。

ところでストレージに限らないのですが、Azureのリソース追加時の検索機能使いにくすぎませんか?日本語のコンソールだとstorageで検索してもストレージが出てこないのなんとかならないんですかね?

Azure StorageとVNetをPrivate Linkで接続する

価格

DBで使ったものと同じやつです。
https://azure.microsoft.com/ja-jp/pricing/details/private-link/
1100円くらいでしょうか。円安の影響で前回の記事のときより高いですが、同じものです。

プライベートエンドポイントを作る

コンソールから先程作ったストレージのリソースを開き、ネットワーク -> プライベートエンドポイント接続 と進み、プライベートエンドポイントを作成してください。



↑対象サブリソースはファイル

↑ネットワークは先程作ったサブネットを選択

こちらの操作で、Azure StorageへのPrivateエンドポイント経由での接続が可能になりました。

補足

BLOBはRead onlyで、ファイルは読み書き可能です。
Azure上の用語でfile=ファイル=ファイル共有=Azure Filesと読み替えればたぶん大丈夫です。頼むから用語の統一くらいしてほしいです。

Azure Storageにアクセス制限を設定

Azure StorageへのPrivateエンドポイント経由の接続のみを許可するように設定します。

  • コンソールからストレージのリソースを開き、ネットワーク -> ファイアウォールと仮想ネットワークを選択
  • 選択した仮想ネットワークと IP アドレスから有効を選択
  • 既存の仮想ネットワークを追加するから先程作ったサブネットを追加

保存ボタンが上にあって分かりにくいので、押し忘れないように気をつけてください。私は押し忘れて一度設定が消えました。

Azure Storageのマウント

Azure Storageにファイル共有を作成

ファイル共有を作成という日本語がしっくりきませんが、Azure上の名称がそうなっています。
コンソールでAzure Storageのリソースを開き、ファイル共有を選択して、ファイル共有を作成してください。

WebAppsにAzure Storageをマウント

  • コンソールでWebAppsのリソースに移動して、構成->パスのマッピングから、新しいAzure Storageマウントを追加してください
  • 先程、作成したファイル共有をストレージコンテナーに設定して、WebAppsのコンテナー上のマウントパスを指定すればOKです。

最後に、上にある保存ボタンを押し忘れないようにしましょう。
また、設定をミスってマウントできない場合は、WebAppsのコンテナーが起動すらしないので注意してください。逆に言えば起動できていれば成功しています。

以上で、Azure WebAppsにAzure Storageを安全にマウントすることができました。

Azure費用(月額)

最後に、Azure費用です。(第1回&第2回&第3回の内容含む)
半年以上放置した為、為替レートが大幅に変わり前回との比較が困難なので、見積もり直しました。ご了承ください。

約8,770円/月

  • Azure Container Registry : 約750円/月
  • Azure App Service Plan : 約2100円/月
  • Azure Application Gateway : 約2900円/月
  • Azure SQL Database : 約810円/月
  • Private Endpoint : 約1100円/月 * 2 = 約2200円
  • Azure Storage : 約10円/月

Application GatewayとかPrivate Endpointみたいなネットワーク系のリソースは、もうちょっと安くならないのかなぁと思います。

以上です!

Discussion