本指南介绍如何使用 Cloudflare Terraform 提供程序 (Provider) ↗ 快速发布和保护私有应用程序。在以下示例中,我们将一个新发布的应用程序添加到现有的 Cloudflare Tunnel,配置 cloudflared 如何将流量代理到该应用程序,并使用 Cloudflare Access 保护该应用程序。
- 将你的域名添加到 Cloudflare
- 配置 IdP 集成
- 通过 Zero Trust 仪表板创建 Cloudflare Tunnel
- 安装 Terraform 客户端 ↗
- 创建 API 令牌(参阅最低所需权限)
Terraform 通过包含配置文件的工作目录发挥作用。您可以将配置存储在多个文件中,也可以仅存储在一个文件中——Terraform 将把目录中的所有配置文件视为处于单个文档中进行评估。
-
为您的 Terraform 配置创建一个文件夹:
mkdir cloudflare-tf -
进入该目录:
cd cloudflare-tf
创建一个 .tf 文件并复制粘贴以下示例。填入你的 API 令牌、账户和区域信息以及 Tunnel ID。
查找 Tunnel ID
-
在 Cloudflare 仪表板中,转到 Networking(网络) > Tunnels(隧道)。
Go to Tunnels ↗ -
选择隧道名称。
-
复制 Tunnel ID(隧道 ID)。
terraform {
required_providers {
cloudflare = {
source = "cloudflare/cloudflare"
version = "~> 4.0"
}
}
}
provider "cloudflare" {
api_token = "<API-TOKEN>"
}
variable "account_id" {
default = "<ACCOUNT-ID>"
}
variable "zone_id" {
default = "<ZONE-ID>"
}
variable "zone_name" {
default = "mycompany.com"
}
variable "tunnel_id" {
default = "<TUNNEL-ID>"
}将以下资源添加到你的 Terraform 配置中。
使用 cloudflare_tunnel_config ↗ 资源,创建一个将你的应用程序映射到公共 DNS 记录的 Ingress 规则。本示例使 localhost:8080 在 app.mycompany.com 上可用,设置 Connect Timeout,并启用 Access JWT 验证。
resource "cloudflare_tunnel_config" "example_config" {
account_id = var.cloudflare_account_id
tunnel_id = var.tunnel_id
config {
ingress_rule {
hostname = "app.${var.zone_name}"
service = "http://localhost:8080"
origin_request {
connect_timeout = "2m0s"
access {
required = true
team_name = "myteam"
aud_tag = [cloudflare_access_application.example_app.aud]
}
}
}
ingress_rule {
# 当请求不匹配前面的任何主机名时,以 `404` 状态码响应。
service = "http_status:404"
}
}
}使用 cloudflare_access_application ↗ 资源将应用程序添加到 Cloudflare Access。
resource "cloudflare_access_application" "example_app" {
zone_id = var.zone_id
name = "Example application"
domain = "app.${var.zone_name}"
type = "self_hosted"
session_duration = "24h"
auto_redirect_to_identity = false
}使用 cloudflare_access_policy ↗ 资源,创建一条保护应用程序的策略。以下策略将仅允许通过你的身份提供者进行身份验证的用户访问。
resource "cloudflare_access_policy" "example_policy" {
application_id = cloudflare_access_application.example_app.id
zone_id = var.zone_id
name = "Example policy"
precedence = "1"
decision = "allow"
include {
login_method = ["<IDP-UUID>"]
}
}要部署配置文件:
-
初始化您的配置目录:
terraform init -
预览将要创建的所有内容:
terraform plan -
应用该配置:
terraform apply
用户现在可以通过转到公共 URL 并通过 Cloudflare Access 完成身份验证来访问私有应用程序。
你可以在 Cloudflare 仪表板中的 Networking(网络) > Tunnels(隧道) 下查看你的新隧道。
Go to Tunnels ↗你的 Access 应用程序和策略位于 Zero Trust > Access controls(访问控制) > Applications ↗ 下。