Azure Storage の Private Endpoint 上でのコピーブロブのサポートを試しました

1 月末に、プライベートエンドポイントを使用して保護されているストレージ アカウント間のデータコピーができるようになりました。以下がそのアップデート情報です。

[参考：Generally available: Copy Blob support over private endpoints in Azure Storage](https://azure.microsoft.com/ja-jp/updates/copy-blob-support-over-private-endpoints/?WT.mc_id=AZ-MVP-5003113)

> Azure Storage では、一方または両方のアカウントがプライベートエンドポイントを使用して保護されているストレージ アカウント間でデータをコピーできるようになりました。これには、Copy Blob や AzCopy over Private Endpoints などのユーティリティのサポートが含まれます。この機能は、一方のアカウントがプライベートエンドポイントを使用し、もう一方がサービスエンドポイントを使用するストレージアカウント間でデータをコピーすることもできます。Azure Storage は、データのコピーを許可する前に、クライアントがソースとデスティネーションの両方のストレージアカウントにアクセスできることを検証します。

この機能を実際にどのように使用すればいいのか試してみました。


# ストレージ アカウントを用意

まず、以下の方法で接続できるストレージ アカウントを用意します。

1. プライベート エンドポイント
2. パブリック エンドポイント (選択されたネットワーク ※サービス エンドポイント)
3. パブリック エンドポイント (すべてのネットワーク)

以下のドキュメントを参考に各 Azure リソースを作成します。
※1.と2.については、インターネット経由からのアクセスを遮断します。[こちら](https://qiita.com/tetsuya-ooooo/items/3903155e7cbf0fe75a1c#%E3%83%91%E3%83%96%E3%83%AA%E3%83%83%E3%82%AF%E3%81%AA%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%82%92%E9%81%AE%E6%96%AD%E3%81%99%E3%82%8B)をご参考ください。

[参考：チュートリアル:Azure プライベート エンドポイントを使用してストレージ アカウントに接続する](https://docs.microsoft.com/ja-jp/azure/private-link/tutorial-private-endpoint-storage-portal?WT.mc_id=AZ-MVP-5003113#create-storage-account-with-a-private-endpoint)
[参考：チュートリアル: Azure Portal を使用して仮想ネットワーク サービス エンドポイントで PaaS リソースへのネットワーク アクセスを制限する](https://docs.microsoft.com/ja-jp/azure/virtual-network/tutorial-restrict-network-access-to-resources?WT.mc_id=AZ-MVP-5003113)
[参考：Azure portal を使用してサービス エンドポイント ポリシーを作成、変更、または削除する](https://docs.microsoft.com/ja-jp/azure/virtual-network/virtual-network-service-endpoint-policies-portal?WT.mc_id=AZ-MVP-5003113)


# 検証環境の紹介

検証するために以下のような環境を作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/0d4beb12-d193-1f6d-ee9c-8986f904efb3.png)

仮想マシン (demo-vm) から各ストレージアカウントのエンドポイント (FQDN) に対して「nslookup」を実行して IP アドレスを確認します。実行結果は以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/74d8954e-9e47-a7db-f984-d98734e7dc31.png)

Private Endpoint を設置したストレージ アカウントからは、仮想ネットワーク上のプライベート IP アドレスが返されます。また、Service Endpoint を構成したストレージ アカウントとパブリックなストレージアカウントからは、パブリック IP アドレスが返されます。


# 検証してみよう


## AzCopy で検証

以下のドキュメントから AzCopy をダウンロードして、任意のフォルダーに解凍しましょう。
また操作方法もこのドキュメントを参考にします。

[参考：AzCopy v10 を使用して Azure Storage にデータをコピーまたは移動する](https://docs.microsoft.com/ja-jp/azure/storage/common/storage-use-azcopy-v10?WT.mc_id=AZ-MVP-5003113)

以降からの検証では Azure ポータルで SAS トークンを生成して、各ストレージ アカウントにアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/a30596f5-bcf7-9ed9-45fb-6bdc15dab1d8.png)

生成された SAS トークンは忘れずにメモっておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/1f235777-d4bc-4858-e145-8164084b39d6.png)

使用時にはリソース URL にメモっておいた SAS トークンを含めます。

` https://privatesto1.blob.core.windows.net/test1/aaaaa.txt?sv=<SAS トークン> `

[参考：Shared Access Signatures (SAS) を使用して Azure Storage リソースへの制限付きアクセスを許可する](https://docs.microsoft.com/ja-jp/azure/storage/common/storage-sas-overview?WT.mc_id=AZ-MVP-5003113)


### ストレージ 間での Blob コピー

ストレージ 間で Blob のコピーを以下のパターンで検証しています。

1. Private Endpoint ⇔ Private Endpoint (privatesto1 ⇔ privatesto2)
2. Private Endpoint ⇔ Service Endpoint (privatesto1/2 ⇔ publicsto3)
3. Private Endpoint ⇔ Public Endpoint (privatesto1/2 ⇔ publicsto4)
4. Service Endpoint ⇔ Public Endpoint (publicsto3 ⇔ publicsto4)

[参考：AzCopy v10 を使用して Azure ストレージ アカウント間で BLOB をコピーする](https://docs.microsoft.com/ja-jp/azure/storage/common/storage-use-azcopy-blobs-copy?WT.mc_id=AZ-MVP-5003113)


#### 1. Private Endpoint ⇔ Private Endpoint

Private Endpoint 間の Blob コピーは成功しました。:ok_woman_tone1:

- privatesto1 (Private Endpoint) → privatesto2 (Private Endpoint)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/71ad7d7b-f6a2-98b5-399f-f44ab283e2ca.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/c115e372-dcd2-8444-3a33-78aa92c3dd2b.png)


#### 2. Private Endpoint ⇔ Service Endpoint

Private Endpoint と Service Endpoint との間の Blob コピーは双方向とも成功しました。:ok_woman_tone1:

- privatesto2 (Private Endpoint) → publicsto3 (Service Endpoint)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/655f5374-2fec-ea20-2d52-fc60561dade9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/b5c58365-cd44-bfd2-76ba-3fcaefb9f089.png)


- publicsto3 (Service Endpoint) → privatesto2 (Private Endpoint)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/1339093b-f1a0-9247-3253-59033503d219.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/a294f758-ee64-af1a-bf74-b9382fa300fd.png)


#### 3. Private Endpoint ⇔ Public Endpoint

Private Endpoint と Public Endpoint との間の BloB コピーは双方向とも成功しました。:ok_woman_tone1:

- privatesto1 (Private Endpoint) → publicsto4 (Public Endpoint)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/7b2399a5-2728-d6d9-31f0-683fb9d06d06.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/8f5fd3a9-5273-830d-14d4-17454b91e35b.png)


