上一篇 下一篇 分享链接 返回 返回顶部

Cloudflare API 生产实战:从 DNS 自动化到缓存刷新避坑指南

发布人:慈云数据-客服中心 发布时间:6小时前 阅读量:4

Cloudflare API接口调用教程|生产环境实测

在实际生产环境中,Cloudflare 不仅仅是一个 CDN 或 DNS 托管平台,它更像是一套完整的边缘网络基础设施。无论是自动化管理 DNS 记录、批量刷新缓存、配置 WAF 规则,还是接入 Zero Trust、Workers、Pages 等服务,Cloudflare API 都是非常重要的能力。

本文将以生产环境中的真实使用思路为基础,系统讲解 Cloudflare API 的调用方式、认证方法、常用接口、错误处理、脚本封装以及上线注意事项。文章适合已经在使用 Cloudflare,或准备将 Cloudflare 纳入 DevOps 自动化体系的开发者、运维工程师阅读。


一、Cloudflare API 能做什么?

Cloudflare 提供了非常完整的 REST API,几乎可以覆盖控制台中的大部分操作。常见使用场景包括:

  1. 自动创建、修改、删除 DNS 记录
  2. 批量刷新 CDN 缓存
  3. 查询域名 Zone 信息
  4. 自动配置 SSL/TLS 模式
  5. 管理防火墙规则、WAF、Rate Limit
  6. 自动化部署 Workers
  7. 管理 Page Rules 或 Cache Rules
  8. 获取流量、安全、性能分析数据
  9. 和 CI/CD 流水线集成
  10. 多站点、多域名集中运维

在生产环境中,最常见的使用场景主要有两个:

  • DNS 自动化管理
  • 缓存自动刷新

例如,应用发布完成后,CI/CD 系统可以自动调用 Cloudflare API 清理指定 URL 缓存,避免用户访问到旧资源。再比如,业务需要动态绑定子域名时,可以通过 API 自动添加 DNS 解析记录,而不需要人工登录控制台操作。


二、Cloudflare API 基础地址

Cloudflare API 的基础地址为:

https://api.cloudflare.com/client/v4

所有接口基本都基于这个地址进行调用。

例如,查询账户下的 Zone 列表:

GET https://api.cloudflare.com/client/v4/zones

查询某个 Zone 下的 DNS 记录:

GET https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records

刷新缓存:

POST https://api.cloudflare.com/client/v4/zones/{zone_id}/purge_cache

Cloudflare API 返回的数据一般是 JSON 格式,典型结构如下:

{
  "success": true,
  "errors": [],
  "messages": [],
  "result": {}
}

其中:

字段 说明
success 请求是否成功
errors 错误信息数组
messages 附加提示信息
result 实际返回结果

在生产环境中,不能只判断 HTTP 状态码,还要同时判断 success 字段。因为有些情况下 HTTP 状态码可能是 200,但业务层面的操作仍然可能失败。


三、API Token 与 Global API Key 的区别

调用 Cloudflare API 前,首先需要认证。Cloudflare 主要支持两类认证方式:

  1. API Token
  2. Global API Key

1. API Token

API Token 是目前更推荐的方式。它支持精细化权限控制,可以限制具体账户、具体 Zone、具体操作权限。

例如,你可以创建一个 Token,只允许它操作某个域名的 DNS 记录,而不能修改 WAF 或账户信息。

请求头格式如下:

Authorization: Bearer YOUR_API_TOKEN

完整示例:

curl -X GET "https://api.cloudflare.com/client/v4/zones" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json"

2. Global API Key

Global API Key 是比较早期的认证方式,权限较大,不建议在生产环境中使用,除非确实有兼容性需求。

请求头格式如下:

X-Auth-Email: your-email@example.com
X-Auth-Key: YOUR_GLOBAL_API_KEY

示例:

curl -X GET "https://api.cloudflare.com/client/v4/zones" \
  -H "X-Auth-Email: your-email@example.com" \
  -H "X-Auth-Key: YOUR_GLOBAL_API_KEY" \
  -H "Content-Type: application/json"

生产环境建议

生产环境中建议使用 API Token,并遵循最小权限原则:

  • 只给需要的 Zone 权限
  • 只给需要的操作权限
  • 不要使用 Root 权限 Token
  • Token 不要写死在代码中
  • 使用环境变量、密钥管理系统或 CI/CD Secret 管理

