← Cloudflare Workers VPC / workers-vpc / configuration / vpc-services
Настройка с помощью Terraform
VPC Services можно управлять как инфраструктурой с помощью cloudflare_connectivity_directory_service ↗ ресурс в Провайдер Terraform для Cloudflare.
Это напрямую соответствует справочник по подключению : базовый API, который также использует панель управления и Wrangler CLI для создания и управления VPC Services. Тот же Поля конфигурации VPC Service (тип, хост, порты, ID туннеля) применяются независимо от способа создания сервиса.
Ресурс VPC Service
cloudflare_connectivity_directory_service ресурс создаёт VPC Service в каталоге подключений. Каждый ресурс соответствует одной записи VPC Service, к которой может привязаться Worker.
Настройка на основе hostname
При использовании имени хоста укажите host.hostname с resolver_network блок. Это аналогично привязке на основе имени хоста Пример конфигурации JSON.
resource "cloudflare_connectivity_directory_service" "my_private_api" {
account_id = var.account_id
name = "my-private-api"
type = "http"
http_port = 80
https_port = 443
host = {
hostname = "internal-api.example.com"
resolver_network = {
tunnel_id = var.tunnel_id
}
}
}Чтобы использовать собственный DNS-резолвер в вашей приватной сети, добавьте resolver_ips:
resource "cloudflare_connectivity_directory_service" "my_private_api" {
account_id = var.account_id
name = "my-private-api"
type = "http"
host = {
hostname = "internal-api.example.com"
resolver_network = {
tunnel_id = var.tunnel_id
resolver_ips = ["10.0.0.53"]
}
}
}Настройка на основе IP-адреса
При использовании IP-адресов укажите host.ipv4 и/или host.ipv6 с network блок. Это аналогично привязке на основе IP-адреса Пример конфигурации JSON.
resource "cloudflare_connectivity_directory_service" "my_private_api" {
account_id = var.account_id
name = "my-private-api"
type = "http"
http_port = 8080
https_port = 8443
host = {
ipv4 = "10.0.1.50"
ipv6 = "fe80::1"
network = {
tunnel_id = var.tunnel_id
}
}
}Конфигурация TCP-сервиса
Для TCP-сервисов (например, баз данных) укажите type = "tcp" и укажите tcp_port. При необходимости вы можете указать app_protocol postgresql или mysql.
resource "cloudflare_connectivity_directory_service" "my_database" {
account_id = var.account_id
name = "my-postgres-db"
type = "tcp"
tcp_port = 5432
app_protocol = "postgresql"
host = {
ipv4 = "10.0.0.5"
network = {
tunnel_id = var.tunnel_id
}
}
}Проверка сертификата TLS
Чтобы настроить режим проверки TLS-сертификата для подключения к источнику, добавьте tls_settings блок:
resource "cloudflare_connectivity_directory_service" "my_database" {
account_id = var.account_id
name = "my-postgres-db"
type = "tcp"
tcp_port = 5432
app_protocol = "postgresql"
host = {
ipv4 = "10.0.0.5"
network = {
tunnel_id = var.tunnel_id
}
}
tls_settings = {
cert_verification_mode = "verify_ca"
}
}Допустимые значения для cert_verification_mode это:
verify_full(по умолчанию)verify_cadisabled
См. Режим проверки сертификата TLS для получения подробностей.
Настройка портов
Для HTTP-сервисов порты необязательны и по умолчанию равны 80 (HTTP) и 443 (HTTPS). Чтобы разрешить только одну схему, укажите только один из http_port или https_port. См. Настройка VPC Service о том, как работают принудительное применение схемы и обработка портов.
Для TCP-сервисов tcp_port обязательно.
Настройка привязки Workers
Когда VPC Service создан, привяжите его к Worker с помощью vpc_service тип привязки в bindings массив объекта cloudflare_worker_version ресурс. Это эквивалентно vpc_services массив в конфигурации Wrangler.
resource "cloudflare_worker_version" "my_worker_version" {
account_id = var.account_id
worker_id = cloudflare_worker.my_worker.id
compatibility_date = "2025-02-21" # Set this to today's date
main_module = "worker.js"
modules = [{
name = "worker.js"
content_type = "application/javascript+module"
content_file = "build/worker.js"
}]
bindings = [{
type = "vpc_service"
name = "PRIVATE_API"
service_id = cloudflare_connectivity_directory_service.my_private_api.service_id
}]
}К одному Worker можно добавить несколько привязок VPC Service:
bindings = [
{
type = "vpc_service"
name = "PRIVATE_API"
service_id = cloudflare_connectivity_directory_service.api.service_id
},
{
type = "vpc_service"
name = "PRIVATE_DATABASE"
service_id = cloudflare_connectivity_directory_service.database.service_id
}
]Код Worker обращается к каждой привязке через env.PRIVATE_API.fetch() и env.PRIVATE_DATABASE.fetch(), как описано в Workers Binding API.
Подробнее об управлении Workers и привязками через Terraform см. в Инфраструктура как код в Workers.
Источники данных
Провайдер Terraform включает источники данных для чтения существующих VPC Services без управления их жизненным циклом.
Поиск отдельного VPC Service
data "cloudflare_connectivity_directory_service" "existing" {
account_id = var.account_id
service_id = "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"
}Это полезно для привязки к VPC Service, который управляется за пределами вашей конфигурации Terraform (например, создан через панель управления или Wrangler CLI).
Список VPC Service
data "cloudflare_connectivity_directory_services" "all_http" {
account_id = var.account_id
type = "http"
}
data "cloudflare_connectivity_directory_services" "all_tcp" {
account_id = var.account_id
type = "tcp"
}Справочник по схеме ресурса
resource "cloudflare_connectivity_directory_service" "example" {
# Required
account_id = "your-account-id" # Account identifier
name = "my-private-api" # Human-readable name
type = "http" # Service type: "http" or "tcp"
# HTTP-specific (optional, defaults to 80/443)
http_port = 80 # HTTP port
https_port = 443 # HTTPS port
# TCP-specific (tcp_port is required when type = "tcp")
# tcp_port = 5432 # TCP port
# app_protocol = "postgresql" # Optional: "postgresql" or "mysql"
host = {
# Use hostname OR ipv4/ipv6, not both
# Option A: Hostname-based
hostname = "internal-api.example.com"
resolver_network = {
tunnel_id = "tunnel-uuid" # Required — Cloudflare Tunnel ID
resolver_ips = ["10.0.0.53"] # Optional — custom DNS resolver IPs
}
# Option B: IP-based
# ipv4 = "10.0.1.50" # IPv4 address
# ipv6 = "fe80::1" # IPv6 address
# network = {
# tunnel_id = "tunnel-uuid" # Required — Cloudflare Tunnel ID
# }
}
# Optional TLS settings
# tls_settings = {
# cert_verification_mode = "verify_full" # "verify_full", "verify_ca", or "disabled"
# }
# Read-only (computed by the API)
# id — Terraform resource ID
# service_id — VPC Service ID (use this for Worker bindings)
# created_at — Creation timestamp
# updated_at — Last update timestamp
}Полную схему см. в Документация реестра Terraform ↗.