通过CDK管理Step Functions版本与别名:Prod别名管理方式咨询
两种实现方案
方案一:同一栈内管理Prod别名
完全可以在同一个CDK栈中管理Prod别名,具体流程如下:
- 首次部署时,栈中包含状态机、新版本、preProd测试别名;Prod别名可初始指向现有稳定版本(若为首次部署也可暂不创建,待测试完成后再添加)。
- 验证preProd别名对应的新版本无误后,修改栈内Prod别名的
routingConfiguration,将流量指向测试通过的新版本,重新执行cdk deploy即可完成Prod别名的更新。
修改后的示例代码:
import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as sfn from 'aws-cdk-lib/aws-stepfunctions'; export class VersioningCdkExampleStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // 状态机定义 const stateMachine = new sfn.StateMachine(this, 'myStateMachine', { definition: new sfn.Pass(this, 'DefineRepositories', { result: sfn.Result.fromString("version 1") }) }); // 绑定当前最新修订的版本 const version = new sfn.CfnStateMachineVersion(this, 'Version', { stateMachineArn: stateMachine.stateMachineArn, stateMachineRevisionId: stateMachine.stateMachineRevisionId, }); version.applyRemovalPolicy(cdk.RemovalPolicy.RETAIN); // 预发布测试别名 const preProdAlias = new sfn.CfnStateMachineAlias(this, 'preProd', { routingConfiguration: [{ stateMachineVersionArn: version.ref, weight: 100, }], }); // Prod别名:首次部署指向旧稳定版本,测试后替换为新版本ARN const prodAlias = new sfn.CfnStateMachineAlias(this, 'prod', { routingConfiguration: [{ stateMachineVersionArn: 'arn:aws:states:region:account-id:stateMachine:myStateMachine:old-stable-version', weight: 100, }], }); } }
测试通过后,只需将prodAlias的stateMachineVersionArn替换为version.ref,重新部署即可。CloudFormation会直接更新别名路由配置,无资源替换,过程平滑无中断。
方案二:跨栈传递版本至专门的别名管理栈
如果希望将状态机部署与别名管理解耦,可以把版本引用传递到独立的别名管理栈中,具体流程如下:
- 在状态机栈中,通过
CfnOutput导出新版本的ARN。 - 在别名管理栈中,通过
cdk.Fn.importValue导入该ARN,创建或更新Prod别名。
状态机栈(版本生成)代码:
import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as sfn from 'aws-cdk-lib/aws-stepfunctions'; export class StateMachineStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const stateMachine = new sfn.StateMachine(this, 'myStateMachine', { definition: new sfn.Pass(this, 'DefineRepositories', { result: sfn.Result.fromString("version 1") }) }); const version = new sfn.CfnStateMachineVersion(this, 'Version', { stateMachineArn: stateMachine.stateMachineArn, stateMachineRevisionId: stateMachine.stateMachineRevisionId, }); version.applyRemovalPolicy(cdk.RemovalPolicy.RETAIN); // 导出新版本ARN供别名栈使用 new cdk.CfnOutput(this, 'StateMachineVersionArn', { value: version.ref, exportName: 'StateMachine-ProdVersionArn', }); // 预发布测试别名 new sfn.CfnStateMachineAlias(this, 'preProd', { routingConfiguration: [{ stateMachineVersionArn: version.ref, weight: 100, }], }); } }
别名管理栈(Prod别名维护)代码:
import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as sfn from 'aws-cdk-lib/aws-stepfunctions'; export class AliasManagementStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // 导入状态机栈导出的新版本ARN const newVersionArn = cdk.Fn.importValue('StateMachine-ProdVersionArn'); // Prod别名:初始指向旧版本,测试后更新为导入的新版本ARN new sfn.CfnStateMachineAlias(this, 'prod', { routingConfiguration: [{ stateMachineVersionArn: 'arn:aws:states:region:account-id:stateMachine:myStateMachine:old-stable-version', weight: 100, }], }); } }
部署流程:
- 先部署状态机栈:
cdk deploy StateMachineStack,使用preProd别名测试新版本。 - 测试无误后,修改别名管理栈中Prod别名的
stateMachineVersionArn为newVersionArn,执行cdk deploy AliasManagementStack完成Prod别名更新。
这种方式的优势是状态机迭代部署不会影响Prod别名稳定性,别名管理完全独立,适合多环境、多团队协作场景。
内容的提问来源于stack exchange,提问作者user3473406
相关产品推荐
相关产品推荐

