🍄

Azure WebAppsとAzure SQL Databaseをセキュアに接続する

2022/05/17に公開約5,300字4件のコメント

はじめに

Azure WebAppsとAzure SQL Databaseを接続します。
セキュリティを考慮してプライベートエンドポイントを使います。

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

第1回はこちら

https://zenn.dev/ibaraki/articles/82cd0e70bb1c78

この記事でやること

第1回の記事で、Azure WebAppsを使いWebアプリを公開しました。
第2回の記事で、Application Gatewayを設置しました。
しかし、データベースがまだありません。ということで設置します。AzureっぽくAzure SQL Databaseを使おうと思います。マネージドデータベースですので、何も考えないで設置するとインターネット上に晒されます。怖いです。
ですので、インターネットからの接続を拒否しプライベートエンドポイントを経由の接続のみを通します。

https://docs.microsoft.com/ja-jp/azure/architecture/example-scenario/private-web-app/private-web-app

最終的に目指すもの

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

  • それなりの柔軟性を持たせつつ、それなりのセキュリティは確保したいが、その為に糞みたいに高いリソース(例えば最低月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アプリを構築

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公式記事

https://azure.microsoft.com/ja-jp/updates/general-availability-app-service-networking-capabilities-added-to-basic-pricing-tier/

実際に構築する

WebAppsを用意する

WebAppsは、第1回の記事を参照してください。

https://zenn.dev/ibaraki/articles/82cd0e70bb1c78

Azure SQL Databaseを用意する

価格

https://azure.microsoft.com/ja-jp/pricing/details/azure-sql-database/single/
サンプルだし、一番安い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で接続する

価格

課金アイテムです。

https://azure.microsoft.com/ja-jp/pricing/details/private-link/
約950円/月程度でしょうか。
サンプルアプリなので通信にかかる費用はほぼ無いと信じて無視します。

リソースを作る

先程作成した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に下げても動いてる!!

ありがとうございます!めっちゃ安くなりました!

ありがとうございます。
記事本文にも貼らせていただきます!

ログインするとコメントできます