如何使用AWS CDK的preDeploy预部署钩子?
在AWS CDK部署前自动运行Lambda属性检查测试
要实现cdk deploy前自动执行测试、失败则终止部署的需求,你可以结合CDK的preDeploy生命周期钩子和IntegTest构造来完成,以下是具体实现方案:
核心思路
- 用
IntegTest编写静态检查测试,验证所有Lambda资源的属性中包含Code键 - 将测试绑定到栈的
preDeploy钩子,确保部署前自动触发测试 - 测试失败时,CDK会直接终止部署流程
具体代码实现(TypeScript)
import { Stack, App, aws_lambda as lambda } from 'aws-cdk-lib'; import { IntegTest, Assertions } from 'aws-cdk-lib/integ-tests'; const app = new App(); const targetStack = new Stack(app, 'ProductionStack'); // 示例:创建多个Lambda函数(模拟你的实际资源) new lambda.Function(targetStack, 'UserHandler', { runtime: lambda.Runtime.NODEJS_20_X, handler: 'handler.user', code: lambda.Code.fromAsset('lambda/user'), }); new lambda.Function(targetStack, 'OrderHandler', { runtime: lambda.Runtime.NODEJS_20_X, handler: 'handler.order', code: lambda.Code.fromAsset('lambda/order'), }); // 创建集成测试实例,指定要测试的目标栈 const preDeployTest = new IntegTest(app, 'PreDeployLambdaValidation', { testCases: [targetStack], // 采用无部署策略,仅做静态模板检查,无需额外部署测试资源 deploymentStrategy: { type: 'NONE' }, }); // 添加测试断言:验证所有Lambda资源的Properties中存在Code键 const template = Assertions.fromStack(targetStack); template.resourcePropertiesCountIs( 'AWS::Lambda::Function', { Code: Assertions.objectLike({}) }, // 只要Code键存在即通过 // 可选:指定预期的Lambda数量,确保没有遗漏资源 // 2 ); // 将测试绑定到目标栈的preDeploy钩子 targetStack.addPreDeployHook({ execute: () => { // 执行测试,--no-deploy参数确保只跑测试不部署测试栈 return preDeployTest.execute({ args: ['--no-deploy'] }); }, }); app.synth();
运行效果
- 当你在CLI执行
cdk deploy时,CDK会先触发preDeploy钩子中的集成测试 - 如果所有Lambda资源都包含
Code键,测试通过,部署流程继续执行 - 若有任意一个Lambda缺少
Code键,测试会抛出错误,部署直接终止,控制台会显示具体的失败原因
关键细节说明
deploymentStrategy: { type: 'NONE' }:避免创建额外的测试部署栈,仅对合成后的CloudFormation模板做静态检查,节省时间和资源resourcePropertiesCountIs:既可以验证属性存在性,也可以指定预期的资源数量,双重确保资源配置符合要求preDeploy钩子:属于CDK的生命周期钩子,会在部署操作开始前执行,是实现预部署检查的最佳时机
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

