让 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.ts | TimeToLive构件:定时规则 + 删除函数 |
packages/cdk-temp-stack/src/temp-stack.ts | TempStack:开箱即用的自毁栈 |
packages/cdk-temp-stack/src/lambdas/delete-stack/index.ts | 执行DeleteStack的 Lambda |
核心构件 TimeToLive
TimeToLive是一个标准的Construct,它在你的 Stack 内做三件事:
- 创建一个 Lambda 函数(
delete-stack),负责真正执行删除; - 创建一条 EventBridge 定时规则,调度表达式为
rate(<ttl>),即每隔 TTL 触发一次; - 把 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.ts与temp-infra-app.ts)。
部署后会发生什么 ⏱️
cdk deploy部署成功,Stack 正常提供能力;- EventBridge 规则按
rate(<ttl>)周期触发; - 每次触发都会调用
delete-stackLambda 删除整个 Stack; - 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),仅供参考