はじめに
本記事では、Azure Storage へのアクセスを閉域網(プライベート IP)に限定する Private Endpoint(プライベートエンドポイント) の設定手順を紹介します。
Azure Storage や SQL Database などの PaaS サービスは、標準状態ではインターネット経由(パブリック IP)でアクセスする仕様になっています。しかし、エンタープライズ環境やセキュリティ要件が高い案件では、「インターネット経由のアクセスを禁止し、社内ネットワークからのみ接続させたい」 という要件が必須となるケースが多々あります。
今回は、仮想ネットワーク(VNet)内の仮想マシンから、Private Endpoint を経由して、インターネットに出ることなくセキュアに Blob Storage へ接続する環境を構築します。
- Private Endpoint を使用した Blob Storage への接続構成
- 閉域接続における DNS(Private DNS Zone)の役割
- Azure Bastion(Standard)を利用したファイル転送と閉域操作
構成概要と仕組み
設定に入る前に、今回構築する環境と、Private Endpoint を理解する上で最も重要な「DNS の仕組み」について解説します。
検証構成
今回は以下の構成を作成します。 クライアントとなる仮想マシン(VM)はパブリック IP を持たず、インターネットから隔離されています。 VM から Storage へのアクセスは、Private Endpoint を介して Azure のバックボーンネットワークのみを通ります。

