
云原生运维安全【免费下载链接】cloud-custodianRules engine for cloud security, cost optimization, and governance, DSL in yaml for policies to query, filter, and take actions on resources项目地址https://gitcode.com/gh_mirrors/cl/cloud-custodian点击查看免费下载本文基于 docs/source/aws/examples/ebssnapshots.rst 提供的官方示例深入讲解如何用 Cloud Custodian 的 YAML 策略完成 EBS 快照的全生命周期管理为 EC2 实例的卷批量创建快照并把实例标签复制到快照上再通过年龄过滤自动删除超过 7 天的旧快照实现永远保留最近 7 天滚动快照的备份治理闭环。读完本文你将掌握snapshot动作的完整参数语义、ebs-snapshot资源与age过滤器的组合用法以及源码级的行为细节与常见坑位。策略全景两段式快照生命周期管理官方示例由两条策略组成一条负责创建一条负责清理配合起来就是一套可持续运行的滚动备份方案创建策略遍历所有 EC2 实例对其挂载的 EBS 卷执行快照同时把实例的关键运维标签如负责人、用途、成本中心、环境等复制到快照上并打上自定义标记清理策略扫描当前账号自有的快照筛出年龄 ≥ 7 天且带有 custodian 快照标记的逐一删除。两条策略分别面向ec2与ebs-snapshot两个资源类型前者使用snapshot动作后者使用delete动作恰好对应 Cloud Custodian 中对资源执行操作与对资源做筛选后清理的典型范式。策略一为 EC2 实例卷创建快照并继承标签policies: - name: ec2-create-ebs-snapshots resource: ec2 actions: - type: snapshot copy-tags: - CreatorName - Resource Contact - Resource Purpose - Environment - Billing Cost Center - Name tags: CloudCustodian: true动作注册与权限要求该动作在 c7n/resources/ec2.py 中注册为actions.register(snapshot)类名为Snapshot(BaseAction)。它声明的 IAM 权限为ec2:CreateSnapshotec2:CreateTags即策略执行时对应的运行角色必须同时具备创建快照与打标签的权限否则会在运行时被 AWS 拒绝。参数语义源码确认从动作的 schema 定义c7n/resources/ec2.py#L1926-L1931可以看到该动作支持以下参数参数类型默认值说明copy-tags字符串数组无把列出的实例/卷标签复制到快照上与copy-volume-tags互斥copy-volume-tagsbooleantrue复制卷上的全部标签到快照tagsobject{custodian_snapshot: }创建时额外附加的自定义标签exclude-bootbooleanfalse是否排除启动卷root volume不打快照几个关键行为需要特别留意默认行为是复制卷的全部标签。源码注释明确写着 The default behavior iscopy-volume-tags: truec7n/resources/ec2.py。只有当策略中显式出现copy-tags时才会走按名单复制的逻辑。copy-tags与copy-volume-tags不能同时出现。动作的validate()方法会在策略加载阶段直接抛出PolicyValidationErrorc7n/resources/ec2.py即这是一个在运行前就会被拦截的配置错误。tags的默认值非常关键当未显式指定tags时快照会被自动打上custodian_snapshot标签源码见get_snapshot_tagsc7n/resources/ec2.py。这正是官方示例第二条策略中用tag:custodian_snapshot: present过滤的前提。底层实现批量卷快照与错误兜底Snapshot.process_volume_setc7n/resources/ec2.py展示了真正的执行细节调用的是 EC2 的CreateSnapshots批量卷快照接口而非单卷的CreateSnapshot并通过InstanceSpecification指定InstanceId与ExcludeBootVolume快照描述被固定为Snapshot Created for {InstanceId} ({Name})便于在控制台/API 中快速溯源创建成功后快照 ID 列表被写入资源的c7n:snapshots属性供后续动作或输出使用对InvalidInstanceId.NotFound、ConcurrentSnapshotLimitExceeded、IncorrectState三类已知错误做了降级处理仅记录 warning 不中断整批任务其余错误则向上抛出并记录到resources的错误日志中。官方示例的copy-tags名单里既有裸键CreatorName、Environment、Name也有带空格的键Resource Contact等说明该列表支持任意合法的实例标签键名YAML 中带空格或特殊字符的键记得加引号。策略二删除超过 7 天的旧快照- name: ebs-delete-old-ebs-snapshots resource: ebs-snapshot filters: - type: age days: 7 op: ge - tag:custodian_snapshot: present actions: - deleteebs-snapshot 资源默认只扫自己的快照ebs-snapshot在 c7n/resources/ebs.py 中注册底层使用 EC2 的describe_snapshots枚举。它的resources()方法有两个值得注意的默认行为OwnerIds未指定时强制为[self]即只扫描当前账号自有的快照绝不会碰共享快照或公共快照MaxResults默认 1000配合分页可覆盖大账号下的海量快照。同时SnapshotQueryParserc7n/resources/ebs.py支持在query中直接传递 AWS 原生的快照查询条件例如owner-id、statuspending/completed/error、tag、tag-key、volume-id、start-time、volume-size等可以在枚举阶段就收窄扫描范围降低 API 调用成本。age 过滤器按时间老化筛选age是 Cloud Custodian 内置的通用过滤器语义为资源存在时间。官方示例中days: 7指定 7 天为阈值op: ge表示大于等于资源年龄 ≥ 7 天即命中。因此该过滤器精确命中创建于 7 天前或更早的快照。需要反向匹配时可将op换成lt小于。由于快照的StartTime即创建时间age过滤器在此场景下天然成立。标签存在性过滤只清理自己产生的快照第二条过滤条件tag:custodian_snapshot: present是 Cloud Custodian 的标签值过滤器语法当快照带有custodian_snapshot标签无论值是什么即命中。它的价值在于把我们策略创建的快照与人工或其他工具创建的快照区分开避免误删手工保留的备份。delete 动作默认保护 AMI 关联快照SnapshotDeletec7n/resources/ebs.py实现删除逻辑权限要求为ec2:DeleteSnapshot。源码揭示了两个重要的安全设计默认自动过滤 AMI 关联快照删除前会调用_filter_ami_snapshots剔除与任何 AMI 关联的快照by default to keep things safe并在日志中记录被自动过滤的数量批量与重试快照按 50 个一组分块提交删除并对RequestLimitExceeded、Client.RequestLimitExceeded等限流错误自动重试适合大规模清理场景。若确有需要连同 AMI 相关快照一起处理可在动作中显式声明skip-ami-snapshots: false该参数在 schema 中定义见 c7n/resources/ebs.py但请务必确认业务上不依赖这些 AMI。组合运行如何把两条策略跑起来将两条策略放入同一个 YAML 文件后用标准命令执行即可custodian run -c ebs-snapshots.yml -s output/-c指定策略文件路径-s指定输出目录资源 JSON、日志、metrics 等会落到该目录。两条策略互不依赖、顺序无关创建策略产出的快照天然带有custodian_snapshot标记7 天后清理策略自然命中它们。把该命令接入 cron / EventBridge 定时调度例如每天运行一次即可实现文档标题所描述的始终保留最近 7 天的滚动快照窗口。实战提醒标记一致性决定清理是否生效这是最容易踩的坑且可以从源码直接推导出来get_snapshot_tagsc7n/resources/ec2.py的逻辑是——tags参数一旦被显式指定就用你给的标签替代默认值只有未指定tags时才自动补上custodian_snapshot标签。因此官方示例中tags: CloudCustodian: true意味着快照上不会有custodian_snapshot标签此时第二条策略的tag:custodian_snapshot: present过滤将匹配不到任何快照删除策略实际不会生效想要两条策略无缝衔接应二选一创建策略不写tags让默认的custodian_snapshot标签生效CloudCustodian标记可通过copy-tags里的Name等或后续动作补充或者在tags中显式同时写入custodian_snapshot如tags: {CloudCustodian: true, custodian_snapshot: true}。这一点在官方仓库的测试 tests/test_ebs.py 中有直接佐证test_volume_snapshot_copy_tags用copy-tags时断言快照标签包含custodian_snapshot而test_volume_snapshot_copy_volume_tags显式给出tags时断言快照标签与给定标签完全一致、不再有默认标记。验证与扩展仓库中的单元测试为上述行为提供了可复现的验证入口使用 placebo 回放录制数据tests/test_ebs.pytest_volume_snapshot_copy_tags验证copy-tags按名单复制并附加默认custodian_snapshot标签tests/test_ebs.pytest_volume_snapshot_copy_volume_tags验证显式tags完全覆盖默认标签tests/test_ebs.py 附近的test_snapshot_copy等用例覆盖了快照复制与删除的完整调用链。在此基础上你还可以自然扩展出更多场景用exclude-boot: true只为数据卷打快照以节省成本在ebs-snapshot策略的query中加入status: completed只处理完成态快照或叠加value过滤器按VolumeSize进一步收敛清理范围。把握住snapshot动作的参数语义与ebs-snapshot资源的过滤体系一套适合自己团队的 EBS 快照治理策略就能快速落地。赞分享云原生运维安全【免费下载链接】cloud-custodianRules engine for cloud security, cost optimization, and governance, DSL in yaml for policies to query, filter, and take actions on resources项目地址https://gitcode.com/gh_mirrors/cl/cloud-custodian点击查看免费下载相关推荐Cloud Custodian Azure 标签管理实战用 untag 动作批量清理虚拟机标签Cloud Custodian Azure 标签管理实战用 untag 动作批量清理虚拟机标签 导读 本文围绕 Cloud Custodianc7nAzu云原生运维安全Operator SDK v1.39.0 升级指南Kubernetes 1.31 与 Kubebuilder NetworkPolicy 脚手架迁移实战Operator SDK v1.39.0 升级指南Kubernetes 1.31 与 Kubebuilder NetworkPolicy 脚手架迁移实战 导读云原生运维安全LibrePhotos 缺失照片机制详解标记原理、自动重链与批量清理实战LibrePhotos 缺失照片机制详解标记原理、自动重链与批量清理实战 当照片文件被移动、重命名或存储介质断开时LibrePhotos 不会直接删除数据库后端前端移动开发计算机视觉机器学习上一篇GHelper 快速上手3 步完整接管华硕笔记本风扇、显卡与电池性能控制下一篇突破并发瓶颈redis-py与FastAPI打造高性能异步Web服务创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考