例如 GitHub Actions 中可以将 Token 存储在:

Repository Settings -> Secrets and variables -> Actions

然后在流水线中通过环境变量读取。


四、创建 Cloudflare API Token

创建 API Token 的步骤如下:

  1. 登录 Cloudflare 控制台
  2. 点击右上角头像
  3. 进入 My Profile
  4. 选择 API Tokens
  5. 点击 Create Token
  6. 选择模板或自定义 Token
  7. 配置权限
  8. 选择作用范围
  9. 创建并保存 Token

如果只是用于 DNS 管理,可以配置如下权限:

Zone -> DNS -> Edit
Zone -> Zone -> Read

作用范围建议选择指定 Zone,而不是所有 Zone。

如果只是用于缓存刷新,可以配置:

Zone -> Cache Purge -> Purge
Zone -> Zone -> Read

如果需要查询 Zone ID,则还需要 Zone Read 权限。

注意:Token 创建后通常只展示一次,请立即复制并保存到安全位置。


五、查询 Zone ID

Cloudflare 中每个域名都对应一个 Zone。很多 API 都需要传入 zone_id

假设我们要查询域名 example.com 的 Zone ID,可以使用如下接口:

curl -X GET "https://api.cloudflare.com/client/v4/zones?name=example.com" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json"

返回示例:

{
  "success": true,
  "errors": [],
  "messages": [],
  "result": [
    {
      "id": "023e105f4ecef8ad9ca31a8372d0c353",
      "name": "example.com",
      "status": "active",
      "paused": false,
      "type": "full"
    }
  ]
}

其中 result[0].id 就是 Zone ID。

在生产环境中,建议将 Zone ID 配置到环境变量中,而不是每次请求都查询。例如:

export CLOUDFLARE_ZONE_ID="023e105f4ecef8ad9ca31a8372d0c353"
export CLOUDFLARE_API_TOKEN="your_api_token"

这样可以减少 API 调用次数,也能提升脚本执行速度。


六、DNS 记录管理接口实战

DNS 管理是 Cloudflare API 最常见的使用场景之一。下面以 A 记录为例,演示查询、新增、修改和删除 DNS 记录。


1. 查询 DNS 记录

查询某个 Zone 下的 DNS 记录:

curl -X GET "https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ZONE_ID}/dns_records" \
  -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \
  -H "Content-Type: application/json"

如果只查询某个域名记录,例如 api.example.com

curl -X GET "https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ZONE_ID}/dns_records?name=api.example.com" \
  -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \
  -H "Content-Type: application/json"

返回示例:

{
  "success": true,
  "result": [
    {
      "id": "dns_record_id",
      "type": "A",
      "name": "api.example.com",
      "content": "192.0.2.1",
      "proxied": true,
      "ttl": 1
    }
  ]
}

字段说明:

字段 说明
id DNS 记录 ID
type 记录类型,例如 A、AAAA、CNAME、TXT
name 记录名称
content 记录内容
proxied 是否开启 Cloudflare 代理
ttl TTL,值为 1 表示自动

2. 新增 DNS 记录

新增一条 A 记录:

curl -X POST "https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ZONE_ID}/dns_records" \
  -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \
  -H "Content-Type: application/json" \
  --data '{
    "type": "A",
    "name": "api.example.com",
    "content": "192.0.2.10",
    "ttl": 1,
    "proxied": true
  }'

参数说明:

参数 说明
type DNS 类型
name 域名或子域名
content 解析目标
ttl TTL,自动一般填 1
proxied 是否开启橙云代理

如果你希望 Cloudflare 只做 DNS 解析,不经过 CDN,可以设置:

"proxied": false

生产环境中要特别注意 proxied 字段。因为开启代理后,用户访问到的是 Cloudflare 边缘节点,而不是直接访问源站。这会影响真实 IP 获取、SSL 证书、WebSocket、端口支持等问题。


3. 修改 DNS 记录

修改 DNS 记录需要知道该记录的 record_id

接口地址:

PUT /zones/{zone_id}/dns_records/{record_id}

示例:

