Azure Private Endpointを使ってExpressRoute(Private Peering)経由でBlob Storageに接続する

プライベートエンドポイントと似た機能で、サービスエンドポイントというものがあります。

サービスエンドポイントは、vNetに配置されたAzure VMからPaaSへの通信時に、インターネットに出ずにMicrosoftネットワーク内で閉じたアクセス（ルーティング）が可能です。あくまでもルーティングなので、対象のPaaSにはプライベートIPは付与されません。

プライベートエンドポイントでは、PaaSにvNet内のプライベートIPを割り当てることができるため、オンプレからExpress Route(Private Peering)経由で直接アクセスが可能です。

今回はStorage Accountにプライベートエンドポイント設定を入れて、オンプレからExpress Route(Private Peering)を介してアクセスすることが可能かをみていきます。

# 前提
* Express Route(Private Peering)接続されたvNetが存在すること
* Storage Accountが作成されていること

# テスト用ファイルの仕込み
* テスト用コンテナーと適当なファイルをアップロードしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/02418645-9677-ac19-d51d-02106afecce4.png)

* コンテナーのアクセスレベルはプライベートにしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/9f853c65-0832-ebde-2cfc-eecc5158508c.png)

# Private Link(プライベートエンドポイント)を作成する
* Azure Portalの検索バーより「Private Link」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/a82fcd9a-4da9-5539-1af3-450f08509cef.png)

* [プライベートエンドポイント]を選択し、[作成]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/06fa8172-da58-db13-d4f4-fa2e9b453153.png)

* リソースグループやエンドポイント名を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/4101c82e-d91e-2de9-3a7b-5b6f3fcc9a27.png)

* 以下のように設定します。
    * リソースの種類：Microsoft.Storage/storageAccounts
    * リソース：事前に作成したストレージアカウント
    * 対象サブリソース：blob
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/bb4bb7d9-3b1c-0f56-57e6-08afdac2af92.png)

    * Table/DataLakeなどそれぞれサブリソース毎にエンドポイントが必要です。今回はBlobを選択しています。

* プライベートエンドポイント接続させたい仮想ネットワークとサブネットを選択します。ここは空のサブネットでなくてよいです。今回はExpressRoute(Private Endpoint)の仮想ネットワークを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/0648eab9-6570-cf38-1dd3-6861550b5958.png)

* プライベートDNSは有効にしておきます。オンプレから接続する分には使わないのですが、同じ仮想ネットワークからアクセスする場合、プライベートDNSがBlobのプライベートIPを名前解決してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/e6e2a86a-eceb-04a8-e86e-34382f4acc7f.png)

* ここまで入力してプライベートエンドポイントを作成します。数分でプライベートエンドポイントが作られます。
* プライベートエンドポイントが作成されたら[DNSの構成]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/9c9aa9d6-2603-0c5d-e3f8-2b0c6c7e3298.png)

* プライベートIPが振られていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/5acfa8af-674f-3e06-40f8-9c1bc61786e5.png)

# プライベートエンドポイント以外からのアクセス拒否
* ストレージアカウントの左バーから[ネットワーク]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/386c8ccc-0d3f-e120-b3f8-5771db9a128f.png)

* 許可するアクセス元をプライベートエンドポイントからのみに制限するため、[選択されたネットワーク]を選択し保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/173e29d4-71e3-5611-fa78-1cf5e584d11f.png)

# 接続確認
## ストレージアクセスキー取得
* 接続確認にはストレージアクセスキーを使います。ここはSASでもよいです。
* ストレージアカウントの左バーから[アクセスキー]を選択し、キーをコピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/2a68aa2a-fbd3-3cf9-b6e0-b0faea678f19.png)

## Cloud Shellから接続確認
* まずはパブリックアクセスが不可であることを確認するためにCloud Shellを開きます。
* 以下コマンドを実行し、BLOB一覧が表示されるか確認します。

```
az storage blob list -c [Your Storage Blob Container Name] --account-key [Your Storage Access Key] --account-name [Your Storage Account Name]
```

* 以下のようなエラーメッセージが出力し、アクセスがブロックされていることが分かります。想定通りです。

```
The request may be blocked by network rules of storage account. Please check network rule set using 'az storage account show -n accountname --query networkRuleSet'.
If you want to change the default action to apply when no rule matches, please use 'az storage account update'.
```

## 自PCから接続確認
* まずは自PCからの名前解決を確認します。

```
ping kwhrblobendpointtest.blob.core.windows.net

blob.tyo20prdstr07a.store.core.windows.net [20.60.248.65]に ping を送信しています
```

* パブリックIPを引いてきてますね。独自DNSに設定すればよいのですが、今回は環境がないため、hostsで上書きしてみます。

```
ping kwhrblobendpointtest.blob.core.windows.net

kwhrblobendpointtest.blob.core.windows.net [10.x.x.x]に ping を送信しています
```

* プライベートIPを設定しました。
* それではこの状態でアクセス可能かを確認してみます。Azure CLIで以下コマンドを実行します。

```
az storage blob list -c [Your Storage Blob Container Name] --account-key [Your Storage Access Key] --account-name [Your Storage Account Name]
```

* 今回は問題なくBlob一覧が表示されたはずです。Express Route(Private Peering)経由もしくはプライベートエンドポイント接続先仮想ネットワークからのみアクセスが可能な状態になっています。
* もしオンプレがProxyを使っている場合は、PCの環境変数NO_PROXYに```.blob.core.windows.net```を設定してあげればProxyを介さずにExpressRoute経由になります。

以上