Azure Functionsを利用したリバースプロキシ

# Azure Functions Proxy + Azure AD + NAT Gatewayを利用したリバースプロキシ

## はじめに
Azure上にリバプロ作ってくれない？っていう依頼が多く、かつユーザーは、Azureでのシステムの認証済みのユーザーのみに制限したいという追加要望がありました。
せっかくなので、出来るかを検証してみたいと思います。

### Azure構成図
構成図のように、Azure Functions ProxyとNAT Gatewayそして、認証サーバーをAzure ADとしたEasyAuthで検証してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/58cbab0a-fe7b-086b-0881-608c24764a1a.png)

## Functions Proxy
[Azure Functions プロキシの操作](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-proxies)の通り、Azure Functionsを構築していきます。
App Serviceでは、外部連携などでIPアドレスを使ったアクセス制限が必要な場合には若干の問題がありましたが、[NAT Gateway](https://docs.microsoft.com/ja-jp/azure/virtual-network/nat-gateway-resource)を利用することにより、IPアドレスの固定ができるようになりました。
**※ NAT Gatewayを利用するにはサービスプランをPremium V2、またはPremium V3プランにする必要がある点に注意です。**

### Functionsの作成
いつもの通り、Azure Functionsを作成します。前に書いた通り、NAT Gatewayを利用するためには、Regional VNET Integrationをする必要があるので、Premium V2、またはPremium V3プランである必要があります。
- 参考：[NATゲートウェイとアプリの統合](https://azure.github.io/AppService/2020/11/15/web-app-nat-gateway.html)

### Proxyの作成
Functionsのメニューからプロキシを選択後、「＋追加」をクリックし、情報を入力後、作成を押下することで完了します。これで、プロキシURLにマッチするすべのアクセスがバックエンドURLに行きます。

- 名前：任意
- ルートテンプレート：{*all}
- 許可されるHTTPメソッド：任意
- バックエンドURL：宛先/{all}

※ ルートテンプレートについては、「[ルート テンプレートのパラメーター](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-proxies#route-template-parameters)」を参照ください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/c5a55c01-02af-f5bf-fc70-7fbf6aa9b545.png)

## Nat Gateway
### VNETの作成
NAT Gatewayを利用するには、まずVNETを作成します。
「[仮想ネットワークの作成](https://docs.microsoft.com/ja-jp/azure/virtual-network/quick-create-portal#create-a-virtual-network)」の通り、VNETを作成します。

### NAT Gatewayの作成
以下の通り、作成していきます。

1. 基本
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/5c883a5f-f357-779e-a191-1a7a0ec5379e.png)

2. 送信IP
パブリックIPを新規に作成します。（名前は任意に決めてください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/d3198b09-4043-f469-206d-fe286b6ddd0d.png)

3. サブネット
先程作成したVnetを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/ee5c15b8-925a-245a-a539-a93a6e5267fb.png)

後は、デフォルトで作成していきます。
作成後、VNETで指定したサブネットをクリックし、NATゲートウェイが選択されていることを確認し、サブネットをサービスに委任で「Microsoft.Web/serverFarms」を指定し、保存してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/56f80f0f-bfd8-7f22-a556-964a23223a99.png)

## Regional VNET Integration
続いて、Functionsのネットワークを選択し、VNET統合で先程作成した、VNETとサブネットを選択し、VNET統合を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226944/3dcc44dc-0fce-82b2-c0e7-dee889970b95.png)

## Functionsのアプリケーション設定
NAT Gatewayを利用するためにはプライベートエンドポイントと同様にアプリケーション設定に、「WEBSITE_VNET_ROUTE_ALL」の有効(1)を設定として追加する必要があります。
参考：[リージョンでの仮想ネットワーク統合](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-networking-options#regional-virtual-network-integration)

## IPアドレス
NAT Gatewayを作成した際に作成したパブリックIPでIPアドレスを取得し、外部システムのホワイトリストに登録します。

## Easy Auth
「[Azure AD ログインを使用するように App Service または Azure Functions アプリを構成する](https://docs.microsoft.com/ja-jp/azure/app-service/configure-authentication-provider-aad)」に従って、コードレスに認証をかけます。

以上で、リバースプロキシが構築出来ました。