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 は次で構成されます。
- タイプ: 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 の VPC Services を使うと、Workers からプライベートな HTTP/HTTPS エンドポイントへ fetch() できます。
fetch に渡す URL のスキームに関係なく、リクエストはトンネル経由でネットワークに届くまで転送中に暗号化されます。http スキームを使うと、トンネルからサービスへは平文で接続します。
ネットワーク内、トンネルとサービスのあいだを暗号化したい場合は https スキームを使います。https スキームを指定すると、fetch() に渡したホスト名が Server Name Indication(SNI)の値になります。
VPC Services は、デフォルトで http と https の両方のスキームを許可します。特定のスキームだけを強制するには、http_port または https_port のどちらか一方だけを指定します。
Workers VPC がサービスへ接続できない場合、fetch() は例外を投げます。
TCP の VPC Services は、PostgreSQL や MySQL などの TCP ベースサービスへの接続を許可します。TCP サービスを公開するには、tcp サービスタイプと --tcp-port を使います。
任意で --app-protocol に postgresql または mysql を指定し、アプリケーション層プロトコルを示せます。このメタデータは、Hyperdrive などほかの Cloudflare 製品が、対応するワイヤプロトコルの TCP サービスを探すときに使います。
TCP の VPC Services は、Workers からプライベートデータベースへ接続するために Hyperdrive と組み合わせて使います。手順の全体は Workers VPC でプライベートデータベースに接続する を参照してください。
https スキームを使うとき、トンネルはオリジンサービスが提示する TLS 証明書を検証します。Workers VPC が信頼する証明書の種類は次のとおりです。
- 一般に信頼される証明書 — よく知られた公開認証局(Let's Encrypt、DigiCert など)が発行した証明書。
- Cloudflare Origin CA 証明書 — Cloudflare とオリジン間の通信を暗号化する、Cloudflare 発行の無料証明書です。Origin CA 証明書はブラウザーからは信頼されませんが、Workers VPC がプライベートサービスへ接続するときは信頼します。
オリジンサービスが、一般に信頼される CA または Cloudflare Origin CA 以外の証明書を提示すると、TLS ハンドシェイクは失敗し、fetch() は例外を投げます。
VPC Service の作成時または更新時に --cert-verification-mode を設定すると、オリジンサービスへの接続が TLS 証明書を検証する方法を変えられます。HTTP と TCP の両方のサービスタイプに適用されます。
| モード | 説明 |
|---|---|
verify_full |
証明書チェーンとホスト名を検証します(デフォルト) |
verify_ca |
証明書チェーンのみ検証し、ホスト名の検証をスキップします |
disabled |
サーバー証明書を検証しません |
これらの設定は、より広い connectivity directory 内のサービスタイプである VPC Service 作成用 REST API の想定契約を表します。
次は、カスタムの 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 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
},
},
}次は、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",
},
},
}次の例は、証明書検証モード 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",
},
}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 = trueVPC サービスのバインディングは複数持てます。
{
"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 = trueWorkers 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 loginAPI トークン(CLOUDFLARE_API_TOKEN)で認証する場合は、トークンが必要なロールを持つユーザーに属していることを確認してください。
- VPC Services をインフラストラクチャとして管理するには Terraform で VPC Services を設定する
- 環境向けに Cloudflare Tunnel をセットアップする
- Service Binding API を確認する
- よくあるユースケースの 例 を参照する