Private Endpointを利用してAure AI Servicesに社内回線からのみ接続するようにしてみた

## 背景
AzureのAI Services（Cognitive Services）を使いたいと社内から言われることありますよね。もちろん有効活用して欲しい一方で、インターネットにどーんと公開するのもちょっと…。
と、いうことで今回はAI Servicesの中でも音声サービスをPrivateEndpointを設定することで社内LANからのみ利用できるようにしてみたいと思います。

目指す形としてはこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/e57beb59-b0b8-ffa7-66b2-c2d128855de1.png)
Private Endpointは同仮想ネットワーク内から172.xxx.xxx.xxxなどのプライベートIPでPaaSサービスに接続できるようになる機能ですが、今回はそれに加えて社内のオンプレからも接続できるようにしようというものです。


※本記事は
Azure領域を基本的に閉域で利用している（ExpressRouteなどで社内LANからのみ接続できる）環境の方向けになります。


## 事前準備
### 音声サービスをデプロイする
もちろん後からやってもいいんですが、とりあえずデプロイしておいて後からネットワーク設定をすれば変にデプロイが失敗することなく心穏やかなんじゃないかなぁと思います。

まずはAzure Portalにログインし、AI services - 音声サービスと入って、「作成」から新規作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/a64d522c-3f5c-cd09-abbd-ccc7c8337baa.png)
サブスクリプションやリソースグループなどは適当なものを選んでください。価格レベルはまずはFreeで試してもらうと良いと思います。画像の環境では既にFreeでデプロイしてるので選択できませんでしたね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/0641887f-b01f-b414-1870-cf0de4009f1e.png)
ネットワークの部分は後で設定を行うのでここではすべてのネットワークで一旦作っても大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/7ced8137-24df-02fd-5556-7a87f90ae515.png)
IdentityやTagsは必要があれば設定してデプロイして完了です。


### v-netのサブネットを設定する
後々、PrivateEndpointで設定するプライベートIPのためにまずはセグメントの設定をしておきます。この辺りは既に設定してあるものがあればスルーで大丈夫です。
私はこういったAi Services用にサブネットを作っておこうとなったのでやってみました。細かい設定事項は各会社の要件になるのでどこ触ったかだけ記載しておきます。

#### NSG（ネットワークセキュリティグループ）を設定する
サブネットを設定したところで、デフォルトではインターネットからようこそしてしまいます。たぶんセグメントごとなどでNSGを設定しているのでは無いかと思いますので、今回サブネットを設定するIPアドレス範囲用にもNEGを設定します。
今回は他のAzureのサービスと同様にAI Servicesを使おう！というものなので、他のNEGと同じように設定すれば大体OKかなと思います。

#### ルートテーブルを設定する
こちらもNEG同様です。今回設定するサブネットのIPアドレスの範囲用にも設定しましょう。既存の設定をマネすれば大体OKでしょう。

#### サブネットを設定する
Azure portal - 仮想ネットワーク - 既存のネットワークを選択 - 設定 - サブネット　から今回使うIPアドレスの範囲のサブネットを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/1c95969b-5e81-7186-8206-bd4327076dac.png)
NSGとルートテーブルのところで先ほど設定したものを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/69b7bfa5-f1f7-a9d8-2e2d-d7c624f0b624.png)

#### 同サブネット内に仮想マシンを立てる
必須ではありませんが、Private Endpointを作った際に疎通確認を行うのに使用します。
nslookupするだけなのでマシンのサイズなどは安いので良いですがB1sとかだとコマンドプロンプトもままならなかったりする程重いので最安値まで攻めない方が良いです（1敗）。


## PaaSサービスに社内LANから接続できるようにする
本編です。
具体的にはこの形を目指します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/6f3a8a04-4ba4-1ad0-f833-b1d9a8ff41f4.png)


### Private Endpointを作成する
Private Endpointは
・各サービスの設定内から
・プライベートエンドポイントメニューから
どちらからでも作れますが、前者の方が楽そうなので本記事では前者のやり方で記載します。

