VPS・VM・VPCの違いとは?3つの用語を解説
VMは仮想マシンの技術、VPSは貸し出されるサーバー、VPCはプライベートネットワークです。3つの違いと、VPSがコンテナの場合もある理由を説明します。
VPS、VM、VPCを1つの段落で説明
VM(virtual machine)は、ソフトウェアで構成されたコンピューターです。ハイパーバイザーが1台の物理サーバーを複数の独立したマシンに分割し、それぞれが独自のカーネルを実行します。VPS(virtual private server)は、製品として貸し出されるサーバーです。OS、通常は root アクセス、月額料金が含まれます。ほとんどの VPS プランは仮想マシンですが、ホストカーネルを共有するコンテナを同じ名称で販売するホスティング事業者もあります。VPC(virtual private cloud)はサーバーではありません。クラウドアカウント内に定義するプライベートネットワークであり、その中にリソースを配置します。VM は一般的な技術です。VPS は製品です。VPC はその製品を取り囲むネットワークです。
この3つの用語のうち、マシンを表すものは2つだけです。残りの1つはネットワークを表します。3つを同じ棚に並ぶ製品のように比較するため、この違いがほぼすべての混乱の原因になります。
VM とは何か
ハイパーバイザーは、ハードウェアを装って動作する層です。各ゲストに仮想 CPU、メモリのブロック、仮想ディスク、仮想ネットワークカードを割り当て、ゲスト同士が互いを認識できないようにします。サーバーで一般的なものは KVM、Xen、Hyper-V、VMware ESXi です。最新のハイパーバイザーは CPU の仮想化拡張機能(Intel VT-x、AMD-V)を利用するため、ゲストの命令は解釈処理されるのではなく、ほぼネイティブ速度で実 CPU 上で実行されます。
システム管理者にとって重要なのはカーネルです。VM は独自のカーネルで起動するため、ディストリビューションを選択し、カーネルモジュールを読み込み、自分の VM にだけ適用される sysctl 値を設定できます。これは、ホストのカーネルを共有し、プロセスとファイルについて独自のビューだけを持つコンテナ(LXC、Docker)とは異なります。
Linux マシンでは、1 つのコマンドで結果を確認できます。
systemd-detect-virtkvm は、KVM ハイパーバイザー上の仮想マシンであることを示します。lxc または openvz は、他の環境が提供するカーネル上のコンテナ内にいることを示します。none は、対応している仮想化が検出されなかったことを示します。コマンドが存在しない場合は、lscpu | grep -i hypervisor でハイパーバイザーの情報を確認できますが、コンテナは識別できません。
VPS とは
VPS は、通常は VM である分離されたサーバーを商品化したものです。基盤となる技術は仮想化です。「VPS」という名称には、再インストール可能な OS イメージ、IP アドレス、帯域幅の上限、コントロールパネル、月額料金、ホスト障害時の問い合わせ先など、商品として提供するための要素が含まれます。「Private」は、数百のサイトが 1 つのオペレーティングシステムと 1 つの PHP 設定を共有する共有ホスティングと区別するための名称です。
VPS は商品名であり、技術用語ではないため、必ずしも完全な VM を意味しません。一部の低価格プランでは、同じ名称でコンテナを提供しています。多くのサービスの基盤となっているコンテナプラットフォームの OpenVZ も、自身のコンテナを「also known as virtual private servers」と説明しています。違いは、カーネルが必要になったときに明確になります。コンテナベースのプランではカーネルがホスト側のものであり、変更できません。ホストがすでにモジュールをロードしていても、コンテナ内のモジュールディレクトリにモジュールが見つからなければ sudo modprobe wireguard は失敗します。欠落しているモジュールをロードするには、ホストのカーネルを変更する権限も必要です。ホストカーネルが WireGuard をサポートしていない場合、インターフェースの作成 (ip link add dev wg0 type wireguard) は RTNETLINK answers: Operation not supported で失敗します。wg-quick は、インストール済みであれば、続いてユーザー空間実装 (デフォルトでは wireguard-go) にフォールバックし、"Missing WireGuard kernel module. Falling back to slow userspace implementation." と出力します。このフォールバックを使用する場合も、コンテナによる TUN デバイスの使用が許可されている必要があります。すべてのホストがこれを許可するわけではありません。ユーザー空間バイナリがない場合、wg-quick はこのエラーで停止します。KVM プランではカーネルを自分で管理できます。WireGuard をインストールし、まだロードされていなければモジュールをロードして、インターフェースを設定すれば、トンネルが起動します。Docker、VPN、カスタムカーネル、または独自の仮想マシンをサーバー内で実行する予定がある場合は、購入前に仮想化方式を確認してください。VPS 内で仮想マシンを実行するには、ホスト側で nested virtualisation が有効になった KVM が必要です。この条件を満たすプランはさらに限られます。
VPC とは
VPC は、クラウドプロバイダー内に構築するソフトウェア定義ネットワークです。多くのクラウドでは、まず 10.0.0.0/16 のような CIDR 表記でアドレス範囲を割り当て、その中からサブネットを切り出します(Google Cloud ではネットワーク全体の範囲を指定せず、リージョンごとのサブネットに個別の範囲を割り当てます)。ルートテーブルを関連付け、内部のリソースの前段にファイアウォールルール(セキュリティグループ)を配置します。VPC には CPU、メモリ、ディスクがありません。ログインする対象もありません。VPC 内のすべてのサーバーを削除しても、空の VPC は残り、通常は料金もかかりません。
VPC の利点は、プライベートアドレスを使用できることです。同じ VPC 内の 2 台のサーバーは、プロバイダーの内部ネットワーク上で 10.0.1.15 のようなアドレスを使って通信します。そのため、トラフィックはパブリックインターネットを経由せず、インターネット向けのデータ転送として課金されません。これにより、データベースはプライベートアドレスだけで待ち受けることができ、外部にポートを公開せずに済みます。
ip -4 addr show10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 内のアドレスはプライベートです。パブリックアドレスがあるだけでは、サーバーがインターネットから到達可能になるわけではありません。ルーティングとファイアウォールルールによる許可も必要です。
VPC を使うとサーバーはプライベートになりますか?
いいえ。これは、3 つの用語に関する誤解の中でも、特にコストの大きいものです。VPC はルーティングとアドレス指定を制御します。インターネットからマシンへ到達できるかどうかは決めません。インスタンスにパブリック IP があり、そのサブネットにインターネットへのルートがあり、セキュリティルールで 0.0.0.0/0 からのポート 22 が許可されていれば、VPC の有無にかかわらず、他のサーバーと同じ程度に外部へ公開されています。デフォルト VPC では、インターネットへのルートがすでに設定されています。VPC によって得られる分離とは、リソースにパブリックアドレスを一切割り当てない構成にできることと、どのサブネット間の通信を許可するかをルールで指定できることです。
この 3 つの用語は、それぞれ異なる種類の分離を指します。VM はコンピュートを分離します。ハイパーバイザーが CPU 時間とメモリを分離するため、別のゲストが RAM を読み取ることはできません。ただし、ディスクとネットワークに関する分離はより弱く、同じホスト上の負荷が高い隣接テナントによって処理速度が低下することがあります。コンテナベースの VPS は 1 つのカーネルを共有するため、カーネルレベルのバグが共有リスクになります。VPC はコンピュートをまったく分離しません。ネットワークの構成だけを制御します。
料金体系の考え方
VPS は通常、固定構成のマシンを固定の月額料金で提供します。月が始まる前に請求額が分かり、ディスクと転送量の上限も料金に含まれます。この予測しやすさが、小規模なワークロードでクラウドインスタンスより VPS が選ばれる主な理由です。
クラウド VM は従量課金です。インスタンスは時間単位または秒単位で課金され、ディスク、スナップショット、ロードバランサー、外向きトラフィックは別々に課金されます。VPC 自体は通常無料ですが、接続するマネージドサービスは無料ではありません。プライベートインスタンスからインターネットへ接続できるようにする NAT gateway は時間単位で課金され、トラフィックの課金方法はプロバイダーによって異なります。AWS は NAT gateway が処理する 1 ギガバイトごとに料金を加算します。一方、OVHcloud は Public Cloud Gateway を時間単位および使用量に応じて課金し、トラフィックは料金に含まれると説明しています。AWS では availability zone をまたぐトラフィックも課金されますが、Azure では同じリージョン内のゾーン間トラフィックに料金がかかりません。2026 年 10 月 27 日時点で、AWS VPC guide では各リージョンに default VPC があると説明されています。一方、AWS VPC FAQ では、2013 年 3 月 18 日より前に作成されたアカウントは、EC2 instance の起動や ELB、RDS、ElastiCache、Redshift resource のプロビジョニングを過去に行っていない有効化済みリージョンで default VPC を使用できると説明されています。削除した default VPC は再作成できますが、復元はできません。Google Cloud では、管理者が無効にしない限り、新しいプロジェクトごとに default network が作成されます。Azure では、既存の virtual network を選択しなければ、新しい VM とともに virtual network が作成されます。いずれの場合も、希望したかどうかにかかわらず、クラウド VM はこれらのネットワークのいずれかに配置されます。
実際に必要なのはどれか
- Web サイト、アプリ、ゲームサーバー、VPN 用に 1 台のサーバーが必要: VPS。プラン名よりも、新しい VPS の最初の 10 分の対応が重要です。
- プライベートアドレスで相互接続する複数のサーバーが必要: VPC、または VPS プロバイダーが別の名称で提供するプライベートネットワーク機能。
- データセンター全体が停止しても稼働を継続する必要があるワークロード: 複数のゾーンを持つクラウド。つまり、VPC 内の VM が必要です。
- カーネルを完全に制御したい、またはその上で独自のハイパーバイザーを実行したい: KVM ベースの VPS(ハイパーバイザーを使用する場合は nested virtualisation を有効にする)または dedicated server。比較時には、プランで使用されるディスクの種類も確認してください。
単一サーバーで構成するプロジェクトの多くは、VPC を必要としません。VPS に付属するプライベートネットワーク機能で、少数のマシンに対して同じ用途を満たせます。
FAQ
VPS は VM と同じものですか?
通常は同じですが、必ずしもそうとは限りません。KVM、Xen、VMware 上に構築された VPS はすべて仮想マシンですが、すべての仮想マシンが VPS とは限りません。VirtualBox でノートパソコン上に実行する VM は、誰かが提供する製品ではないためです。また、すべての VPS が VM というわけでもありません。OpenVZ や LXC を使用するプランはホストカーネルを共有するコンテナであり、OpenVZ 自体もコンテナを仮想プライベートサーバーと呼んでいます。カーネルにアクセスできることを前提にする前に、systemd-detect-virt で確認してください。
VPS を VPC 内に配置できますか?
通常はできません。VPC は 1 つのクラウドプロバイダーが提供する構成だからです。AWS では、同じ組織内のアカウント間でサブネットを共有することもできます。独立したプロバイダーの VPS は、そのプロバイダーのネットワーク上にあります。両者の間にプライベート接続が必要な場合は、両者の間に VPN トンネルを構築します。VPS はそのトンネル経由でプライベートサブネットに到達します。
クラウドの料金が同等の VPS より高いのはなぜですか?
インスタンス料金は費用の一部にすぎません。従量課金のクラウドでは、ストレージ、スナップショット、送信トラフィック、ロードバランサー、NAT ゲートウェイが個別に課金されます。NAT ゲートウェイだけで、小規模な VPS より月額が高くなることもあります。定額の VPS では、ディスクと転送量の上限が 1 つの料金に含まれます。そのため、同じワークロードでも VPS のほうが安く見えることがよくあります。
サーバーが実際のカーネルアクセスを持つかどうかを確認するにはどうすればよいですか?
systemd-detect-virt を実行して、結果を確認します。kvm、xen、vmware、または新しい EC2 インスタンスでは amazon が表示される場合は、自分専用のカーネルを使用しており、modprobe でカーネルモジュールをロードできます。lxc、lxc-libvirt、または openvz が表示される場合は、ホストカーネルを共有しています。モジュールのロードにはホストカーネルの権限が必要です。一方、/proc/sys 配下のネットワーク設定など、名前空間で分離された設定は、ホスト側で許可されていれば変更できます。別の確認方法として uname -r もあります。コンテナプランでは、ディストリビューションがリリースしたことのないカーネルバージョンが表示されることがあります。