Cloudflare 发布了新的命令行工具 cf。它的目标不是再包装几个常用操作,而是映射整个 Cloudflare API,并允许开发者使用 TypeScript 编写程序化配置。与此同时,Cloudflare 还开源了内部使用的 SDK 生成器 Forge,这解释了 cf 如何跟上规模庞大且持续变化的 API。
这项变化对平台工程团队尤其重要:命令行、自动化脚本和智能代理终于可以围绕同一套 API 表面工作,而不必为每种资源手写一层不一致的封装。
“覆盖整个 API”改变了什么
传统云服务 CLI 往往只覆盖高频功能。遇到较新的产品或冷门参数时,开发者还是要退回 HTTP 请求,自行处理路径、请求体、分页和错误响应。
cf 选择镜像整个 Cloudflare API,意味着 CLI 的能力边界将更接近 API 本身。实际价值主要体现在三类场景:
- 交互式运维:工程师可以在终端中发现并调用不同产品的操作。
- 脚本与 CI/CD:自动化流程不必在 CLI 和手写 HTTP 请求之间频繁切换。
- Agent 工具调用:智能代理可以面对更统一、可发现的命令结构,而不是依赖大量临时脚本。
这里的重点不是“命令变多了”,而是 API 与 CLI 之间的重复实现减少了。如果命令和类型能够由 API 描述生成,新接口进入工具链的速度通常会更快,参数漂移也更容易被发现。
不过,覆盖面广不等于默认安全。一个可以访问整个 API 的 CLI,同样可能删除 DNS 记录、改变安全策略或修改生产环境配置。应把它视为完整的控制平面入口,而不是普通的本地辅助命令。
TypeScript 配置适合表达复杂逻辑
声明式文件适合固定配置,但现实中的基础设施经常带有环境判断、批量生成和共享规则。例如,测试环境与生产环境可能使用不同的缓存策略,一组域名又需要复用相同的安全设置。
程序化 TypeScript 配置可以把这些逻辑留在类型系统和普通函数中:
- 用函数生成重复资源;
- 用联合类型限制环境名称;
- 在提交前进行静态检查;
- 将公共策略封装成模块;
- 通过代码审查观察配置逻辑,而不只是最终 JSON。
来源摘要没有给出 cf 的具体 TypeScript 配置接口,因此下面是一个可运行的配置建模示例,不是对正式 API 名称的复刻。接入时,需要将本地接口替换为 cf 当前版本提供的类型和入口函数。
mkdir cf-config-demo
cd cf-config-demo
cat > package.json <<'EOF'
{
"name": "cf-config-demo",
"private": true,
"type": "module",
"scripts": {
"check": "tsc --noEmit"
},
"devDependencies": {
"typescript": "^5.5.0"
}
}
EOF
cat > tsconfig.json <<'EOF'
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"noEmit": true
},
"include": ["cloudflare.config.ts"]
}
EOF
cat > cloudflare.config.ts <<'EOF'
type Environment = "staging" | "production";
type ZonePolicy = {
zone: string;
environment: Environment;
cacheTtlSeconds: number;
securityLevel: "medium" | "high";
};
function policyFor(zone: string, environment: Environment): ZonePolicy {
return {
zone,
environment,
cacheTtlSeconds: environment === "production" ? 3600 : 60,
securityLevel: environment === "production" ? "high" : "medium"
};
}
export const configuration = [
policyFor("example.com", "production"),
policyFor("staging.example.com", "staging")
] satisfies ZonePolicy[];
EOF
npm install
npm run check
这个项目可以直接完成 TypeScript 类型检查。正式接入 cf 时,可以保留 policyFor 之类的业务函数,只替换示例类型、字段和导出方式。这样能把“环境策略”与具体 CLI 适配层分开。
程序化配置也有代价:代码可以执行任意逻辑,因此审查者未必能一眼看出最终变更。比较稳妥的流程是要求工具先输出计划或差异,再允许执行写操作。如果当前版本提供 dry-run、plan 或预览能力,应优先在 CI 中启用;具体参数应以安装版本的帮助信息为准。
Forge 为什么值得关注
Forge 是 Cloudflare 开源的内部 SDK 生成器。它与 cf 同时出现并非偶然:当 API 数量增长到一定规模后,依靠人工维护命令、请求类型和响应模型会产生明显成本。
生成式工具链通常可以承担以下工作:
- 读取机器可解析的 API 描述;
- 生成请求和响应类型;
- 生成调用客户端或命令定义;
- 在 API 变化后重新生成并检查差异。
摘要没有披露 Forge 的具体输入格式、模板接口或生成命令,因此不应假设它可以直接读取任意 OpenAPI 文件,也不应默认生成结果适合所有项目。它的开源价值在于,团队能够检查生成过程、理解 cf 的构建方式,并评估是否能将相同思路用于内部 API。
对维护大型内部平台的团队来说,这可能比单个 CLI 命令更有启发:不要手工维护数百个薄封装,而是把 API 描述、代码生成和兼容性检查连成一条流水线。
给自动化和 Agent 加一道执行闸门
Agentic CLI 的便利之处在于,智能代理可以发现命令、组合参数并执行任务;风险也来自同一个地方。自然语言中的“清理旧配置”可能被解释为范围过大的删除操作。
下面的包装脚本不依赖 cf 的具体子命令。它默认只打印准备执行的命令,只有显式设置 CF_EXECUTE=1 并人工确认后才真正运行,因此可以直接改造成 CI 或 Agent 的审批闸门:
cat > safe-cf.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
if [[ $# -eq 0 ]]; then
echo "Usage: ./safe-cf.sh -- cf <actual arguments>" >&2
exit 64
fi
if [[ "$1" == "--" ]]; then
shift
fi
printf 'Requested command:'
printf ' %q' "$@"
printf '\n'
if [[ "${CF_EXECUTE:-0}" != "1" ]]; then
echo "Preview only. Set CF_EXECUTE=1 to request execution."
exit 0
fi
read -r -p "Type APPLY to continue: " confirmation
if [[ "$confirmation" != "APPLY" ]]; then
echo "Cancelled."
exit 1
fi
exec "$@"
EOF
chmod +x safe-cf.sh
# 安全预览:把后面的参数替换为当前 cf 版本支持的真实命令
./safe-cf.sh -- cf --help
# 需要执行时再显式解锁;此处仍以无破坏性的帮助命令演示
CF_EXECUTE=1 ./safe-cf.sh -- cf --help
生产环境还应增加更严格的控制:
- 为不同账户和环境使用独立凭据;
- 令牌只授予任务所需的最小权限;
- 不把令牌直接写入命令参数、代码或 Agent 提示词;
- 对删除、批量更新和权限修改设置人工审批;
- 保存命令、操作者、目标账户与结果的审计记录;
- 固定 CLI 版本,并在升级时检查生成命令或类型是否变化。
安装完成后,可以先用帮助系统探索实际命令,而不是让脚本猜测接口:
command -v cf
cf --help
# 不同版本可能采用不同的版本参数,按实际支持情况使用
cf version || cf --version
采用时不要从“全自动写入”开始
引入 cf 的稳妥路径是从只读任务开始,例如资源盘点、配置检查和状态查询;随后再进入带预览与审批的写操作。等权限边界、审计记录和回滚流程稳定后,才适合把更多操作交给 CI 或 Agent。
可以使用这份检查清单:
- [ ] 已确认安装版本的命令与 TypeScript 配置接口;
- [ ] 开发、测试和生产账户使用独立凭据;
- [ ] 自动化令牌遵循最小权限原则;
- [ ] 写操作具有预览、差异或人工确认阶段;
- [ ] 破坏性操作有额外审批与回滚方案;
- [ ] CLI 与生成代码版本已固定;
- [ ] 日志中不会泄露令牌或敏感配置。
cf 最值得关注的地方,是把完整 API、程序化配置和 Agent 工作流放进了同一个命令行入口;Forge 则展示了支撑这种广度的生成式工具链。它们可以减少胶水代码,但不会自动消除权限和变更风险。真正可靠的落地方式,是用类型约束配置,用生成工具减少重复劳动,再用最小权限、预览和审批守住执行边界。