INTEGRITY Документация

Настройка с помощью 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 это:

См. Режим проверки сертификата 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 ↗.