Azure WebAppsとAzure SQL Databaseをセキュアに接続する
はじめに
Azure WebAppsとAzure SQL Databaseを接続します。
セキュリティを考慮してプライベートエンドポイントを使います。
シリーズもの第3回です。
第1回はこちら
この記事でやること
第1回の記事で、Azure WebAppsを使いWebアプリを公開しました。
第2回の記事で、Application Gatewayを設置しました。
しかし、データベースがまだありません。ということで設置します。AzureっぽくAzure SQL Databaseを使おうと思います。マネージドデータベースですので、何も考えないで設置するとインターネット上に晒されます。怖いです。
ですので、インターネットからの接続を拒否しプライベートエンドポイントを経由の接続のみを通します。
最終的に目指すもの
下記の思想で設計しています。
- それなりの柔軟性を持たせつつ、それなりのセキュリティは確保したいが、その為に糞みたいに高いリソース(例えば最低月10万円のAzure Firewall等)は使いたくない。
- といってもAzureなのでそれなりの金額になります。課金しないと、それなりの柔軟性もそれなりのセキュリティも確保できないです。Azureなので。
- 安くWebアプリを構築したい時はAWS Amplify等の他サービスを使おう(本末転倒)
本シリーズのほか記事へのリンク
- Azureにコンテナーで作ったWebアプリを公開する
- Azure WebAppsの手前にApplication Gatewayを設置する
- Azure WebAppsとAzure SQL Databaseをセキュアに接続する ← いまココ
- Azure WebAppsにAzure Storageをセキュアにマウントする
- (番外編)Django + SQLServer(Azure SQL Database) + SQLAlchemyで、Webアプリを構築
Private Linkが必要な理由
上の図を見た方の中には、「なんでVnetを経由する必要があるんだ? Azure SQL DatabaseのFirewall機能でAzure WebApps以外からの接続を拒否すれば良くないか?」と思う方がいるかも知れません。私は最初そう思いました。
しかし、下記の理由によりこの方法は出来ません。
- DBについているFirewall機能には、特定のWebAppsリソースをピンポイントで指定する機能がない
- WebAppsはIPアドレスが固定されていないのでIP指定でのアクセス制限も出来ない
厳密にはWebAppsをIsolateプランにすればIP固定もできるらしいので、IPアドレス指定のアクセス制限が出来ます。しかし、Isolateプランは最低でも月額35k円を超えるので私は手を出していないです。
ということで、Azureでプライベートな接続をするには、VNetを経由する必要があります。
そして、VNetから各種Azureリソースへ安全な接続の為にPrivate EndpointとPrivate Linkを使います。
Azure WebAppsのVNet Integration(VNet統合)について
前述の通り、DBに安全につなぐためにはPrivate Linkを使って、VNetと繋ぐ必要があります。
しかし、WebApps側もVNetの外にあります。ですので、WebAppsとVNet接続する必要があります。その為の機能が、VNet Integration(VNet統合)です。
個人的な意見を申しますと、とても複雑で面倒くさいので、WebAppsとDBを直接安全に繋ぐ機能を提供してほしいです。 また、VNet IntegrationはWebAppsをStandardプラン以上にする必要がありますので、最低でも月額10k円程度必要です。Azureのそういうところが嫌いです。
2022/05/23追記
先月から、BasicプランでVNet Integrationが使えるようになったとのことです。
試したら動きました!
よたんさんコメントありがとうございます。
Azure公式記事
実際に構築する
WebAppsを用意する
WebAppsは、第1回の記事を参照してください。
Azure SQL Databaseを用意する
価格
Single Database
DTU
Basic
でいいと判断します。
月額約700円。安い。他のリソースもこういう安価で使えるプラン用意してほしい。
リソースを作る
Azureのコンソールから画面に従って、リソースを作ります。
-
途中でサーバーの選択があるので、新規に作ります
-
ネットワークは、一旦アクセスなしにしておきます。
- 後でプライベートエンドポイントの設定をします。
- 後でプライベートエンドポイントの設定をします。
-
後は初期設定で、確認および作成
VNetを用意する
Private Linkの為にVNetを作ります。
第2回の記事でWebAppsの前に置くVNetを作りましたが、今回はWebAppsの後ろに置くVNetなので、セキュリティ的にネットワークの分離を考え、別のVNetを作りました。
- VNetの中に、DBとPrivate Linkで繋ぐ為のサブネットを作っておきます。
Azure SQL ServerとVNetをPrivate Linkで接続する
価格
課金アイテムです。
サンプルアプリなので通信にかかる費用はほぼ無いと信じて無視します。
リソースを作る
先程作成したAzure SQL ServerからPrivate Endpoint接続を選び、Private Endpointを作成します。
(SQL Databaseではなく、SQL Serverの方です。わかりにくいので注意!)
- VNetとSubnetに先程作ったサブネットを選択してください。
Azure WebAppsとVNetをVNet Integrationで接続する
WebAppsに課金する
前述の通り2022/4/21から、追加課金が不要になっていました。
VNet IntegrationはWebAppsの機能ですが、課金アイテムです。
AppServicePlanが安いB1プランでは使えませんので、P1V2に変更します。約1600円/月→約1万円/月
(WebAppsでなくAppServicePlan側で変更です。わかりにくい!)
メモリ3.5GBも要らないんですけどね、、、VNetと連携するだけで金額が6.25倍って、、、
VNet Integrationを設定する
- WebAppsのコンソールからネットワーク->VNet統合と進みます
(AppServicePlanではなくWebApps側で設定です。めちゃくちゃ、わかりにくい!)
- 下図のように分かりづらいところにあるボタンを押して、VNet統合の設定をします。
ここまででネットワークの設定が出来たので、アプリケーション側からDBに接続すれば繋がるはずです。
アプリケーションにDB接続設定を入れる
第1回の記事でデプロイしたアプリであれば、構成から環境変数を適切に設定してあげれば繋がります。
以上で、Azure WebAppsとAzure SQL Databaseを安全に繋ぐことが出来ました。
Azure費用(月額)
最後に、Azure費用です。(第1回&第2回の内容含む)
約2,200円/月 → 約4,600円/月 → 約14,650円/月 (情報古い) → 約6,250円/月
- Azure Container Registry : 約600円/月
-
Azure App Service Plan : 約1600円/月 → 約10,000円/月(scale up)(情報古い) - Azure App Service Plan : 約1600円/月
- Azure Application Gateway : 約2400円/月
- Azure SQL Database : 約700円/月(new)
- Private Endpoint : 約950円/月(new)
実運用ならいいですが、お試しで構築するにはかなり勇気がいる金額ですね。
App Service Planに追加課金しなくてもVNet統合できるようになったので、かなり安くなりました。
よたんさん、コメントで情報ありがとうございます。
前から困ってたのでかなり助かります。
次の記事
Discussion
こんにちは、先月からApp Service Basic SKUでもVNET統合できるようになってます!
本当だ!Basicに下げても動いてる!!
ありがとうございます!めっちゃ安くなりました!
一応公式の情報ソースですー
ありがとうございます。
記事本文にも貼らせていただきます!