Azure WebAppsにAzure Storageをセキュアにマウントする
はじめに
Azure WebAppsにデプロイしたコンテナーにAzure Storageをマウントします。
セキュリティを考慮してプライベートエンドポイント経由で接続します。
シリーズもの第4回です。
第1回はこちら
この記事でやること
第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に置き換えただけですので、説明は大幅に割愛します。
前提として、そちらを見ていただければと思います。
Azure WebAppsにAzure Storageをマウント
新規に設計するアプリであれば、それを前提とした構成にすることもできますが、なんだかんだでファイルとして永続化できないのは不便なこともあります。
ということで、Azure WebApps上のコンテナーに永続化可能なAzure Storageをマウントしてしまえば、ファイルとして使えて便利です。
実際に構築する
WebAppsを用意する
WebAppsは、第1回の記事を参照してください。
VNetを用意する
使用するVNet上にstorage接続用のサブネットを追加してください。
詳細は、第3回の記事を参照してください。
Azure WebAppsとVNetをVNet Integrationで接続する
これも第3回の記事を参照してください。
Azure Storageを用意する
価格
月額10円もあれば十分でしょう。本格的に使う場合はちゃんと見積もってください。
リソースを作る
Azureのコンソールから画面に従って、ストレージのリソースを作ります。
ところでストレージに限らないのですが、Azureのリソース追加時の検索機能使いにくすぎませんか?日本語のコンソールだとstorage
で検索してもストレージが出てこないのなんとかならないんですかね?
Azure StorageとVNetをPrivate Linkで接続する
価格
DBで使ったものと同じやつです。
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