Private Endpoint とは
Private Endpoint は、Azure の PaaS サービス(Storage, SQL Database など)に対して、自分の VNet 内のプライベート IP アドレス を割り当てる機能です。
- 通常(パブリックエンドポイント): インターネット上のパブリック IP アドレスに対してアクセスします。
- Private Endpoint: VNet 内の
10.0.0.5のような プライベート IP アドレス に対してアクセスします。
これにより、あたかも「同じ LAN 内にあるファイルサーバー」にアクセスするような感覚で、セキュアにクラウドサービスを利用できるようになります。
Private Endpoint を導入する際、最も重要なのが DNS 設定 です。ここが設定されていないと、せっかく Private Endpoint を作っても接続できません。
なぜ DNS が必要なのか?
Private Endpoint を有効にしても、接続先の URL(FQDN)は mystorage.blob.core.windows.net のまま変わりません。 しかし、クライアント(VM)がこの URL にアクセスしようとした際、通常の DNS(インターネット上の電話帳)を使ってしまうと、「パブリック IP」 が返ってきてしまいます。これでは Private Endpoint を通りません。
そこで、「この URL の正解は、パブリック IP ではなくプライベート IP(10.x.x.x)だよ」 と VNet 内のサーバーに教えてあげるための Private DNS Zone(専用の電話帳) が必要になります。
本手順では、この DNS 統合も含めて設定を行っていきます。
設定手順①: 検証用リソースの作成 (VM / Bastion)
まずは、検証の土台となる仮想ネットワークと、クライアント役の仮想マシン、そしてそこへ安全に接続するための踏み台(Azure Bastion)を作成します。
- Azure Portal 上部の検索バーで「仮想ネットワーク」を検索し、[作成] をクリックします。
- [基本] タブで以下を入力します。
- リソースグループ: 新規作成 (例:
rg-private-link-test) - 名前: 任意の VNet 名 (例:
vnet-test) - 地域: 任意のリージョン (例:
Japan East)
- リソースグループ: 新規作成 (例:
- [IP アドレス] タブへ進みます。
- デフォルトのアドレス空間 (
10.0.0.0/16) で問題ありません。 - デフォルトのサブネット (
default) があることを確認します。 - 【重要】 Bastion 用のサブネットを追加します。
- [サブネットの追加] をクリック。
- 名前:
AzureBastionSubnet(※この名前は固定です!) - アドレス範囲:
10.0.1.0/26(または/24)
- デフォルトのアドレス空間 (
- [レビューと作成] をクリックして作成します。

次に、ブラウザ経由で VM に RDP 接続するための Bastion を作成します。今回はファイル転送機能を使わない(VM 内で直接 DL する)ため、安価な Basic SKU を使用します。
- 検索バーで「Bastion」を検索し、[作成] をクリックします。
- 以下のように設定します。
- 名前: 任意の名前 (例:
bas-test) - 地域: VNet と同じリージョン
- 仮想ネットワーク: 先ほど作成した
vnet-testを選択 (自動的にAzureBastionSubnetが選ばれます)
- 名前: 任意の名前 (例:
- SKU の設定
- レベル(SKU): Basic を選択します。
- [確認と作成] をクリックしてデプロイします。
- (※デプロイには 10〜15分ほど時間がかかります。待っている間に次の VM 作成へ進みましょう)

検証用のクライアント端末を作成します。インターネットからの直接アクセスを遮断するため、パブリック IP は付与しません。
- 検索バーで「仮想マシン」を検索し、[作成] > [Azure 仮想マシン] を選択します。
- [基本] タブ:
- 仮想マシン名: 任意の名前 (例:
vm-client) - 可用性オプション: インフラストラクチャ冗長は必要ありません
- セキュリティの種類: Standard
- イメージ: Windows Server 2022 Datacenter など
- 管理者アカウント: ログイン用のユーザー名とパスワードを設定
- 仮想マシン名: 任意の名前 (例:
- [ネットワーク] タブ (※ここが重要です!):
- 仮想ネットワーク:
vnet-test - サブネット:
default - パブリック IP:「なし (None)」 を選択
- ※ここを「なし」にすることで、この VM はインターネットから直接到達できなくなります(閉域化)
- 仮想ネットワーク:
- [確認と作成] をクリックして作成します。

これで、インターネットから隔離された「閉域 VM」と、そこに接続するための「入り口(Bastion)」の準備が整いました。
設定手順②: ストレージアカウントの作成
接続先となる Azure Storage を作成し、テスト用のファイルをアップロードするための「コンテナ」を準備します。
- Azure Portal の検索バーで「ストレージ アカウント」を検索し、[作成] をクリックします。
- [基本] タブで以下のように設定します。
- リソースグループ: 作成済みのグループ (例:
rg-private-link-test) - ストレージアカウント名:全世界で一意の名前 を入力してください (例:
stprivatelinktest2026)- ※すでに誰かが使っている名前は使用できません。
- 地域: VNet と同じリージョン (例:
Japan East) - 冗長性: テスト用なので 「ローカル冗長ストレージ (LRS)」 で十分です(コスト節約)
- リソースグループ: 作成済みのグループ (例:
- [ネットワーク] タブを確認します。
- パブリック ネットワーク アクセス: 「無効」 を選択します。
- ※これにより、インターネットからのアクセスを最初から完全に遮断します。この時点ではまだどこからも接続できない「孤立したストレージ」となります。
- [確認] > [作成] をクリックしてデプロイします。

ストレージアカウントができたら、その中にファイルを保存するための箱(コンテナ)を作成します。
- 作成したストレージアカウントのリソース画面へ移動します。
- 左メニューの [データ ストレージ] > [コンテナ] をクリックします。
- 上部の [+ コンテナ] をクリックします。
- 以下のように設定して [作成] をクリックします。
- 名前: 任意の名前 (例:
test-container) - パブリック アクセス レベル:「プライベート (匿名アクセスなし)」
- ※ここを「プライベート」にしても、認証を通せばアクセス可能です。今回はセキュアな構成を目指すため、匿名アクセスは許可しません。
- 名前: 任意の名前 (例:

これで、接続先となるストレージと、ファイルの格納場所が準備できました。
設定手順③:Private Endpoint の作成と DNS 設定
いよいよ本記事のメイン設定です。 ストレージアカウントに対して Private Endpoint(プライベート接続口)を作成し、VNet 内のプライベート IP を割り当てます。
Private Endpoint は「Private Link センター」からも作成できますが、接続したいリソース(今回の場合は Storage)の画面から作成する方が設定が自動入力されるため簡単です。
- 作成したストレージアカウント (
stprivatelinktest...) の画面を開きます。 - 左メニューの [セキュリティ + ネットワーク] > [ネットワーク] をクリックします。
- [プライベート エンドポイント接続] タブを開き、[+ プライベート エンドポイント] をクリックします。

ウィザードが開いたら、以下の手順で設定を進めます。
- [基本] タブ:
- リソースグループ:
rg-private-link-test - 名前: 任意の名前 (例:
pe-storage-blob) - 地域: VNet と同じリージョン (例:
Japan East)
- リソースグループ:
- [リソース] タブ (※重要):
- 対象サブリソース:「blob」 を選択します。
- ※ここを間違えると(file や table を選ぶと)、Blob コンテナに接続できません。
- 対象サブリソース:「blob」 を選択します。

Private Endpoint を「どこに置くか」を指定します。
- [仮想ネットワーク] タブ:
- 仮想ネットワーク: 作成済みの
vnet-testを選択。 - サブネット:
defaultを選択。- ※Bastion 用のサブネット (AzureBastionSubnet) は選ばないでください。
- 仮想ネットワーク: 作成済みの
ここが接続の成否を分けるポイントです。 VNet 内からドメイン名 (mystorage...) でアクセスした際に、プライベート IP が返るように設定します。
- [DNS] タブへ進みます。
- プライベート DNS ゾーンと統合する: 「はい (Yes)」 が選択されていることを確認します。
- プライベート DNS ゾーン:
(新規) privatelink.blob.core.windows.netとなっていることを確認します。

なぜこの設定が必要か? ここを「はい」にすることで、Azure が自動的に以下の処理を行ってくれます。
- Private DNS Zone の作成:
privatelink.blob.core.windows.netという名前解決用のゾーンを作成。 - Aレコードの登録: ストレージ名とプライベート IP (例:
10.0.0.5) の紐づけを登録。 - VNet リンク: 作成した DNS ゾーンを VNet に紐づけ。


- [確認と作成] をクリックして設定を完了します。
- デプロイが完了したら、作成された「Private Endpoint」のリソースへ移動し、[DNS 構成] メニューを確認してください。
- 割り当てられた IP アドレス (例: 10.0.0.4 や 10.0.0.5) が表示されていれば設定完了です。


これで、「閉域網接続」の準備が整いました。 次章で、本当にプライベート IP で繋がるのか、動作確認を行いましょう。
作成ウィザードで自動設定されますが、稀に VNet との紐づけ(リンク)がうまくいかないことがあります。念のため確認しましょう。
- 作成された Private DNS ゾーン (
privatelink.blob.core.windows.net) を開きます。 - 左メニューの [仮想ネットワーク リンク] をクリックします。
- 今回の VNet (
vnet-test) が一覧にあるか確認します。 - もしなければ、[+ 追加] から手動で VNet を追加してください。
- これがないと、VM から名前解決ができず接続に失敗します。





どうして自動で紐付かないことがある?
再作成のタイミング: 以前に同じ名前で DNS ゾーンを作って削除した直後だと、裏側に「亡霊(メタデータ)」が残っていて、新規作成処理がスキップされることがあります。
処理の競合: Private Endpoint 本体と DNS 設定は別々に処理されるため、通信のタイミングによっては「リンク作成」だけがタイムアウトしてしまうことも…。
動作確認: ツールの準備と閉域接続
環境構築が完了しました。 VM にログインし、ツールをインストールして接続確認を行います。
- Azure Portal から Bastion 経由で VM にログインします。
- VM 内でブラウザ(Microsoft Edge)を起動します。
- 「Azure Storage Explorer」で検索し、公式サイトからインストーラー(StorageExplorer-windows-x64)をダウンロードしてインストールします。



VM からはインターネットへの閲覧(アウトバウンド通信)が可能なため、直接ダウンロードできます


次に、Blob Storage にアップロードするためのテストファイルを作成します。 せっかくなので、PowerShell を使って「作成日時」が入ったファイルをサクッと作ってみましょう。
- VM 内で PowerShell を起動します。
- 以下のコマンドをコピー&ペーストして実行します。
# デスクトップに "testfile.txt" という名前で、現在時刻が入ったファイルを作成
$date = Get-Date
Set-Content -Path "$HOME\Desktop\testfile.txt" -Value "これは閉域網接続のテストです。作成日時: $date"デスクトップに testfile.txt が作成されていれば OK です。
ツールを使う前に、ネットワーク的に「正しい経路(Private Endpoint)」を通っているかを確認します。 これが トラブルシューティングにおいて最も重要な手順 です。
- VM 内で コマンドプロンプト (cmd) を起動します。
- 以下のコマンドを実行します。
nslookup <作成したストレージアカウント名>.blob.core.windows.net結果の Address に注目してください。
- 成功:
10.0.0.5などの プライベート IP が返ってくる。 - 失敗: グローバル IP が返ってくる(DNS 設定がうまくいっていません)。


経路が正しいことが確認できたので、実際にファイルをアップロードしてみましょう。 まずは、接続に必要な「鍵」を Azure Portal から取得します。
- VM 内のブラウザで Azure Portal を開きます。
- 作成した ストレージアカウント (
stprivatelinktest...) の画面を開きます。 - 左メニューの [セキュリティ + ネットワーク] > [アクセス キー] をクリックします。
- key1 の [表示] ボタンを押し、[キー] の値をコピーしてメモ帳などに控えます。
- ※これがこのストレージの「合鍵」になります。
- インストールした Azure Storage Explorer を起動します。
- 左側の [接続ダイアログを開く] アイコン(プラグのマーク)をクリックします。
- [リソースの選択] 画面で以下を選択して進みます。
- ストレージ アカウントまたはサービス を選択。
- アカウント名とキー を選択。
- [アカウント名とキーを使用して接続] 画面で情報を入力します。
- 表示名: 任意の名前 (例:
Test-Connection) - アカウント名: 作成したストレージアカウント名 (
stprivatelinktest...) - アカウント キー: 手順1でコピーした「key1」の値を貼り付け。
- 表示名: 任意の名前 (例:
- [次へ] > [接続] をクリックします。
- 左ツリーに接続したストレージが表示されるので、[Blob Containers] > [
test-container] を開きます。 - 先ほどデスクトップに作成した
testfile.txtを、画面右側のエリアに ドラッグ&ドロップ します。 - 転送状況エリアに「完了」と表示され、ファイル一覧に表示されれば成功です!
- インターネットを経由せず、閉域網だけでファイルが転送されました。


まとめ
本記事では、Private Endpoint を使用して、インターネットを経由せずに Azure Storage へセキュアに接続する方法をご紹介しました。
手順は少し多かったかもしれませんが、やっていることは非常にシンプルです。 「PaaS サービスにプライベート IP を割り当て、DNS でその住所を教えてあげる」。これだけです。
- セキュアな接続
-
Private Endpoint を使うことで、通信はすべて Azure バックボーンネットワーク内(閉域網)で完結します。
- DNS が重要
-
接続できないトラブルの 9割は DNS 設定です。「Private DNS Zone」が正しくリンクされているか、必ず確認しましょう。
- 確認の基本
-
nslookupコマンドで プライベート IP が返ってくること を確認するのが、トラブルシューティングの基本です。
この構成は、Azure のセキュリティ設計における「基本のキ」であり、実際のエンタープライズ案件では当たり前のように登場します。 今回のハンズオンで作成した環境は、そのまま実務の検証環境としても応用できますので、ぜひ活用してみてください。



検証が終わったら、課金(特に Bastion と VM)を防ぐために、作成したリソースグループ (例: rg-private-link-test) ごと削除することを忘れないようにしましょう。
以上、最後までお読みいただきありがとうございました。









