Cloud Custodian 十年:从云治理 DSL 到 AI Agent 时代的护栏

2026-05-12 28 预计阅读时间:1 分钟
来源:cncf.io AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:9 分钟

云环境治理这件事,多数团队的做法是写脚本、跑巡检、手动整改——然后脚本散落各处,没人记得哪个还在跑。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 的云操作加护栏

具体思路可以这样实践:

  1. 事件驱动策略作为硬护栏——Agent 创建的任何资源立即经过 Custodian Lambda 策略校验,不合规就自动标记、通知或回滚。Agent 不需要"知道"规则,护栏在基础设施层生效。
  2. 策略库作为 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 孵化项目最务实的进化路径:不追概念,让已有能力在新场景里自然延伸。


相关推荐