让 CDK Stack 到点自毁:cdk-constructs 临时资源 TTL 自动销毁机制详解
2026/8/24 9:31:19 网站建设 项目流程

让 CDK Stack 到点自毁:cdk-constructs 临时资源 TTL 自动销毁机制详解

【免费下载链接】cdk-constructsA collection of higher-level reusable cdk constructs项目地址: https://gitcode.com/gh_mirrors/cd/cdk-constructs

本文带你快速理解cdk-constructs仓库中的cdk-temp-stack组件:它能让一个CDK Stack 在设定的 TTL(存活时间)到期后自动销毁,实现 AWS 临时资源的"到点自毁",避免忘记清理而产生额外费用。

为什么需要"临时资源自动销毁" 🧹

在开发、测试、联调或临时搭建演示环境时,我们经常会创建一套CDK 临时基础设施:一个 VPC、几个 Lambda、一个测试数据库……用完就该删。但现实中,Stack 往往被遗忘在 AWS 账户里持续计费

cdk-temp-stack解决的正是这个痛点:给 Stack 加一个"存活时间(TTL)",到期后自动删除整个 Stack 及其所有资源。你只需声明ttl,剩下的交给 CloudFormation + EventBridge + Lambda 自动化完成。

💡 核心价值:把"记得删"这件容易忘的事,变成"自动删"的确定性流程。

cdk-temp-stack 是如何实现的 🔧

整个机制非常小巧,核心只有 3 个文件,非常适合学习 AWS 自动化清理的设计思路:

文件作用
packages/cdk-temp-stack/src/time-to-live.tsTimeToLive构件:定时规则 + 删除函数
packages/cdk-temp-stack/src/temp-stack.tsTempStack:开箱即用的自毁栈
packages/cdk-temp-stack/src/lambdas/delete-stack/index.ts执行DeleteStack的 Lambda

核心构件 TimeToLive

TimeToLive是一个标准的Construct,它在你的 Stack 内做三件事:

  1. 创建一个 Lambda 函数delete-stack),负责真正执行删除;
  2. 创建一条 EventBridge 定时规则,调度表达式为rate(<ttl>),即每隔 TTL 触发一次;
  3. 把 Lambda 挂到规则上,并把当前 Stack 的AWS::StackId作为事件参数传入。

⚠️ 源码中还有一段很贴心的设计:onPrepare()会给栈内其他所有资源添加对TimeToLive的依赖,确保定时删除函数最后才被部署最先被回收,避免"清理者自己还没就绪就被删"的尴尬。

删除函数 delete-stack

真正干活的只有几行——它拿到stackId后调用 CloudFormation 的deleteStackAPI:

await cfn.deleteStack({ StackName: stackId }).promise();

注意:为了让 Lambda 能删掉栈内任意类型的资源,它的 IAM 角色被授予了*权限。这是一个"以安全换简洁"的取舍——生产环境请务必结合最小权限原则自行收敛

双重保护:一个栈只能有一个 TTL

TimeToLive内置了validate()校验:同一个 Stack 中只允许存在一个TimeToLive实例。如果重复添加,cdk synth会直接报错,防止出现多个互相冲突的删除规则。

快速上手:两种使用方式 🚀

方式一:继承 TempStack(最省事)

适合"整条新链路都是临时的"场景。让自定义栈直接继承TempStack,构造时传入ttl即可:

export class TempInfraStack extends TempStack { constructor(scope: Construct, id: string, props: TempStackProps) { super(scope, id, props); new Vpc(this, 'VPC'); // 临时资源照写照加 } }

入口处指定存活时间(例如 10 分钟后自毁):

new TempInfraStack(app, 'TempInfraStack', { env: { region: process.env.DEFAULT_REGION, account: process.env.CDK_DEFAULT_ACCOUNT }, ttl: Duration.minutes(10), });

方式二:向已有栈添加 TimeToLive(更灵活)

如果你想给一个已存在的普通Stack加自毁能力,直接实例化TimeToLive构件即可,无需改动栈的继承关系:

new TimeToLive(this, 'TimeToLive', { ttl: Duration.minutes(10), });

✅ 两种方式最终落到同一套资源,区别只是TempStack帮你"预装"好了TimeToLive

完整可运行的示例见examples/temp-stack-example/(含temp-infra-stack.tstemp-infra-app.ts)。

部署后会发生什么 ⏱️

  1. cdk deploy部署成功,Stack 正常提供能力;
  2. EventBridge 规则按rate(<ttl>)周期触发;
  3. 每次触发都会调用delete-stackLambda 删除整个 Stack;
  4. Stack 删除后,定时规则也随之消失——实现"用完即走"的闭环

同时,合成阶段会在控制台打印一条醒目提示:

Warning! The stack destroys itself in X minutes.

提醒你这不是一个"长命"的栈。

注意事项与最佳实践 📌

  • TTL 是"周期"而非"一次性闹钟":调度用rate(),所以它本质是"每隔 TTL 触发一次删除"。删除成功后栈已不存在,自然不会再次触发。
  • 权限需谨慎delete-stackLambda 默认持有*权限,生产场景建议显式收窄为cloudformation:DeleteStack等最小集。
  • 不要叠加多个 TTL:一个栈仅保留一个TimeToLive,否则合成阶段会报错。
  • 适合场景:CI/CD 临时测试环境、按需演示、短时压测、临时调试链路。
  • 想深入了解 API:完整的TempStack/TimeToLive接口文档见packages/cdk-temp-stack/API.md,使用指南见packages/cdk-temp-stack/README.md

一句话总结cdk-temp-stack用极小的代码量,把"CDK 临时资源到点自毁"做成了可复用构件——只需声明一个ttl,你的测试栈就能在到期后自动清理,省心又省钱。

【免费下载链接】cdk-constructsA collection of higher-level reusable cdk constructs项目地址: https://gitcode.com/gh_mirrors/cd/cdk-constructs

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询