Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

VPC Networks

最終更新 Markdown で表示Agent セットアップ

VPC Networks を使うと、個々のホストやポートを事前登録せずに、プライベートネットワーク内の任意のサービスに Workers からアクセスできます。特定の Cloudflare Tunnel にバインドして、そのトンネル背後の任意のサービスに到達できます。または Cloudflare Mesh にバインドして、任意の Mesh ノード、クライアントデバイス、サブネットルート、Cloudflare Tunnel または Mesh 経由で告知されるホスト名ルート、あるいは Cloudflare WAN オンランプ(GRE、IPsec、CNI)経由で到達可能な宛先に到達できます。

実行時に、fetch() に渡す URL または connect() に渡すアドレスが宛先を決めます。バインドした Cloudflare Tunnel または Cloudflare Mesh 経由で到達できる任意のホスト名または IP アドレスです。HTTP トラフィックには fetch() を使い、生の TCP 接続(Redis、MQTT、カスタムプロトコル、その他の非 HTTP サービス)には connect() を使います。これは VPC Services とは異なります。VPC Services では、対象のホストとポートの組み合わせごとに別のバインディングを作成する必要があります。

Cloudflare Tunnel にバインドする

特定の Cloudflare Tunnel を UUID で直接参照します。

{
  "vpc_networks": [
    {
      "binding": "MY_VPC",
      "tunnel_id": "550e8400-e29b-41d4-a716-446655440000",
      "remote": true
    }
  ]
}
[[vpc_networks]]
binding = "MY_VPC"
tunnel_id = "550e8400-e29b-41d4-a716-446655440000"
remote = true

ローカル開発でリモートバインディングを有効にするには、remote フラグを true に設定する必要があります。

Cloudflare Mesh にバインドする

Cloudflare Mesh(旧 WARP Connector)は、Cloudflare のグローバルネットワーク経由でサービス、デバイス、Workers を接続します。network_id: "cf1:network" を使って Worker を Cloudflare Mesh にバインドすると、Worker は次に到達できます。

  • アカウント内の任意の Mesh ノードまたはクライアントデバイス
  • Cloudflare Tunnel または Cloudflare Mesh 経由で告知されるサブネットルートとホスト名ルート
  • Cloudflare WAN オンランプ(GRE、IPsec、CNI)経由で到達可能な宛先
  • Cloudflare Gateway 経由のパブリックインターネット宛先。既存の Zero Trust トラフィックポリシーが適用され、トラフィックは DNS、HTTP、Network ログに記録されます

これらはすべて、特定の Cloudflare Tunnel UUID を指定せずに行えます。

cf1:network を使うのは次の場合です。

  • 複数の Cloudflare Tunnels、Mesh ノード、または Cloudflare WAN オンランプにまたがるプライベートサービスに Workers から到達する必要がある
  • 個々の Cloudflare Tunnel バインディングを管理せずに、Worker からプライベートネットワーク全体にアクセスしたい
  • プライベートネットワークのトポロジーが変わる可能性があり(新しい接続、新しいノード、新しいルート)、そのたびに Worker 設定を更新したくない
  • パブリック宛先への Worker エグレスを Cloudflare Gateway 経由にして、ポリシー適用と可視化を行いたい

network_id: "cf1:network" を使って Cloudflare Mesh にバインドします。

{
  "vpc_networks": [
    {
      "binding": "MY_VPC",
      "network_id": "cf1:network",
      "remote": true
    }
  ]
}
[[vpc_networks]]
binding = "MY_VPC"
network_id = "cf1:network"
remote = true

実行時の使い方

fetch() 経由の HTTP

実行時に fetch() を使って、ネットワーク内の任意の HTTP サービスにアクセスします。

export default {
	async fetch(request: Request, env: Env) {
		// Access a service by private IP
		const response = await env.MY_VPC.fetch("http://10.0.1.50/data");

		// Access another service on a different port
		const dbResponse = await env.MY_VPC.fetch("http://10.0.5.42:5432");

		return response;
	},
};

VPC Network が対象サービスへの接続を確立できない場合、fetch() は例外をスローします。

connect() 経由の TCP

connect() を使って、任意のプライベート宛先へ生の TCP 接続を開きます。Redis、Memcached、MQTT、カスタムバイナリプロトコルなど、非 HTTP プロトコルに便利です。

export default {
	async fetch(request: Request, env: Env) {
		// Open a TCP connection to a private Redis instance
		const socket = await env.MY_VPC.connect("10.0.1.50:6379");

		// Write a Redis PING command
		const writer = socket.writable.getWriter();
		await writer.write(new TextEncoder().encode("PING\r\n"));
		await writer.close();

		return new Response(socket.readable);
	},
};

VPC Network が TCP 接続を確立できない場合、connect() は例外をスローします。

VPC Networks と VPC Services の比較

VPC Networks と VPC Services はどちらも Workers をプライベートインフラストラクチャに接続しますが、トレードオフが異なります。

  • VPC Services を使うのは、対象の集合が決まっていて、各バインディングを特定のホストとポートに限定したい場合です。
  • VPC Networks を使うのは、Cloudflare Tunnel 全体または Cloudflare Mesh 全体など、より広いアクセスが必要で、fetch() 呼び出しの URL で実行時のルーティングを制御したい場合です。

違いは次の表のとおりです。

機能 VPC Networks VPC Services
スコープ 単一の Cloudflare Tunnel、または Cloudflare Mesh と Cloudflare WAN のルート 特定のホスト + ポート
設定 tunnel_id(単一の Cloudflare Tunnel)または cf1:network(アカウント全体) service_id
プロトコル HTTP(fetch())と TCP(connect() HTTP(fetch())または TCP(Hyperdrive 経由)
サービスの登録 不要 対象ごとに必要
こんなときに使う 動的な検出、ネットワーク全体へのアクセス、アカウント内のサービスへの到達 固定された、カタログ化されたサービス

次のステップ

役に立ちましたか?