- publicsto4 (Public Endpoint) → privatesto1 (Private Endpoint)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/f8b76e32-366b-1a28-ca61-134d45816304.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/3f6dbaf1-efbd-7add-41af-bb9bfee15e59.png)


#### 4. Service Endpoint ⇔ Public Endpoint

Service Endpoint と Public Endpoint との間の BloB コピーは双方向とも成功しました。:ok_woman_tone1:

- publicsto3 (Service Endpoint) → publicsto4 (Public Endpoint)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/ab4d2ff9-7a4c-e376-90ad-20177978a9cd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/30f3bdea-8f0a-1805-ee82-dfe0e29ad0ab.png)


- publicsto4 (Public Endpoint) → publicsto3 (Service Endpoint)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/866f86fb-58ed-57f9-a3a5-5aa68a8a3c97.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/2bc79e3c-811b-9d9a-758a-9634737705d0.png)


## Azure Storage Explorer で検証

[Azure Storage Explorer](https://azure.microsoft.com/ja-jp/features/storage-explorer/?WT.mc_id=AZ-MVP-5003113) でも操作を検証します。

[参考：Azure Storage Explorer の概要](https://docs.microsoft.com/ja-jp/azure/vs-azure-tools-storage-manage-with-storage-explorer?WT.mc_id=AZ-MVP-5003113&tabs=windows)
[参考：クイック スタート:Azure Storage Explorer を使用して BLOB を作成する](https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-quickstart-blobs-storage-explorer?WT.mc_id=AZ-MVP-5003113)


### ストレージ アカウントへ接続

Private Endpoint を経由してストレージ アカウントに接続する場合、以前は「接続文字列」を指定して接続していたと思います。
※勘違いだったらゴメンナサイ。
今回は Azure アカウントで接続しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/e9005b1b-7ff3-9631-64da-7483ffe10c79.png)

はい。すべて問題なく接続できました。:ok_woman_tone1:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/191c6849-4244-6278-abfd-6f404c815aa4.png)


### ストレージ 間での Blob コピー

AzCopy と同じように、ストレージ 間で Blob のコピーを以下のパターンで検証しています。

1. Private Endpoint ⇔ Private Endpoint (privatesto1 ⇔ privatesto2)
2. Private Endpoint ⇔ Service Endpoint (privatesto1/2 ⇔ publicsto3)
3. Private Endpoint ⇔ Public Endpoint (privatesto1/2 ⇔ publicsto4)
4. Service Endpoint ⇔ Public Endpoint (publicsto3 ⇔ publicsto4)


#### 1. Private Endpoint ⇔ Private Endpoint

Private Endpoint 間の Blob コピーは成功しました。:ok_woman_tone1:

- privatesto1 (Private Endpoint) → privatesto2 (Private Endpoint)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/dda86a83-3884-9b40-403d-355edee85170.png)


#### 2. Private Endpoint ⇔ Service Endpoint

Private Endpoint と Service Endpoint との間の Blob コピーは双方向とも成功しました。:ok_woman_tone1:

- privatesto2 (Private Endpoint) → publicsto3 (Service Endpoint)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/cb66ce1b-7b6a-cdfe-7cda-df17d51749bb.png)

- publicsto3 (Service Endpoint) → privatesto2 (Private Endpoint)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/eb66c850-807c-0a8c-83ea-0b0b659a73d1.png)


#### 3. Private Endpoint ⇔ Public Endpoint

Private Endpoint と Public Endpoint との間の BloB コピーは双方向とも成功しました。:ok_woman_tone1:

- privatesto1 (Private Endpoint) → publicsto4 (Public Endpoint)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/b81064b1-6e10-b3e4-e664-5ca6f429495f.png)

- publicsto4 (Public Endpoint) → privatesto1 (Private Endpoint)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/2c343330-1971-c958-75ae-be684faa0564.png)


#### 4. Service Endpoint ⇔ Public Endpoint

Service Endpoint と Public Endpoint との間の BloB コピーは双方向とも成功しました。:ok_woman_tone1:

- publicsto3 (Service Endpoint) → publicsto4 (Public Endpoint)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/26c35a43-fd07-c286-cd20-4c286f53d099.png)

- publicsto4 (Public Endpoint) → publicsto3 (Service Endpoint)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/ca90a57d-3b28-88b8-0bba-7c4bca7e04b2.png)


# まとめ

試してみた結果、エンドポイントに関係なくすべて正常に動作しました。:ok_woman_tone1:
AzCopy も Azure Storage Explorer も今までと同じように使用できるので、困らずに済みますね。