名前が似ているためよく混同されますが、この2つは仕組みもコストもDNS設計の複雑さもまったく異なります。サービスエンドポイントで十分な場面にプライベートエンドポイントを選ぶと不要なコストと設定の複雑さを招き、逆にオンプレミスアクセスが必要な環境でサービスエンドポイントを選ぶと後から全部やり直すことになります。
この記事では、Azure CLIの実際のコマンド出力を交えながら、コスト・DNS設計・セキュリティの3軸で両者の違いを整理し、どちらを選ぶべきかの判断基準を解説します。実行環境はAzure CLI 2.65(Rocky Linux 9.4上で動作確認済み)です。
この記事のポイント
・サービスエンドポイントは無料・DNS変更不要・VNet外(オンプレ)からは届かない
・プライベートエンドポイントは有料・プライベートDNSゾーン設定が必須
・コスト優先かつVNetのみの用途ならサービスエンドポイントで十分
・オンプレ接続・コンプライアンス要件があるならプライベートエンドポイント一択
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
サービスエンドポイントとプライベートエンドポイントの本質的な違い
2つの機能は「Azureサービスへのアクセス経路をセキュアにする」という目的は共通ですが、実現方法がまったく異なります。サービスエンドポイントは、サブネットのIDをAzureサービスに延長する仕組みです。VMからストレージへのトラフィックはAzureのバックボーン(内部ネットワーク)を経由しますが、ストレージアカウントのホスト名は依然としてパブリックIPに解決されます。「パブリックIPを経由するが、Azureネットワーク外には出ない」というモデルです。
プライベートエンドポイントは、Azureサービスのネットワークインターフェイス(NIC)をVNetのサブネット内に作成します。ストレージアカウントやSQL ServerがVNet内のプライベートIPアドレスを持つイメージです。DNSの名前解決でもプライベートIPが返るため、通信は完全にVNet内で完結します。
| 比較項目 | サービスエンドポイント | プライベートエンドポイント |
|---|---|---|
| コスト | 無料 | 約$0.01/時間 + データ処理料 |
| DNS変更 | 不要(パブリックIPのまま) | プライベートDNSゾーン設定必須 |
| 接続元IPアドレス | VNetのプライベートIP | VNetのプライベートIP |
| オンプレからのアクセス | 不可(VPN経由でも届かない) | VPN/ExpressRoute経由で可 |
| 設定の複雑さ | 低い | 高い(NIC・DNS・承認フロー) |
| 対応サービス | Storage・SQL・Key Vault等 | ほぼすべてのAzureサービス |
サービスエンドポイントの設定手順とDNS動作
サービスエンドポイントの設定は2ステップです。①サブネット側でエンドポイントを有効化する、②Azureサービス側でVNetルールを追加してデフォルトアクセスをDenyにする、の2つです。1. サービスエンドポイントをサブネットに有効化する
まず現在のサブネット一覧を確認します。# サブネット一覧とサービスエンドポイントの状態を確認 az network vnet subnet list --resource-group myRG --vnet-name myVNet --query "[].{name:name, serviceEndpoints:serviceEndpoints}" -o table
Name ServiceEndpoints -------- ---------------- default None app-sub None db-sub None
# db-sub サブネットにサービスエンドポイントを有効化 az network vnet subnet update --resource-group myRG --vnet-name myVNet --name db-sub --service-endpoints Microsoft.Storage
{ "name": "db-sub", "serviceEndpoints": [ { "locations": ["japaneast", "*"], "provisioningState": "Succeeded", "service": "Microsoft.Storage" } ] }
2. ストレージアカウントにVNetルールを追加してアクセスを制限する
サービスエンドポイントを有効化しただけでは、ストレージアカウントは誰でも(インターネットからも)アクセスできる状態のままです。ストレージ側でVNetルールを追加し、デフォルトアクセスをDenyに変更することで初めてアクセス制限が機能します。# db-sub からのアクセスを許可するVNetルールを追加 az storage account network-rule add --resource-group myRG --account-name mystorageaccount --vnet-name myVNet --subnet db-sub # デフォルトアクセスをDenyに変更(VNetルール以外の通信を遮断) az storage account update --resource-group myRG --name mystorageaccount --default-action Deny
az storage account show --resource-group myRG --name mystorageaccount --query "networkRuleSet" -o json
{ "bypass": "AzureServices", "defaultAction": "Deny", "virtualNetworkRules": [ { "action": "Allow", "state": "Succeeded", "virtualNetworkResourceId": "/subscriptions/xxxxxxxx/...subnets/db-sub" } ] }
3. DNS解決を確認する(サービスエンドポイントの特徴)
サービスエンドポイントを有効化しても、DNS解決の結果は変わりません。ストレージアカウントのホスト名は依然としてパブリックIPに解決されます。これはサービスエンドポイントの正常な動作です。# VNet内のVMから実行 nslookup mystorageaccount.blob.core.windows.net
Server: 168.63.129.16 Address: 168.63.129.16#53 Non-authoritative answer: Name: blob.ty1prdstr03a.store.core.windows.net Address: 20.60.xxx.xxx ← パブリックIPが返る(これが正常)
プライベートエンドポイントの設定手順とDNS設計
プライベートエンドポイントの設定は3ステップです。①プライベートエンドポイントを作成する、②プライベートDNSゾーンを作成してVNetにリンクする、③DNSゾーングループでエンドポイントとDNSを紐付ける、です。1. プライベートエンドポイントを作成する
# ストレージアカウントのリソースIDを変数に取得 STORAGE_ID=$(az storage account show --resource-group myRG --name mystorageaccount --query id -o tsv) # app-sub サブネットにプライベートエンドポイントを作成 az network private-endpoint create --resource-group myRG --name myStoragePE --vnet-name myVNet --subnet app-sub --private-connection-resource-id "$STORAGE_ID" --group-id blob --connection-name myStoragePEConnection
{ "name": "myStoragePE", "customDnsConfigs": [ { "fqdn": "mystorageaccount.blob.core.windows.net", "ipAddresses": ["10.1.1.5"] } ], "provisioningState": "Succeeded" }
2. プライベートDNSゾーンを構成する(必須)
プライベートエンドポイントで最も設定ミスが多いのがDNSゾーンです。作成を忘れると、VNet内でも名前解決がパブリックIPを返し続けます。# プライベートDNSゾーンを作成 az network private-dns zone create --resource-group myRG --name "privatelink.blob.core.windows.net" # VNetにDNSゾーンをリンク(自動登録は不要なのでfalse) az network private-dns link vnet create --resource-group myRG --zone-name "privatelink.blob.core.windows.net" --name myDNSLink --virtual-network myVNet --registration-enabled false # プライベートエンドポイントとDNSゾーンを紐付け az network private-endpoint dns-zone-group create --resource-group myRG --endpoint-name myStoragePE --name myDNSZoneGroup --private-dns-zone "privatelink.blob.core.windows.net" --zone-name blob
3. DNS解決を確認する(プライベートIPが返ることを確認)
VNet内のVMから名前解決してプライベートIPが返ることを確認します。# VNet内のVMから実行 nslookup mystorageaccount.blob.core.windows.net
Server: 168.63.129.16 Address: 168.63.129.16#53 Non-authoritative answer: mystorageaccount.blob.core.windows.net canonical name = mystorageaccount.privatelink.blob.core.windows.net. Name: mystorageaccount.privatelink.blob.core.windows.net Address: 10.1.1.5 ← プライベートIPが返る(DNS設定成功)
コスト・DNS設計・オンプレ接続で選ぶ判断基準
どちらを選ぶべきか、実務で迷いやすいケースごとにまとめます。サービスエンドポイントが適しているケース
・VNet内のVMやAKSのPodからAzureサービスにアクセスする構成で、オンプレからのアクセスは不要
・コストを最小限に抑えたい(PoC・検証・小規模本番)
・シンプルな設定で素早く始めたい
プライベートエンドポイントが適しているケース
・VPN GatewayやExpressRoute経由でオンプレミスのLinuxサーバーからAzureサービスにアクセスする
・金融・医療・公共など、パブリックIPを経由することを禁じるコンプライアンス要件がある
・マルチVNet構成でPrivate Linkによるサービス共有が必要
移行の方向性
サービスエンドポイントからプライベートエンドポイントへの移行はサービスを停止せずに行えます。まずサービスエンドポイントで運用を開始し、オンプレ接続が必要になった段階でプライベートエンドポイントに切り替えるアプローチも有効です。
よくある設計ミスとトラブルシュート
【サービスエンドポイント】default-action Denyを忘れてアクセス制限が機能しない
サービスエンドポイントを有効化してVNetルールを追加しても、ストレージアカウントの `defaultAction` が `Allow`(デフォルト値)のままだと誰でもアクセスできる状態が続きます。必ず `--default-action Deny` を設定してください。# 確認コマンド(Denyになっていることを確認) az storage account show --resource-group myRG --name mystorageaccount --query "networkRuleSet.defaultAction" -o tsv # 期待値: Deny
【サービスエンドポイント】NSGでアウトバウンドをブロックしたら通信が止まった
NSGでインターネット向けアウトバウンドをDenyにすると、サービスエンドポイント経由の通信も止まることがあります。NSGにサービスタグを使ったAllow ruleを明示的に追加してください。# StorageサービスタグへのアウトバウンドをNSGで許可 az network nsg rule create --resource-group myRG --nsg-name myNSG --name AllowStorageServiceTag --priority 200 --direction Outbound --destination-address-prefix Storage --destination-port-range 443 --protocol Tcp --access Allow
【プライベートエンドポイント】DNSゾーン設定後もパブリックIPに解決される
プライベートエンドポイントを作成しただけで、DNSゾーングループの作成を忘れるとパブリックIPへの解決が続きます。また、DNS設定後もVMのDNSキャッシュが残る場合があります。# DNSゾーングループが存在するか確認 az network private-endpoint dns-zone-group list --resource-group myRG --endpoint-name myStoragePE -o table # VMのDNSキャッシュをクリア(Rocky Linux/RHEL 9の場合) sudo systemd-resolve --flush-caches # または sudo resolvectl flush-caches
【プライベートエンドポイント】オンプレから名前解決できない
VPNで接続したオンプレのLinuxサーバーからプライベートエンドポイントのFQDNを引けない場合は、オンプレのDNSサーバーが `privatelink.blob.core.windows.net` のクエリをAzureのプライベートDNSリゾルバー(168.63.129.16)にフォワードする設定が必要です。Azureプライベートリゾルバー(Private DNS Resolver)を使うとこのフォワード設定を一元管理できます。本記事のまとめ
| やりたいこと | 選択 |
|---|---|
| VNet内VMからStorageへ安全にアクセス(コスト最小) | az network vnet subnet update --service-endpoints Microsoft.Storage |
| オンプレLinuxサーバーからAzure Storageにアクセス | az network private-endpoint create --group-id blob |
| DNS設定なしで素早く接続制限したい | サービスエンドポイント + --default-action Deny |
| 完全プライベートIP接続でコンプライアンス要件を満たす | プライベートエンドポイント + プライベートDNSゾーン |
| PoC・検証環境(変更を最小限に) | サービスエンドポイントで開始し、後からプライベートへ移行 |
サービスエンドポイントは「無料・DNS変更不要・VNet内限定」、プライベートエンドポイントは「有料・DNS設計必須・オンプレからも届く」と覚えておくと、設計時の判断が速くなります。まずオンプレからのアクセス要件を確認してから選択してください。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、
AzureのVNet設計からエンドポイントの構成・セキュリティ設計まで、ハンズオン形式で体系的に学べる講座の詳細は以下からご確認ください。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:azureアカウントmicrosoftアカウント違いを図解|ポータルログインの仕組みを整理
- この記事の属するカテゴリ:Azureへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます