AzureのVNetサービスエンドポイントを設定する方法|StorageをサブネットIPに限定してPrivate Endpointと使い分ける実践手順

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Azure > AzureのVNetサービスエンドポイントを設定する方法|StorageをサブネットIPに限定してPrivate Endpointと使い分ける実践手順
「StorageアカウントへのアクセスをVNetの特定サブネットだけに絞りたいが、Private Endpointは追加コストと設定の複雑さがネックになっている」
「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は追加コストなし・設定が簡単で既存アーキテクチャを変えずに導入できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

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・オンプレ接続・ゼロトラスト設計
判断の目安:同一VNet内のAzure VMからStorageやSQL DBにアクセスするだけであれば、Service Endpointで十分です。VNetピアリング越し、ExpressRoute/VPN経由のオンプレミスからのアクセス、またはコンプライアンス要件で完全なパブリックエンドポイント遮断が求められる場合はPrivate Endpointを選択してください。

サービスエンドポイントの設定手順

実際に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

ProvisioningStateSucceededになれば、サブネット側の設定は完了です。この時点ではサービス側(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" } ] }

defaultActionDenyvirtualNetworkRulessnet-appAllow/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として機能している

HTTPステータス400(Bad Request=認証エラー)が返れば、サブネットからのネットワーク到達性があります。403(Forbidden)が返る場合はネットワークルールがアクセスをブロックしています。ルールに含まれていない接続元から403が返れば、意図どおりの設定です。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の現場経験を持つ現役エンジニアがAzureネットワーク設計も含めて基礎から指導します。
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の両方をsnet-appから使う場合は、スペース区切りで複数指定できます。

# 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側のネットワークルールも同様の手順で追加します。

# 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
VNetの基本構築(リソースグループ・VNet・VMの作成)については「AzureのVNetとLinux VMをazコマンドで構築する手順」をご参照ください。

NATゲートウェイとプライベートサブネットの組み合わせについては「AzureでNATゲートウェイとプライベートサブネットを構築する方法」で詳しく解説しています。

NSGによるサブネットのトラフィック制御は「AzureのNSGとSSH公開鍵認証でLinux VMを安全に保護する方法」を参照してください。

VNet内のDNS名前解決の設計については「AzureのPrivate DNSゾーンを設定する方法」をあわせて確認することをお勧めします。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Azure対応セミナーの詳細を見る >>

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。