如何使用AWS CDK实现AWS SAM的Canary金丝雀滚动部署
你要的SAM金丝雀部署能力可以通过CDK完全实现,以下是Java版本的对应实现示例,和你提供的手写SAM模板能力完全对齐:
首先确保项目中已引入aws-cdk-lib中lambda、cloudwatch相关依赖,示例代码如下:
import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; import software.amazon.awscdk.services.lambda.Code; import software.amazon.awscdk.services.lambda.Function; import software.amazon.awscdk.services.lambda.Runtime; import software.amazon.awscdk.services.lambda.Alias; import software.amazon.awscdk.services.lambda.LambdaDeploymentConfig; import software.amazon.awscdk.services.lambda.LambdaDeploymentGroup; import software.amazon.awscdk.services.cloudwatch.Alarm; import software.amazon.awscdk.services.cloudwatch.ComparisonOperator; import software.constructs.Construct; public class CanaryDeployStack extends Stack { public CanaryDeployStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); // 主业务Lambda函数,对应SAM模板里的MyLambdaFunction Function mainFunction = Function.Builder.create(this, "MyLambdaFunction") .handler("index.handler") .runtime(Runtime.NODEJS_12_X) .code(Code.fromBucket("bucket", "code.zip")) .build(); // 预流量校验Lambda Function preTrafficFunc = Function.Builder.create(this, "PreTrafficLambdaFunction") .handler("pre.handler") .runtime(Runtime.NODEJS_12_X) .code(Code.fromBucket("bucket", "pre-traffic-code.zip")) .build(); // 后流量校验Lambda Function postTrafficFunc = Function.Builder.create(this, "PostTrafficLambdaFunction") .handler("post.handler") .runtime(Runtime.NODEJS_12_X) .code(Code.fromBucket("bucket", "post-traffic-code.zip")) .build(); // 触发回滚的错误告警,对应SAM配置里的两个告警规则 Alarm aliasErrorAlarm = Alarm.Builder.create(this, "AliasErrorMetricGreaterThanZeroAlarm") .metric(mainFunction.metricErrors()) .threshold(1) .comparisonOperator(ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD) .evaluationPeriods(1) .build(); Alarm latestVersionErrorAlarm = Alarm.Builder.create(this, "LatestVersionErrorMetricGreaterThanZeroAlarm") .metric(mainFunction.currentVersion().metricErrors()) .threshold(1) .comparisonOperator(ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD) .evaluationPeriods(1) .build(); // 创建别名和金丝雀部署组 Alias liveAlias = Alias.Builder.create(this, "LiveAlias") .aliasName("live") .version(mainFunction.getCurrentVersion()) .build(); LambdaDeploymentGroup.Builder.create(this, "CanaryDeploymentGroup") .alias(liveAlias) // 对应SAM的10%流量灰度10分钟策略 .deploymentConfig(LambdaDeploymentConfig.CANARY_10_PERCENT_10_MINUTES) .alarms(java.util.List.of(aliasErrorAlarm, latestVersionErrorAlarm)) // 配置流量校验钩子 .preHook(preTrafficFunc) .postHook(postTrafficFunc) .build(); } }
如果你使用其他语言的CDK(TypeScript、Python等),API命名和逻辑完全一致,仅语法存在差异,按照上述逻辑对应调整即可。
内容的提问来源于stack exchange,提问作者Connor Butch
相关产品推荐
相关产品推荐

