Skip to content

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

VPC Services

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

VPC Services は Workers VPC の中核となる構成要素です。Workers が Cloudflare Tunnel 経由でアクセスできる、プライベートネットワーク上の特定リソースを表します。

Workers から VPC Services へはバインディングで接続します。VPC Service の fetch 関数へ送ったリクエストは、すべてプライベートネットワーク内の設定済みサービスへ安全にルーティングされます。

VPC Services は、ネットワーク全体を公開せずに意図したサービスへリクエストを届けます。ワークロードを守り、サーバーサイドリクエストフォージェリ(SSRF)を防ぎます。

Connectivity Directory Bind ロールを持つメンバーは、既存の VPC Services を Workers からバインドできます。VPC Services の作成には Connectivity Directory Admin ロールが必要です。

VPC Service の設定

VPC Service は次で構成されます。

  • タイプ: HTTP/HTTPS サービスは http、TCP サービス(PostgreSQL、MySQL など)は tcp
  • トンネル ID: ネットワーク接続を提供する Cloudflare Tunnel
  • ホスト名または IPv4 / IPv6 アドレス: プライベートネットワーク内のトンネルからサービスへルーティングするためのホスト名、または IPv4 および / または IPv6 アドレス
  • ポート: http タイプでは HTTP および / または HTTPS のポート設定(任意。デフォルトは 80/443)。tcp タイプでは TCP ポート(必須)。
  • アプリケーションプロトコル(TCP のみ): 任意で、TCP サービスのアプリケーション層プロトコルとして postgresql または mysql を指定します
  • TLS 証明書の検証モード: 任意で、オリジンへの接続が TLS 証明書を検証する方法を設定します
  • リゾルバー IP: 任意で、特定のリゾルバー IP を指定できます。指定しない場合、cloudflared は現在設定されているデフォルトのシステムリゾルバーへ DNS トラフィックを送ります。

HTTP サービス

HTTP の VPC Services を使うと、Workers からプライベートな HTTP/HTTPS エンドポイントへ fetch() できます。

fetch に渡す URL のスキームに関係なく、リクエストはトンネル経由でネットワークに届くまで転送中に暗号化されます。http スキームを使うと、トンネルからサービスへは平文で接続します。

ネットワーク内、トンネルとサービスのあいだを暗号化したい場合は https スキームを使います。https スキームを指定すると、fetch() に渡したホスト名が Server Name Indication(SNI)の値になります。

VPC Services は、デフォルトで httphttps の両方のスキームを許可します。特定のスキームだけを強制するには、http_port または https_port のどちらか一方だけを指定します。

Workers VPC がサービスへ接続できない場合、fetch() は例外を投げます。

TCP サービス

TCP の VPC Services は、PostgreSQL や MySQL などの TCP ベースサービスへの接続を許可します。TCP サービスを公開するには、tcp サービスタイプと --tcp-port を使います。

任意で --app-protocolpostgresql または mysql を指定し、アプリケーション層プロトコルを示せます。このメタデータは、Hyperdrive などほかの Cloudflare 製品が、対応するワイヤプロトコルの TCP サービスを探すときに使います。

TCP の VPC Services は、Workers からプライベートデータベースへ接続するために Hyperdrive と組み合わせて使います。手順の全体は Workers VPC でプライベートデータベースに接続する を参照してください。

対応する TLS 証明書

