INTEGRITY Dokumentace

Konfigurace pomocí Terraformu

VPC Services lze spravovat jako infrastrukturu pomocí cloudflare_connectivity_directory_service ↗ prostředek na Cloudflare Terraform provider.

Toto se přímo mapuje na adresář konektivity : jde o stejné rozhraní API, které pro vytváření a správu VPC Services používá i dashboard a Wrangler CLI. Stejné Pole konfigurace VPC Service (typ, hostitel, porty, ID tunelu) platí bez ohledu na to, jakým způsobem byla služba vytvořena.

Prostředek VPC Service

cloudflare_connectivity_directory_service resource vytvoří VPC Service v adresáři konektivity. Každý resource odpovídá jedné položce VPC Service, na kterou se může Worker navázat.

Konfigurace založená na hostname

Pokud používáte hostname, uveďte host.hostname s resolver_network blok. Tomu odpovídá vazba založená na hostname, konkrétně Příklad konfigurace 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
    }
  }
}

Chcete-li ve své privátní síti použít vlastní DNS resolver, přidejte 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"]
    }
  }
}

Konfigurace založená na IP adrese

Pokud používáte IP adresy, uveďte host.ipv4 a/nebo host.ipv6 s network blok. Tomu odpovídá vazba založená na IP adrese, konkrétně Příklad konfigurace 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
    }
  }
}

Konfigurace služby TCP

U služeb TCP (například databází) nastavte type = "tcp" a uveďte tcp_port. Volitelně můžete zadat app_protocol z postgresql nebo 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
    }
  }
}

ověření certifikátu TLS

Chcete-li nastavit režim ověřování TLS certifikátu pro připojení k originu, přidejte tls_settings blok:

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"
  }
}

Platné hodnoty pro cert_verification_mode jsou:

Viz Režim ověřování certifikátu TLS s podrobnostmi.

Konfigurace portu

U služeb HTTP jsou porty volitelné a výchozí hodnoty jsou 80 (HTTP) a 443 (HTTPS). Chcete-li vynutit jediné schéma, zadejte pouze jedno z http_port nebo https_port. Viz Konfigurace VPC Service o tom, jak funguje vynucování schématu a chování portů.

U služeb TCP, tcp_port je povinné.

Konfigurace vazby Workers

Jakmile VPC Service existuje, svažte ji s Workerem pomocí vpc_service typ vazby v bindings pole objektu cloudflare_worker_version resource. To odpovídá vpc_services pole v konfiguraci 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
  }]
}

Ke stejnému Workeru lze přidat více bindingů 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
  }
]

Kód Workeru přistupuje ke každé vazbě prostřednictvím env.PRIVATE_API.fetch() a env.PRIVATE_DATABASE.fetch(), jak je popsáno v Workers Binding API.

Další podrobnosti o správě Workers a bindingů pomocí Terraformu najdete v Infrastruktura Workers jako kód.

Zdroje dat

Poskytovatel Terraform obsahuje datové zdroje pro čtení existujících VPC Services bez správy jejich životního cyklu.

Vyhledání jedné VPC Service

data "cloudflare_connectivity_directory_service" "existing" {
  account_id = var.account_id
  service_id = "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"
}

To se hodí pro binding na VPC Service, která je spravovaná mimo vaši konfiguraci Terraform (například vytvořená přes dashboard nebo Wrangler CLI).

Výpis VPC Services

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"
}

Odkaz na schéma prostředku

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
}

Úplné schéma najdete v Dokumentace registru Terraform ↗.