curl -X PUT "https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ZONE_ID}/dns_records/${RECORD_ID}" \
  -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \
  -H "Content-Type: application/json" \
  --data '{
    "type": "A",
    "name": "api.example.com",
    "content": "192.0.2.20",
    "ttl": 1,
    "proxied": true
  }'

需要注意:PUT 通常是整体替换,建议把原来的重要字段一起传入,避免遗漏配置。

如果只是局部更新,也可以使用 PATCH

curl -X PATCH "https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ZONE_ID}/dns_records/${RECORD_ID}" \
  -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \
  -H "Content-Type: application/json" \
  --data '{
    "content": "192.0.2.30"
  }'

4. 删除 DNS 记录

删除接口:

curl -X DELETE "https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ZONE_ID}/dns_records/${RECORD_ID}" \
  -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \
  -H "Content-Type: application/json"

生产环境中删除操作一定要谨慎,建议:

  • 删除前先查询并打印记录信息
  • 对关键域名增加二次确认
  • 脚本中区分测试环境和生产环境
  • 保留操作日志
  • 不要批量删除未确认的记录

七、封装一个 DNS 自动更新脚本

下面是一个 Shell 脚本示例,用于自动更新指定子域名的 A 记录。如果记录不存在,则自动创建;如果存在,则更新 IP。

#!/usr/bin/env bash

set -euo pipefail

CF_API_TOKEN="${CLOUDFLARE_API_TOKEN}"
CF_ZONE_ID="${CLOUDFLARE_ZONE_ID}"
DOMAIN_NAME="api.example.com"
NEW_IP="192.0.2.100"

if [[ -z "${CF_API_TOKEN}" || -z "${CF_ZONE_ID}" ]]; then
  echo "Cloudflare API Token 或 Zone ID 未配置"
  exit 1
fi

echo "查询 DNS 记录:${DOMAIN_NAME}"

RESPONSE=$(curl -s -X GET \
  "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records?name=${DOMAIN_NAME}" \
  -H "Authorization: Bearer ${CF_API_TOKEN}" \
  -H "Content-Type: application/json")

SUCCESS=$(echo "${RESPONSE}" | jq -r '.success')
if [[ "${SUCCESS}" != "true" ]]; then
  echo "查询 DNS 记录失败:${RESPONSE}"
  exit 1
fi

RECORD_ID=$(echo "${RESPONSE}" | jq -r '.result[0].id // empty')

if [[ -z "${RECORD_ID}" ]]; then
  echo "记录不存在,开始创建"

  CREATE_RESPONSE=$(curl -s -X POST \
    "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records" \
    -H "Authorization: Bearer ${CF_API_TOKEN}" \
    -H "Content-Type: application/json" \
    --data "{
      \"type\": \"A\",
      \"name\": \"${DOMAIN_NAME}\",
      \"content\": \"${NEW_IP}\",
      \"ttl\": 1,
      \"proxied\": true
    }")

  echo "创建结果:${CREATE_RESPONSE}"
else
  echo "记录已存在,Record ID:${RECORD_ID},开始更新"

  UPDATE_RESPONSE=$(curl -s -X PATCH \
    "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records/${RECORD_ID}" \
    -H "Authorization: Bearer ${CF_API_TOKEN}" \
    -H "Content-Type: application/json" \
    --data "{
      \"content\": \"${NEW_IP}\"
    }")

  echo "更新结果:${UPDATE_RESPONSE}"
fi

这个脚本在生产环境中可以用于:

  • 动态公网 IP 更新
  • 临时环境域名绑定
  • Kubernetes Ingress 外部地址更新
  • 灰度环境 DNS 切换

不过需要提醒的是,如果涉及核心业务域名,不建议直接通过脚本频繁修改 DNS。对于核心流量切换,应当结合负载均衡、健康检查、回滚机制一起设计。


八、缓存刷新接口实战

Cloudflare 缓存刷新也是生产环境中非常常用的接口。比如前端静态资源发布后,如果 URL 没有加版本号,可能需要手动或自动刷新缓存。

Cloudflare 支持多种刷新方式:

  1. 刷新全部缓存
  2. 刷新指定 URL
  3. 按 Tag 刷新
  4. 按 Host 刷新
  5. 按 Prefix 刷新

不同套餐支持能力可能不同,以实际账号权限为准。


1. 刷新全部缓存