https スキームを使うとき、トンネルはオリジンサービスが提示する TLS 証明書を検証します。Workers VPC が信頼する証明書の種類は次のとおりです。

  • 一般に信頼される証明書 — よく知られた公開認証局(Let's Encrypt、DigiCert など)が発行した証明書。
  • Cloudflare Origin CA 証明書 — Cloudflare とオリジン間の通信を暗号化する、Cloudflare 発行の無料証明書です。Origin CA 証明書はブラウザーからは信頼されませんが、Workers VPC がプライベートサービスへ接続するときは信頼します。

オリジンサービスが、一般に信頼される CA または Cloudflare Origin CA 以外の証明書を提示すると、TLS ハンドシェイクは失敗し、fetch() は例外を投げます。

TLS 証明書の検証モード

VPC Service の作成時または更新時に --cert-verification-mode を設定すると、オリジンサービスへの接続が TLS 証明書を検証する方法を変えられます。HTTP と TCP の両方のサービスタイプに適用されます。

モード 説明
verify_full 証明書チェーンとホスト名を検証します(デフォルト)
verify_ca 証明書チェーンのみ検証し、ホスト名の検証をスキップします
disabled サーバー証明書を検証しません

設定例

これらの設定は、より広い connectivity directory 内のサービスタイプである VPC Service 作成用 REST API の想定契約を表します。

IP アドレスを使う HTTP サービス

次は、カスタムの HTTP / HTTPS ポートと、IPv4 および IPv6 アドレスを使う HTTP VPC Service の例です。

{
	"type": "http",
	"name": "human-readable-name",

	// Port configuration (optional - defaults to 80/443)
	"http_port": 80,
	"https_port": 443,

	// Host configuration
	"host": {
		"ipv4": "10.0.0.1",
		"ipv6": "fe80::",
		"network": {
			"tunnel_id": "0191dce4-9ab4-7fce-b660-8e5dec5172da",
		},
	},
}

ホスト名を使う HTTP サービス

次は、ホスト名を使う HTTP VPC Service の例です。ホスト名を使う場合は、任意で resolver_ips を含む resolver_network を指定します。

{
	"type": "http",
	"name": "human-readable-name",

	// Port configuration (optional - defaults to 80/443)
	"http_port": 80,
	"https_port": 443,

	// Hostname Host (with DNS resolver)
	"host": {
		"hostname": "example.com",
		"resolver_network": {
			"tunnel_id": "0191dce4-9ab4-7fce-b660-8e5dec5172da",
			"resolver_ips": ["10.0.0.1"], // Optional
		},
	},
}

TCP サービス(例: PostgreSQL)

次は、PostgreSQL データベース向け TCP VPC Service の例です。

{
	"type": "tcp",
	"name": "my-postgres-db",
	"tcp_port": 5432,
	"app_protocol": "postgresql", // Optional: "postgresql" or "mysql"

	"host": {
		"ipv4": "10.0.0.5",
		"network": {
			"tunnel_id": "0191dce4-9ab4-7fce-b660-8e5dec5172da",
		},
	},
}

TLS 証明書検証付きのサービス

次の例は、証明書検証モード verify_ca の TCP サービスを作成します。

{
	"type": "tcp",
	"name": "my-postgres-db",
	"tcp_port": 5432,
	"app_protocol": "postgresql",

	"host": {
		"ipv4": "10.0.0.5",
		"network": {
			"tunnel_id": "0191dce4-9ab4-7fce-b660-8e5dec5172da",
		},
	},

	"tls_settings": {
		"cert_verification_mode": "verify_ca",
	},
}

Workers バインディングの設定

VPC Service を作成したら、Worker にバインドできます。

{
	"$schema": "./node_modules/wrangler/config-schema.json",
	"name": "my-worker",
	"main": "src/index.js",
	"vpc_services": [
		{
			"binding": "PRIVATE_API",
			"service_id": "e6a0817c-79c5-40ca-9776-a1c019defe70",
			"remote": true // When true, utilizes [remote bindings](/workers/local-development/#remote-bindings) to allow access to the VPC Service during local development.
		}
	]
}
"$schema" = "./node_modules/wrangler/config-schema.json"
name = "my-worker"
main = "src/index.js"

[[vpc_services]]
binding = "PRIVATE_API"
service_id = "e6a0817c-79c5-40ca-9776-a1c019defe70"
remote = true

VPC サービスのバインディングは複数持てます。

{
	"vpc_services": [
		{
			"binding": "PRIVATE_API",
			"service_id": "daf43e8c-a81a-4242-9912-4a2ebe4fdd79",
			"remote": true
		},
		{
			"binding": "PRIVATE_DATABASE",
			"service_id": "453b6067-1327-420d-89b3-2b6ad16e6551",
			"remote": true
		},
		{
			"binding": "INTERNAL_CACHE",
			"service_id": "6c39b574-237e-49f4-852a-cea5a93ed8f9",
			"remote": true
		}
	]
}
[[vpc_services]]
binding = "PRIVATE_API"
service_id = "daf43e8c-a81a-4242-9912-4a2ebe4fdd79"
remote = true

[[vpc_services]]
binding = "PRIVATE_DATABASE"
service_id = "453b6067-1327-420d-89b3-2b6ad16e6551"
remote = true

[[vpc_services]]
binding = "INTERNAL_CACHE"
service_id = "6c39b574-237e-49f4-852a-cea5a93ed8f9"
remote = true

必要なロール

Workers VPC は次のアカウントロールを使います。

  • Workers VPC Services と Tunnels を表示するための Connectivity Directory Read
  • Workers で VPC Services を一覧表示、読み取り、バインドするための Connectivity Directory Bind
  • VPC Services の作成、更新、削除、および VPC Network バインディング経由でトンネルへ直接バインドするための Connectivity Directory Admin

ロールの定義は ロール を参照してください。

ロールを最近更新したあとでもコマンドが失敗する場合は、Wrangler の認証を更新します。

npx wrangler logout
npx wrangler login

API トークン(CLOUDFLARE_API_TOKEN)で認証する場合は、トークンが必要なロールを持つユーザーに属していることを確認してください。

次のステップ

役に立ちましたか?