デプロイした音声サービスのネットワーク設定内の「プライベートエンドポイント接続」欄から「＋プライベートエンドポイント」をクリックして作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/2c87718e-3afd-26a7-549b-f63bb2e49ee9.png)
既にあるリソースから作成するとリソースグループなどが最初から入っていて楽です。名前は適当なものを入力すればネットワークインターフェイスの方も自動で入ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/81f8573a-b607-3410-f1e2-b45396ac236c.png)
リソースタブは自動で入っている値で大体大丈夫かなと、
ネットワークタブはサブネットを上記で用意したものにして、プライベートIPを静的に割り当てます。名前は適当に。
アプリケーションセキュリティグループなるものも設定できますが、設定したサブネットのNSGもあるのでそれで十分でしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/f136353f-97ad-cb5f-7dee-391a7312d83e.png)
DNSタブも自動で入っているもので大丈夫だと思います。あとは必要に応じてタグをつけて作成します。

完了すると、接続状況が承認済みになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/1e101460-f4bf-04ec-bbdd-878a760baa18.png)
そしたら「Firewalls and virtual networks」タブに移動して、「無効」に設定します。日本語の説明がかなり分かりにくいですがこれでPrivate Endpointからのみこのリソースにアクセスできる状態になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/fe6dd605-d821-b7f4-5736-9c10f1be124d.png)

### 疎通確認1
一応、必須ではないですが。
上記Private Endpointと同じサブネット内にあるVMから疎通確認を行います。

VMへリモートデスクトップで入り、コマンドプロンプトで
```
nslookup <リソースのエンドポイント>
```
を実行します。
リソースのエンドポイントにはリソースの「キーとエンドポイント」内にあるエンドポイントの内、最初の「https://」と最後の「/」を除いた間のものを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/fadb1d75-2900-c236-2e42-97ec644af04d.png)
通信が取れていればプライベートIPが返ってくるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/d2fe9b22-0014-e537-96b3-f1f194441916.png)
これでこの部分が完成したことが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/de166138-ab35-3203-787b-7b15ca49e44d.png)

### FirewallのDNSプロキシ構成
Private Endpointとしては上記で完了なのですが、我々は会社にあるPCからも接続したい…けれども上図にあるAzure内専用DNSはVMからでないとアクセスできない…。
そこで、AzureのFireWallにDNSプロキシの設定を入れることで、外からつつけるAzure内へのプロキシの役割を担ってもらいます。
すなわちこの部分↓の設定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/50699212-4346-3ba1-327d-712a2e42a245.png)

既にAzureのFirewallがある前提で話を進めますが、Firewallの設定から始める場合は下記の記事が参考になるかと思います。
[Azure FirewallのDNSプロキシ機能を試してみた(前編 ～Azure Private EndpointとAzure DNS Private Zone～)](https://qiita.com/hidekko/items/c8251d4605c48bab429b)

では既存のAzure Firewallに追加で設定する前提で、
Azure Portal→ファイアウォール→Azure Firewall→設定したい既存のFirewall→設定→DNSと進み、
→・有効にチェック
　・DNS ServicesはDefault（先のAzure内専用DNS）
　・DNS ProxyをEnabled
にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/94781795-feb6-6c53-51f3-5ebfa869922b.png)


### 疎通確認2
Azure Firewallがプロキシとして機能してくれているか確認します。
社内PCからコマンドプロンプトで
```
nslookup <リソースのエンドポイント> <Azure FirewallのIP(172.yyy.yyy.yyy)>
```
を実行します。
これでPrivate EndpointのIPが返ってくれば無事下の図のような状況が出来ていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/f28a6c64-028c-30ee-7e81-05d53274eb1f.png)

### 内部DNSの設定
最後の設定項目です。
普段PCからサービスを利用する上では上記のようにいちいちAzure Firewallに聞きに行って…としていられません。
そこで会社の内部DNSに特定の向け先へはAzure Firewallに聞きに行くように設定します。
設定項目は下記の二つです。
・privatelink.cognitiveservices.azure.com 
・リソースのエンドポイント

利用するリソースのエンドポイントだけなく、1つ目の方も併せて設定する必要があるようです。

### 疎通確認3
いよいよ最後の確認です。
社内PCからコマンドプロンプトで
```
nslookup <リソースのエンドポイント>
```
を実行します。
これでPrivate EndpointのIPが返ってくれば晴れて下の図のような環境が完成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640351/6733b50a-49b2-9c4b-2bca-adc5664f6f5d.png)

Private Endpointの通信には課金が発生しますが、これでPaaSも閉域に！
安心して利用できますね。

お疲れ様でした。