curl -X POST "https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ZONE_ID}/purge_cache" \
  -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \
  -H "Content-Type: application/json" \
  --data '{
    "purge_everything": true
  }'

这个操作会清理整个 Zone 的缓存。

生产环境中不建议频繁使用 purge_everything,原因包括:

  • 会导致缓存命中率下降
  • 增加源站回源压力
  • 高峰期可能放大源站负载
  • 多次全量刷新可能影响整体访问性能

一般建议只刷新变更的 URL。


2. 刷新指定 URL

curl -X POST "https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ZONE_ID}/purge_cache" \
  -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \
  -H "Content-Type: application/json" \
  --data '{
    "files": [
      "https://www.example.com/index.html",
      "https://www.example.com/static/app.js"
    ]
  }'

这是生产环境最推荐的刷新方式之一。

如果你的前端资源使用了带 hash 的文件名,例如:

app.8d91f3.js
style.a72bc1.css

通常不需要刷新 JS 和 CSS,只需要刷新 HTML 入口文件即可。


3. CI/CD 中刷新缓存示例

假设使用 GitHub Actions,可以在部署完成后添加如下步骤:

name: Deploy and Purge Cloudflare Cache

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Deploy
        run: |
          echo "这里执行实际部署命令"

      - name: Purge Cloudflare Cache
        env:
          CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          CLOUDFLARE_ZONE_ID: ${{ secrets.CLOUDFLARE_ZONE_ID }}
        run: |
          curl -X POST "https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ZONE_ID}/purge_cache" \
            -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \
            -H "Content-Type: application/json" \
            --data '{
              "files": [
                "https://www.example.com/index.html"
              ]
            }'

如果你有多个页面入口,可以把 URL 放到脚本中动态生成。


九、使用 Python 调用 Cloudflare API

除了 curl,生产环境中也常用 Python 封装 API 调用。下面是一个简单示例。

import os
import requests

CF_API_TOKEN = os.getenv("CLOUDFLARE_API_TOKEN")
CF_ZONE_ID = os.getenv("CLOUDFLARE_ZONE_ID")

BASE_URL = "https://api.cloudflare.com/client/v4"

headers = {
    "Authorization": f"Bearer {CF_API_TOKEN}",
    "Content-Type": "application/json"
}

def purge_cache(files):
    url = f"{BASE_URL}/zones/{CF_ZONE_ID}/purge_cache"
    payload = {
        "files": files
    }

    response = requests.post(url, headers=headers, json=payload, timeout=10)
    data = response.json()

    if response.status_code >= 400 or not data.get("success"):
        raise RuntimeError(f"Cloudflare 缓存刷新失败: {data}")

    return data

if __name__ == "__main__":
    result = purge_cache([
        "https://www.example.com/index.html",
        "https://www.example.com/about.html"
    ])
    print(result)

生产环境中建议加入:

  • 超时控制
  • 重试机制
  • 错误日志
  • 请求 ID 追踪
  • 告警通知
  • 幂等处理

尤其是缓存刷新和 DNS 更新,一旦失败,需要让部署系统能够感知,而不是静默失败。


十、Node.js 调用示例

如果你的项目是 Node.js 技术栈,也可以这样封装:

const axios = require("axios");

const CF_API_TOKEN = process.env.CLOUDFLARE_API_TOKEN;
const CF_ZONE_ID = process.env.CLOUDFLARE_ZONE_ID;

const client = axios.create({
  baseURL: "https://api.cloudflare.com/client/v4",
  timeout: 10000,
  headers: {
    Authorization: `Bearer ${CF_API_TOKEN}`,
    "Content-Type": "application/json",
  },
});

async function purgeCache(files) {
  const res = await client.post(`/zones/${CF_ZONE_ID}/purge_cache`, {
    files,
  });

  if (!res.data.success) {
    throw new Error(`Cloudflare purge failed: ${JSON.stringify(res.data.errors)}`);
  }

  return res.data.result;
}

purgeCache(["https://www.example.com/index.html"])
  .then((result) => {
    console.log("缓存刷新成功", result);
  })
  .catch((err) => {
    console.error("缓存刷新失败", err);
    process.exit(1);
  });

在生产环境中,建议不要在业务请求链路中同步调用 Cloudflare API。更合理的方式是:

  • 将操作投递到任务队列
  • 后台 Worker 异步处理
  • 失败后自动重试
  • 最终失败后通知运维或开发人员

