Azure PaaSサービスの接続方法について

# はじめに

Azure PaaSサービスへの接続方法を整理したくなり、記事を書いてみました。
アクセス方法に迷った際はこちらを参照いただければと思います。

## 接続方法の説明

### 1\. プライベートエンドポイント

プライベートエンドポイントは、プライベートIPアドレスを利用し、VNet内-PaaSサービス間でプライベートでセキュアな通信を実現する機能です。これにより、VNetやオンプレミス環境からPaaSサービスに対して、インターネットを経由せずにプライベートな通信でアクセスすることが可能になります。
本サービスは利用時間及び受信・送信データに応じて料金が発生します。

利用料：0.01$/時間（1ヵ月利用し続けた場合、約1,100円）
受信データ処理：0.01$/GB
送信データ処理：0.01$/GB

### 2\. サービスエンドポイント

サービスエンドポイントはパブリックIPを利用し、Azureが提供する専用通信経由でVNet内からAzure PaaSサービスへの接続を実現します。また、自前のVNetからの通信に限定してアクセス制御することができるため、インターネット経由に比べセキュアです。さらに、Azure内部で最適化された経路で接続されますので、ネットワーク全体のパフォーマンスも向上します。
本サービスは追加料金なしで利用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3989660/d81187d0-f4dc-d581-6fa6-85593ea55fdb.png)


https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-network-service-endpoints-overview

#### オンプレミスからのアクセスについて
サービスエンドポイントは原則、VNet内の特定のサブネットからのアクセスが制限されていますので、オンプレミスからサービスエンドポイントを経由してPaaSサービスへアクセスすることはできません。
アクセスしたい場合はパターン4のインターネット経由の接続が必要です。


>既定では、仮想ネットワークからのアクセスに限定された Azure サービス リソースは、オンプレミスのネットワークからはアクセスできません。 オンプレミスからのトラフィックを許可する場合は、オンプレミスまたは ExpressRoute からのパブリック IP アドレス (通常は NAT) を許可する必要もあります。 これらの IP アドレスは、Azure サービス リソースの IP ファイアウォール構成を使用して追加できます。

(引用：https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-network-service-endpoints-overview#secure-azure-services-to-virtual-networks)

### 3\. VNet統合

VNet統合は、「PaaSサービスをVNet内に配置できる機能」と思われがちですが、正確には「PaaSサービスがVNetにアクセスできるようになる機能」です。留意事項として、VNet統合を使ってVNet内のリソースからPaaSサービスへ通信することはできませんので、その場合はプライベートエンドポイントを利用する必要があります。
本サービスは追加料金なしで利用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3989660/37390bbe-585a-60fb-7b48-c6368695da8d.png)

https://learn.microsoft.com/ja-jp/azure/app-service/overview-vnet-integration

### 4\. インターネット経由の接続

最もイメージしやすい接続方法かと思います。
パブリックIPアドレスを使用し、インターネット経由でアクセスする方法です。誰でもどこからでもアクセス可能となります。
本サービスは追加料金なしで利用できます。

## サービスエンドポイント・プライベートエンドポイントの使い分け

上記の説明を聞くとこれらの使い分けが難しいと思いますが、セキュリティ・コスト面で選択するのが良いと思います。また、サービスエンドポイントに対応するサービスは限られるため、後に記載されている一覧表を参考にしてみてください。

・機密性の高いデータを扱っており、料金がかかってもよいのでプライベートな環境で通信したい。
→プライベートエンドポイント
・そこまで重要なデータを扱っていない。できるだけクラウド費用を安く抑えたい。
・利用サービスがサービスエンドポイントに対応している。
→サービスエンドポイント


## 主要PaaSサービスで利用可能な通信サービス一覧

各サービスで利用可能なサービスを一覧化しました。
|                              | プライベートエンドポイント | サービスエンドポイント | VNet統合 | インターネット |
| ---------------------------- | ------------- | ----------- | ------ | ------- |
| Storage Account              | 〇             | 〇           | ×      | 〇       |
| Database for PosgreSQL・MySQL(Flexible Server) | 〇             | 〇           | 〇※1     | 〇       |
| SQL Database                 | 〇             | ×           | 〇※1     | 〇       |
| Cosmos DB                    | 〇             | 〇           | ×      | 〇       |
| Cache for Redis              | 〇             | ×           | △  ※2    | 〇       |
| Functions                    | 〇             | 〇           | 〇      | 〇       |
| Container Apps               | 〇             | ×           | 〇      | 〇       |
| App Service                  | 〇             | 〇           | 〇      | 〇       |
| OpenAI Service                      | 〇             | 〇           | ×      | 〇       |
| API Management               | 〇             | ×           | 〇      | 〇       |

※1 Database for PosgreSQL・MySQL、SQL Databaseは例外的に、VNet統合を利用することで、VNet内のリソースから当該DBにもアクセスすることができます。（おそらく他のVNet統合とは異なるサービスなのかもしれません。）
https://learn.microsoft.com/ja-jp/azure/postgresql/flexible-server/concepts-networking-private

※2 Cache for RedisもDatabase for PosgreSQL・MySQLと同様、VNet内のリソースから当該DBへのアクセスができます。ただし、MS公式からはエラーが発生しやすくなるため、VNet統合の利用は非推奨とされています。
https://learn.microsoft.com/ja-jp/azure/azure-cache-for-redis/cache-how-to-premium-vnet


### (おまけ)Database for PostgreSQLへの通信経路

運用保守端末からPaaS型DBへのセキュアな通信経路を記載します。
主な選択肢としては以下2つになるかと思います。

①運用保守端末→Bastion→Private Endpointを経由してアクセス
②運用保守端末→VPN Gateway→Private Endpointを経由してアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3989660/ccb416ec-c2a3-061b-4c3c-24a27ce7a03a.png)


https://learn.microsoft.com/ja-jp/azure/postgresql/flexible-server/concepts-networking-private-link