「Service Endpointという言葉は知っているが、Private Endpointとの具体的な違いや実際のazコマンドの書き方が分からない」
この記事では、AzureのVNetサービスエンドポイント(VNet Service Endpoint)の仕組みから、StorageアカウントをVNetサブネットのIPアドレスに限定するazコマンドの実践手順まで一気通貫で解説します。Private Endpointとの使い分け基準と対応サービス一覧も押さえ、目的に応じたネットワーク設計の判断ができるようになることを目指します。
実行環境はRHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みです。
この記事のポイント
・--service-endpointsオプションでサブネット単位にService Endpointを有効化できる
・az storage account network-rule addでStorageをVNetサブネットIPに限定できる
・Private Endpointは追加コストが必要だがサービスにプライベートIPを付与し完全遮断できる
・Service Endpointは追加コストなし・設定が簡単で既存アーキテクチャを変えずに導入できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
AzureのVNetサービスエンドポイントとは何か
VNetサービスエンドポイント(VNet Service Endpoint)は、AzureのVNet(仮想ネットワーク)からAzureマネージドサービスへのトラフィックを、パブリックインターネットを経由せずにMicrosoftのバックボーンネットワーク上で転送する仕組みです。通常、Azure VMからStorageアカウントに接続すると、トラフィックはパブリックIPアドレスを経由します。Service Endpointを有効にすると、サブネットのプライベートIPアドレスがStorageアカウント側のネットワークルールに記録され、「このサブネットからのアクセスのみ許可する」という制御が可能になります。
設定のポイントを整理すると次のとおりです。
・設定箇所は2つ:①サブネットでのService Endpoint有効化、②Azureサービス側のネットワークルール追加
・FQDNは変わらない:ストレージのエンドポイント名(xxx.blob.core.windows.net)はそのまま。ルーティングだけが変わる
・追加料金なし:Service Endpoint自体の利用料はかからない(Private Endpointは時間課金+データ転送課金あり)
・サポートサービス:Storage・SQL Database・Key Vault・Cosmos DB・Service Bus・Event Hubなど主要サービスをカバー
Private Endpointとの違い・使い分け基準
Service EndpointとPrivate Endpointはどちらも「VNetからAzureサービスへのアクセスを安全にする」機能ですが、設計思想が大きく異なります。現場でよく混同されるので、明確に整理しておきましょう。| 項目 | Service Endpoint | Private Endpoint |
|---|---|---|
| サービスのIPアドレス | パブリックIPのまま(ルーティングのみ変わる) | VNet内にプライベートIPが払い出される |
| パブリックアクセス遮断 | ネットワークルールで制御(完全遮断は設定次第) | パブリックエンドポイントを完全に無効化可能 |
| 追加コスト | なし | 時間課金+データ転送課金あり |
| 設定の複雑さ | 低い(サブネット+サービス側の2ステップ) | 高い(Private DNS・NSG・承認フローが必要) |
| VNetピアリング越しのアクセス | 不可(同一VNetのサブネットのみ) | 可能(ピアリング先VNet・オンプレミスからも利用可) |
| 推奨ユースケース | 同一VNet内の単純なアクセス制限 | マルチVNet・オンプレ接続・ゼロトラスト設計 |
サービスエンドポイントの設定手順
実際にStorageアカウントをVNetサブネットのIPアドレスに限定する設定を行います。事前にAzure CLIをインストールし(az loginでログイン済みであること)、サブスクリプションが選択されていることを確認してください。1. 事前準備と変数の定義
コマンドを再利用しやすくするため、変数を先に定義します。# 変数の定義(環境に合わせて変更してください) RG="rg-service-endpoint-demo" LOCATION="japaneast" VNET="vnet-demo" SUBNET="snet-app" STORAGE_ACCOUNT="stsvcepdemo$(date +%m%d)" # 小文字・3~24文字・グローバル一意 ADDRESS_PREFIX="10.0.0.0/16" SUBNET_PREFIX="10.0.1.0/24"
2. リソースグループとVNetの作成
# リソースグループを作成 $ az group create \ --name $RG \ --location $LOCATION { "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-service-endpoint-demo", "location": "japaneast", "name": "rg-service-endpoint-demo", "properties": { "provisioningState": "Succeeded" } } # VNetを作成(アドレス空間だけ先に定義) $ az network vnet create \ --resource-group $RG \ --name $VNET \ --address-prefix $ADDRESS_PREFIX { "name": "vnet-demo", "addressSpace": { "addressPrefixes": ["10.0.0.0/16"] }, "provisioningState": "Succeeded" } # アプリケーション用サブネットを追加 $ az network vnet subnet create \ --resource-group $RG \ --vnet-name $VNET \ --name $SUBNET \ --address-prefix $SUBNET_PREFIX { "name": "snet-app", "addressPrefix": "10.0.1.0/24", "provisioningState": "Succeeded" }
3. サブネットにService Endpointを有効化する
Service Endpointはサブネット単位で有効化します。az network vnet subnet updateの--service-endpointsに対象サービス名を指定します。# snet-appにStorageのService Endpointを有効化 $ az network vnet subnet update \ --resource-group $RG \ --vnet-name $VNET \ --name $SUBNET \ --service-endpoints Microsoft.Storage # 有効化されたことを確認 $ az network vnet subnet show \ --resource-group $RG \ --vnet-name $VNET \ --name $SUBNET \ --query serviceEndpoints \ --output table Service ProvisioningState Locations ------------------- ------------------- ------------------ Microsoft.Storage Succeeded japaneast, japanwest
ProvisioningStateがSucceededになれば、サブネット側の設定は完了です。この時点ではサービス側(Storage)にはまだ何も設定していないため、接続制限は発生していません。4. StorageアカウントのNetworkルールを設定する
次に、StorageアカウントをVNetサブネットのIPアドレスからのアクセスに限定します。2ステップで行います。# Storageアカウントを作成(Standard LRS) $ az storage account create \ --name $STORAGE_ACCOUNT \ --resource-group $RG \ --location $LOCATION \ --sku Standard_LRS { "name": "stsvcepdemo0806", "provisioningState": "Succeeded", "statusOfPrimary": "available" } # ステップ1: サブネットからのアクセスを許可するルールを追加 $ az storage account network-rule add \ --resource-group $RG \ --account-name $STORAGE_ACCOUNT \ --vnet-name $VNET \ --subnet $SUBNET { "action": "Allow", "state": "Succeeded", "virtualNetworkResourceId": "/subscriptions/.../snet-app" } # ステップ2: デフォルトアクションをDeny(ルールに一致しない接続を拒否)に変更 $ az storage account update \ --resource-group $RG \ --name $STORAGE_ACCOUNT \ --default-action Deny
--default-action Denyを設定する前に、必ず自分の作業環境(ローカルPCや踏み台VMのIPアドレス)を許可ルールに加えるか、Azure Portalでの操作を準備してください。この設定が完了した瞬間から、ルールに一致しないすべての接続が拒否されます。設定が正しく反映されたか確認します。
$ az storage account show \ --name $STORAGE_ACCOUNT \ --resource-group $RG \ --query networkRuleSet \ --output json { "bypass": "AzureServices", "defaultAction": "Deny", "ipRules": [], "virtualNetworkRules": [ { "action": "Allow", "state": "Succeeded", "virtualNetworkResourceId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-service-endpoint-demo/providers/Microsoft.Network/virtualNetworks/vnet-demo/subnets/snet-app" } ] }
defaultActionがDeny、virtualNetworkRulesにsnet-appがAllow/Succeededで登録されていれば正常です。5. Azure VM上から接続を確認する
実際にsnet-appに配置したAzure VM上から、Storageへのアクセスが通ることを確認します。# snet-app上のVM(10.0.1.x)からcurlでBlobエンドポイントに疎通確認 [azureuser@vm-app ~]$ curl -s -o /dev/null -w "%{http_code}" \ "https://stsvcepdemo0806.blob.core.windows.net/?restype=account&comp=properties" \ -H "x-ms-version: 2020-10-02" \ -H "x-ms-date: $(date -u +%a,\ %d\ %b\ %Y\ %H:%M:%S\ GMT)" 400 # 400=認証エラーは「到達できた」こと。ネットワーク的にはOK # 別のVMまたはローカルPCから(ルールに含まれないIPアドレス) $ curl -s -o /dev/null -w "%{http_code}" \ "https://stsvcepdemo0806.blob.core.windows.net/?restype=account&comp=properties" \ -H "x-ms-version: 2020-10-02" 403 # 403=アクセス拒否。ネットワークルールがDenyとして機能している
Azure対応セミナーの詳細を見る >>
対応するAzureサービスと複数エンドポイントの設定
Service Endpointが対応しているサービスの一覧と、複数サービスを同一サブネットで有効化する方法を説明します。| サービス識別子 | 対象Azureサービス |
|---|---|
Microsoft.Storage |
Blob Storage・File Storage・Queue・Table |
Microsoft.Sql |
Azure SQL Database・Azure Synapse Analytics |
Microsoft.KeyVault |
Azure Key Vault |
Microsoft.AzureCosmosDB |
Azure Cosmos DB |
Microsoft.ServiceBus |
Azure Service Bus |
Microsoft.EventHub |
Azure Event Hubs |
Microsoft.ContainerRegistry |
Azure Container Registry |
Microsoft.Web |
Azure App Service(VNet Integration用途) |
# StorageとKey Vaultを同時に有効化 $ az network vnet subnet update \ --resource-group $RG \ --vnet-name $VNET \ --name $SUBNET \ --service-endpoints Microsoft.Storage Microsoft.KeyVault # 確認 $ az network vnet subnet show \ --resource-group $RG \ --vnet-name $VNET \ --name $SUBNET \ --query serviceEndpoints[].service \ --output tsv Microsoft.KeyVault Microsoft.Storage
# Key Vaultのネットワークルールにサブネットを追加 $ KEYVAULT_NAME="kv-sepdemo0806" $ az keyvault network-rule add \ --name $KEYVAULT_NAME \ --resource-group $RG \ --vnet-name $VNET \ --subnet $SUBNET # デフォルトアクションをDenyに設定 $ az keyvault update \ --name $KEYVAULT_NAME \ --resource-group $RG \ --default-action Deny
よくあるトラブルと対処法
1. 「This request is not authorized to perform this operation」エラーが出る(サブネット内VMから)
Service Endpointを有効化したが、Storageアカウント側のネットワークルールが未設定、またはDefaultActionがDenyになっていない状態です。# 現在のネットワークルールを確認 $ az storage account show \ --name $STORAGE_ACCOUNT \ --resource-group $RG \ --query networkRuleSet # virtualNetworkRulesにサブネットが含まれているか確認 # 含まれていない場合はnetwork-rule addを再実行する $ az storage account network-rule add \ --resource-group $RG \ --account-name $STORAGE_ACCOUNT \ --vnet-name $VNET \ --subnet $SUBNET
2. サブネットへのService Endpoint有効化がPermission Deniedになる
サブネットを更新するにはVNet全体へのMicrosoft.Network/virtualNetworks/write権限が必要です。Contributorロールまたはカスタムロールが付与されているか確認してください。# 現在のロール割り当てを確認 $ az role assignment list \ --assignee $(az account show --query user.name -o tsv) \ --scope /subscriptions/$(az account show --query id -o tsv) \ --query "[].{Role:roleDefinitionName}" \ --output table Role ---------- Contributor
3. VNetピアリング先から接続できない
Service Endpointは、設定したサブネットと同一VNet内のみ有効です。VNetピアリング越しの別VNetからはService Endpointは使えません。ピアリング越しのアクセスが必要な場合は、Private Endpointへの切り替えを検討してください。# 接続元のIPアドレスを確認(ピアリング先VMなど) $ ip addr show eth0 | grep "inet " inet 10.1.0.4/24 # 別VNetの場合はService Endpointが適用されない # 対処方法: そのIPレンジをipRulesとして個別追加するか、Private Endpointへ移行 $ az storage account network-rule add \ --resource-group $RG \ --account-name $STORAGE_ACCOUNT \ --ip-address 10.1.0.4
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| サブネットにService Endpointを有効化 | az network vnet subnet update --service-endpoints Microsoft.Storage |
| Service Endpointの有効化を確認 | az network vnet subnet show --query serviceEndpoints |
| Storageのネットワークルールにサブネットを追加 | az storage account network-rule add --vnet-name vnet --subnet subnet |
| StorageのデフォルトアクションをDenyに設定 | az storage account update --default-action Deny |
| 現在のネットワークルールを確認 | az storage account show --query networkRuleSet |
| Key VaultにService Endpointを適用 | az keyvault network-rule add --vnet-name vnet --subnet subnet |
| 複数サービスを同時に有効化 | az network vnet subnet update --service-endpoints Microsoft.Storage Microsoft.KeyVault |
NATゲートウェイとプライベートサブネットの組み合わせについては「AzureでNATゲートウェイとプライベートサブネットを構築する方法」で詳しく解説しています。
NSGによるサブネットのトラフィック制御は「AzureのNSGとSSH公開鍵認証でLinux VMを安全に保護する方法」を参照してください。
VNet内のDNS名前解決の設計については「AzureのPrivate DNSゾーンを設定する方法」をあわせて確認することをお勧めします。
Azure対応セミナーの詳細を見る >>
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

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