这样可以避免 Cloudflare API 调用失败影响用户请求。


十一、分页与批量查询

Cloudflare 一些列表接口支持分页,例如 DNS 记录列表、Zone 列表等。

常见分页参数包括:

page
per_page

示例:

curl -X GET "https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ZONE_ID}/dns_records?page=1&per_page=100" \
  -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \
  -H "Content-Type: application/json"

返回结果中通常会包含:

"result_info": {
  "page": 1,
  "per_page": 100,
  "count": 100,
  "total_count": 350,
  "total_pages": 4
}

如果生产环境中要同步大量 DNS 记录,一定要处理分页,不能默认只取第一页。

建议逻辑如下:

  1. 请求第一页
  2. 读取 total_pages
  3. 循环请求后续页
  4. 合并结果
  5. 做差异比较
  6. 只提交必要变更

十二、错误处理与状态码

Cloudflare API 常见错误包括:

状态码 可能原因
400 参数错误,请求体格式错误
401 Token 无效或未传认证信息
403 Token 权限不足
404 Zone ID、Record ID 不存在
429 请求频率过高
5xx Cloudflare 服务端异常或临时不可用

示例错误响应:

{
  "success": false,
  "errors": [
    {
      "code": 9109,
      "message": "Invalid access token"
    }
  ],
  "messages": [],
  "result": null
}

生产环境建议:

  • 对 401、403 直接失败并告警
  • 对 400 记录请求参数,便于排查
  • 对 404 检查 Zone ID 或资源 ID
  • 对 429 做限流和退避重试
  • 对 5xx 做短暂重试
  • 所有失败都要打印 errors 字段

重试策略可以采用指数退避,例如:

第一次失败:等待 1 秒
第二次失败:等待 2 秒
第三次失败:等待 4 秒
第四次失败:等待 8 秒

但不要无限重试,否则可能造成雪崩或触发更多限制。


十三、生产环境安全建议

Cloudflare API Token 具备修改 DNS、缓存、防火墙等能力,如果泄露会造成严重影响。生产环境中必须重视密钥安全。

1. 不要写死 Token

错误示例:

CF_API_TOKEN = "abc123xxx"

正确做法:

CF_API_TOKEN = os.getenv("CLOUDFLARE_API_TOKEN")

2. 使用最小权限

如果脚本只负责刷新缓存,就不要授予 DNS 编辑权限。

如果脚本只管理 example.com,就不要授权所有 Zone。

3. 定期轮换 Token

建议定期更换 API Token,尤其是:

  • 人员离职
  • CI/CD 系统迁移
  • 代码仓库权限变更
  • 发生疑似泄露

4. 操作日志留存

建议记录以下信息:

  • 操作时间
  • 操作类型
  • 操作目标
  • 请求参数摘要
  • 返回状态
  • 执行人或系统来源
  • Trace ID

注意不要在日志中打印完整 Token。

5. 区分环境

测试环境和生产环境应使用不同 Token,不同 Zone,或者至少使用不同权限范围。

不要让测试脚本拥有生产环境 DNS 修改权限。


十四、生产环境实测经验总结

结合实际生产环境经验,以下几点非常关键。

1. 缓存刷新尽量精确

全量刷新虽然简单,但对源站压力较大。尤其是大型站点,如果全量刷新后大量用户同时访问,会导致源站 QPS 瞬间升高。

推荐优先级:

带 hash 静态资源 > 刷新 HTML 文件 > 刷新指定 URL > 全量刷新

2. DNS 变更要有回滚方案

DNS 变更可能直接影响线上访问。上线前应记录旧值,变更失败或业务异常时可以快速恢复。

例如脚本中可以先保存原记录:

api.example.com -> 192.0.2.10

变更后如果健康检查失败,就回滚到旧 IP。

3. 不要忽略 proxied 字段

很多线上问题都和 proxied 设置有关:

  • 开启代理后源站看到的是 Cloudflare IP
  • 需要配置真实 IP 获取
  • 部分非标准端口可能不可用
  • SSL 模式设置不当会导致循环跳转
  • WebSocket、HTTP/2、HTTP/3 行为可能变化

4. API 调用要设置超时

