云环境治理这件事,多数团队的做法是写脚本、跑巡检、手动整改——然后脚本散落各处,没人记得哪个还在跑。Cloud Custodian 用一种截然不同的方式解决这个问题:把治理逻辑写成声明式 YAML 策略,引擎无状态执行,一套 DSL 覆盖公有云、Kubernetes 和 IaC。项目进入 CNCF 孵化,走过十年,现在又面对一个新命题——当 AI Agent 开始自主操作云资源,谁来给它画红线?
策略引擎,不是规则脚本
Cloud Custodian 的核心思路是策略即代码。每条策略用 YAML 描述"什么资源、满足什么条件、执行什么动作",引擎负责发现资源和执行动作,用户只管写意图。
这和传统做法的区别在于:
- 无状态——引擎不维护资源数据库,每次运行从云 API 实时拉取资源状态,执行完毕即退出。没有数据库要运维,没有状态要同步。
- 统一 DSL——AWS EC2 实例、Azure VM、GCP Bucket、K8s Pod,都用同一套 YAML 语法写策略,只是
resource类型字段不同。 - 动作可组合——一条策略可以同时打标签、发通知、删资源、触发 Lambda,不需要写多个脚本串联。
一条最简策略看起来是这样的:
policies:
- name: s3-bucket-no-versioning
description: 标记未启用版本控制的 S3 Bucket
resource: s3
filters:
- type: versioning
key: Versioning
value: absent
actions:
- type: tag
key: custodian-compliance
value: versioning-missing
- type: notify
template: default
subject: "S3 Bucket 缺少版本控制: {name}"
to:
- security@example.com
运行命令:
# 安装
pip install c7n
# 配置 AWS 凭证(标准 AWS CLI 方式即可)
export AWS_ACCESS_KEY_ID=AKIA...
export AWS_SECRET_ACCESS_KEY=...
# 执行策略
custodian run -s output -p policy.yml
-s output 指定输出目录,-p policy.yml 指定策略文件。执行后 output/ 下会生成资源清单和动作日志。
从巡检到实时拦截
Cloud Custodian 不只是定时巡检工具。它支持事件驱动模式——在 AWS 上可以部署为 CloudWatch Event 规则 + Lambda 函数,资源创建或变更事件触发策略即时执行。
这意味着治理从"事后发现"变成"事中拦截":一个未加密的 EBS 卷刚创建,策略几秒内就能标记并通知,甚至直接删除。
policies:
- name: ebs-encrypted-only
resource: ebs
mode:
type: cloud-event
role: custodian-lambda-role
filters:
- type: encrypted
value: false
actions:
- type: delete
force: true
- type: notify
template: default
subject: "未加密 EBS 卷已删除: {volume_id}"
to:
- ops@example.com
部署这条策略到 Lambda:
custodian run -s output -p ebs-policy.yml --mode cloud-event
引擎会自动创建 Lambda 函数和 CloudWatch Event 规则,不需要手动写 Lambda 代码或配置事件桥接。
Kubernetes 和 IaC 也能管
Cloud Custodian 的 DSL 不限于云资源。resource: k8s 系列类型可以治理 Kubernetes 工作负载:
policies:
- name: k8s-pod-no-limits
resource: k8s.pod
filters:
- type: resources-limit
key: limits.cpu
value: absent
actions:
- type: notify
template: default
subject: "Pod 缺少资源限制: {name}"
to:
- k8s-admins@example.com
对于 Terraform 等 IaC 模板,Custodian 可以在部署前扫描 .tf 文件,把治理左移到编码阶段,而不是等资源创建后再整改。
AI Agent 时代的治理命题
文章标题提到"agentic AI era",这指向一个正在发生的现实:AI Agent 开始自主调用云 API——创建资源、调整配置、部署服务。效率提升的同时,风险也在放大。Agent 不懂合规边界,可能一口气创建 50 个公开 S3 Bucket。
Cloud Custodian 的价值在这里变得明确:给 Agent 的云操作加护栏。
具体思路可以这样实践:
- 事件驱动策略作为硬护栏——Agent 创建的任何资源立即经过 Custodian Lambda 策略校验,不合规就自动标记、通知或回滚。Agent 不需要"知道"规则,护栏在基础设施层生效。
- 策略库作为 Agent 的上下文约束——把 Custodian 策略解析为 Agent 可读的约束描述,注入 Agent 的 system prompt,让它在规划阶段就避开违规操作。
伪项目示例(假设你有一个自主操作云资源的 Agent):
# 从 Custodian 策略提取约束,注入 Agent prompt
import yaml
def extract_constraints_from_policy(policy_path: str) -> str:
"""读取 Custodian 策略文件,生成 Agent 可理解的约束文本"""
with open(policy_path) as f:
policies = yaml.safe_load(f)
lines = []
for p in policies.get("policies", []):
name = p["name"]
desc = p.get("description", "")
resource_type = p["resource"]
filters_desc = [f.get("type", "") for f in p.get("filters", [])]
actions_desc = [a.get("type", "") for a in p.get("actions", [])]
lines.append(
f"- 约束 [{name}]: {desc} "
f"资源类型 {resource_type}, "
f"过滤条件 {filters_desc}, "
f"违规动作 {actions_desc}"
)
return "\n".join(lines)
# 注入到 Agent 的 system prompt
constraints = extract_constraints_from_policy("policy.yml")
system_prompt = f"""你是一个云运维 Agent。操作云资源时必须遵守以下治理约束:
{constraints}
违反约束的操作将被自动回滚。请在规划阶段就避免违规操作。"""
这个做法的关键假设是:你的 Agent 框架支持动态注入 system prompt。实际效果取决于 Agent 是否真的遵循 prompt 指令——所以事件驱动硬护栏仍然不可替代,prompt 约束只是软补充。
十年项目的采用考量
Cloud Custodian 走了十年,进入 CNCF 孵化,社区成熟度已经不低。采用时有几个实际考量:
| 维度 | 评估 |
|---|---|
| 多云覆盖 | AWS 最完整,Azure/GCP 覆盖主流资源类型,K8s 支持持续扩展 |
| 学习曲线 | DSL 本身简单,但熟悉各云资源类型和可用 filter/action 需要时间 |
| 运行成本 | CLI 模式零额外成本;Lambda 模式按调用计费,大规模环境需评估 |
| 与现有工具集成 | 输出标准 JSON,可接入 SIEM、Slack、PagerDuty;策略文件可纳入 Git 流程 |
| AI Agent 治理 | 事件驱动模式天然适配,不需要 Agent 主动配合 |
起步建议:
# 1. 从最痛的合规点开始——比如公开 Bucket、未加密磁盘
pip install c7n c7n-aws
# 2. 写一条策略,CLI 模式跑一次,看输出
custodian run -s output -p my-first-policy.yml
# 3. 确认效果后,逐步加策略,再考虑切换到 Lambda 事件驱动模式
# 4. 策略文件纳入 Git,CI 流程中用 custodian validate 校验语法
custodian validate -p policies/
十年前 Cloud Custodian 解决的是"人的云治理"——运维手动巡检太慢、脚本太散。十年后它面对的是"Agent 的云治理"——自主操作太快、边界太模糊。DSL 不变,引擎不变,但护栏的对象从人变成了人和 Agent。这大概是 CNCF 孵化项目最务实的进化路径:不追概念,让已有能力在新场景里自然延伸。