【第13回】Azureで社内システム再現（クラウド編）｜App Service と SQL の閉域接続を構築（VNet統合＋PE）

## 概要

これまでの「オンプレ編」では、Azure の仮想マシン（IaaS）を使って、社員番号から名前を検索できるシンプルな社内システムを構築してきました。Active Directory、SQL Server、ADFS などを組み合わせ、オンプレミスの構成を仮想的に再現しています。

※全体構成の詳細は、[【第0回】Azureで社内システム再現（オンプレ編）｜構成図と動作の流れ](https://qiita.com/your-link-here) をご参照ください。

クラウド編では、これまでの構成をベースにしつつ、Azure のマネージドサービス（PaaS）を中心とした構成へ段階的に移行していきます。

※クラウド移行全体の設計方針については、[【第10.5回】Azureで社内システム再現（クラウド編）｜オンプレ構成をどうクラウドに移行するか？](https://qiita.com/saba_infra/items/4ff691131593e947d6cf) にまとめています。

---
## システム構成（今回の対象範囲）

今回のテーマは、**Azure Web App から Azure SQL Database への接続を、パブリック経由ではなくプライベート接続で構成すること**です。

まず、下図は「クラウド編」の全体構成を示したものです。

![cloud_webapp_vnet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/9d0a2789-254a-44b2-9bec-4f4e15a6acf0.png)

このうち、**赤枠で示している Azure Web App → Azure SQL の部分**が今回の対象です。  
この通信を閉域（プライベート）接続にすることで、**インターネットを経由しない安全な社内システム**を構築します。

---

次に、下図がその**閉域構成の詳細図**です。

![スクリーンショット 2025-04-16 16.57.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/bad1ab76-aac7-46d7-af7e-b4dbc7404f4d.png)


Azure Web App 側は「VNet 統合」により仮想ネットワークに参加し、  
Azure SQL 側は「Private Endpoint（PE）」を構成してプライベートIPを持たせます。
これにより、Azure Web App から Azure SQL Database への通信は、インターネットを経由せず、仮想ネットワーク内のプライベートな経路を通じて行われるようになります。


具体的には、以下の作業を実施します。

- 仮想ネットワーク（VNet）とサブネットの作成  

- Azure Web App の VNet 統合（Outbound 通信用）

- SQL 用の Private Endpoint を作成

---
## 仮想ネットワークとサブネットの作成

まずは、Azure Web App および Azure SQL Database と同じリージョン（**Southeast Asia**）にVNetを作成します。  
今回は以下のような設定で作成しました。


![スクリーンショット 2025-04-02 12.34.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/4a282fd1-a0b1-4a4a-8d29-1e47f383e8ba.png)

---

続いて、この VNet に対して2つのサブネットを作成します。  
![スクリーンショット 2025-04-02 12.36.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/358cb7df-de6f-4dbc-a0bb-7a6fe839cd9d.png)
それぞれの役割とアドレス範囲は以下のとおりです

| サブネット名 | 用途                           | アドレス範囲     |
|--------------|--------------------------------|------------------|
| `subnet-webapp` | Azure Web App の VNet 統合用       | `10.0.1.0/27`    |
| `subnet-sql-pe` | SQL Database の Private Endpoint 用 | `10.0.2.0/27`    |

---

## Azure Web App を仮想ネットワークに統合する

続いて、Azure Web App 側で VNet 統合（Regional VNet Integration）を行います。  
これは Web App から仮想ネットワーク内のリソース（今回は Azure SQL）にプライベート経由でアクセスするために必要な設定です。

Web App の「ネットワーク」メニューから、**「VNet 統合」**を選択し、先ほど作成した仮想ネットワークとサブネット（`subnet-webapp`）を指定します。

![スクリーンショット 2025-04-02 12.37.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/f221fb25-1133-4c9c-a88b-2a8fda842994.png)

---
## Azure SQL に Private Endpoint を構成する

Azure SQL Database へのアクセスを仮想ネットワーク経由のみに制限するため、Private Endpoint（PE）を構成します。

---

### パブリックアクセスが無効であることを確認

まず、SQL Database のファイアウォール設定で、**パブリックネットワークアクセスが無効になっていること**を確認します。  
これにより、インターネット経由での接続が遮断され、Private Endpoint のみを通じてアクセスできる状態になります。

![スクリーンショット 2025-04-02 12.39.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/1463b1b8-5369-477b-8a9d-e324e71cbbce.png)

---

### Private Endpoint の作成開始

「ネットワーク」メニュー → 「プライベート アクセス」→「+ プライベート エンドポイント」をクリックし、新しいエンドポイントを作成します。

![スクリーンショット 2025-04-02 12.39.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/8532759b-cb55-4364-a4a5-5205e279b242.png)

---

### リソース名とリージョンの設定

Private Endpoint のリソース名とリージョンを入力します。  
ここでは `pe-sql-employeedb` という名前にしました。

![スクリーンショット 2025-04-02 12.40.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/cd396bf8-8a3a-42e9-8e76-bae711f83178.png)

---

### サブネットの選択

先ほど作成した SQL 用サブネット（`subnet-sql-pe`）を指定します。  
このサブネットに、Private Endpoint 用のプライベートIPが割り当てられます。

![スクリーンショット 2025-04-02 12.40.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/d59e419c-7908-4361-b3af-161a1623be07.png)

---

### Private DNS 統合の設定

Private Endpoint 作成時に、**「プライベート DNS ゾーンとの統合」**を有効にしておくことで、  
SQL のFQDN（例：`xxxx.database.windows.net`）が自動的にプライベートIPに名前解決されるようになります。

![スクリーンショット 2025-04-02 12.40.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/5d0e2e4f-74a6-46e9-bcd4-130a5e6a6a6a.png)

> **補足**  
> - この統合によって、App Service などから SQL にアクセスするときに、特別な DNS 設定をせずとも自動的にプライベートIPで解決されるようになります。  
> - 逆に言えば、DNS 統合を行わないと、FQDN がグローバルIPを向いたままになり、通信に失敗します

---
## 名前解決の確認

最後に、Azure Web App から Azure SQL Database の **FQDN（完全修飾ドメイン名）** が  
Private Endpoint の IP に名前解決されているかを確認します。

---

### ① SQL の Private IP を確認

作成した SQL 用の Private Endpoint を確認すると、  
**割り当てられたプライベートIPが `10.0.2.4`** であることがわかります。

![スクリーンショット 2025-04-16 17.23.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/6b4cc372-464e-4432-b83e-2f86c148b7dd.png)

---

### ② Web App の開発ツール（SSH）から `nslookup` を実行

App Service の「開発ツール」→「SSH」にアクセスし、  
`nslookup` コマンドを使って SQL の FQDN を引いてみます。

このとき、**`10.0.2.4` で名前解決されていること**が確認できました。  
これは、Private DNS ゾーンとの統合が正しく機能している証拠です。

![スクリーンショット 2025-04-02 12.44.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/a89a9b39-64e7-4460-a005-5499e623af99.png)

---

### ③ DNS ゾーンにもレコードが自動登録されている

Azure Portal 上の Private DNS ゾーンを確認すると、  
SQL の FQDN と Private IP が関連付けられた Aレコードが登録されていることが確認できます。

![スクリーンショット 2025-04-16 17.25.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/bb86dc4a-7a4e-44a9-95c0-b60e37ce95be.png)

---


このように、**SQL Database のドメイン名がプライベートIPに正しく名前解決されていること**を確認できました。  
これにより、Azure Web App から Azure SQL Database への **閉域接続（Private Access）** が成立していることが確認できました。