不要让 HTTP 请求无限等待。无论 Python、Node.js 还是 Java,都应该设置 timeout。

5. 自动化操作要有审计

如果多个系统都能调用 Cloudflare API,后期排查问题会很困难。建议为不同系统创建不同 Token,并在日志中标记来源。

例如:

token-cicd-cache-purge
token-dns-manager-prod
token-dns-manager-staging

6. 避免并发修改同一条 DNS 记录

如果多个任务同时修改同一条记录,可能出现覆盖问题。建议引入锁机制,或者让一个统一的 DNS 管理服务负责变更。


十五、完整调用流程建议

在生产环境中,一个可靠的 Cloudflare API 调用流程应该包含以下步骤:

  1. 读取配置和密钥
  2. 校验参数
  3. 发送 API 请求
  4. 判断 HTTP 状态码
  5. 判断 success 字段
  6. 解析 errorsmessages
  7. 记录操作日志
  8. 必要时重试
  9. 失败时告警
  10. 高风险操作支持回滚

例如缓存刷新流程可以设计为:

应用部署成功
    ↓
生成需要刷新的 URL 列表
    ↓
调用 Cloudflare Purge Cache API
    ↓
判断返回结果
    ↓
成功:部署完成
    ↓
失败:重试 3 次
    ↓
仍失败:发送告警,但不一定回滚应用

DNS 变更流程可以设计为:

读取目标记录
    ↓
保存旧值
    ↓
提交 DNS 修改
    ↓
等待短暂生效
    ↓
执行健康检查
    ↓
健康检查成功:完成
    ↓
健康检查失败:回滚旧值并告警

十六、常见问题排查

1. 返回 401 Invalid access token

可能原因:

  • Token 填错
  • Token 已删除
  • Token 复制时包含空格
  • 请求头格式错误

正确格式:

-H "Authorization: Bearer YOUR_API_TOKEN"

2. 返回 403 权限不足

说明 Token 有效,但权限不够。检查:

  • 是否授权了对应 Zone
  • 是否具备 DNS Edit 权限
  • 是否具备 Cache Purge 权限
  • 是否使用了错误账户下的 Token

3. DNS 修改成功但没有立即生效

可能原因:

  • 本地 DNS 缓存
  • 递归 DNS 缓存
  • TTL 未过期
  • 查询的不是 Cloudflare 权威 DNS
  • 浏览器缓存

可以使用以下命令验证:

dig api.example.com
dig @1.1.1.1 api.example.com
dig @8.8.8.8 api.example.com

4. 缓存刷新后页面仍然是旧内容

可能原因:

  • 刷新的 URL 不完整
  • HTTP 与 HTTPS URL 不一致
  • 带 query string 的 URL 没有处理
  • 浏览器本地缓存
  • 源站返回的仍然是旧内容
  • 还有其他 CDN 或反向代理缓存

建议先确认源站内容,再确认 Cloudflare 缓存状态。

可以查看响应头:

CF-Cache-Status: HIT
CF-Cache-Status: MISS
CF-Cache-Status: EXPIRED
CF-Cache-Status: BYPASS

十七、结语

Cloudflare API 是将 Cloudflare 纳入自动化运维体系的核心能力。通过 API,我们可以实现 DNS 自动管理、缓存自动刷新、安全规则自动配置以及和 CI/CD 流水线深度集成。

在生产环境中,调用 Cloudflare API 并不难,真正需要关注的是权限控制、错误处理、日志审计、回滚机制和变更风险。尤其是 DNS 和缓存相关操作,虽然接口调用简单,但对线上业务影响很大,必须按照生产级标准进行设计。

最后总结几个关键建议:

  • 优先使用 API Token,不建议使用 Global API Key
  • Token 必须最小权限授权
  • DNS 操作前保存旧值,支持回滚
  • 缓存刷新尽量使用指定 URL,不要频繁全量刷新
  • API 调用必须判断 success 字段
  • 脚本中要设置超时、重试和日志
  • CI/CD 中通过 Secret 管理密钥
  • 生产和测试环境严格隔离

如果你正在建设自动化发布、动态域名管理或 CDN 缓存刷新系统,Cloudflare API 是非常值得深入掌握的一项能力。合理使用它,可以显著减少人工操作,提高发布效率,并降低线上维护成本。

目录结构
全文