You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过CDK管理Step Functions版本与别名:Prod别名管理方式咨询

两种实现方案

方案一:同一栈内管理Prod别名

完全可以在同一个CDK栈中管理Prod别名,具体流程如下:

  1. 首次部署时,栈中包含状态机、新版本、preProd测试别名;Prod别名可初始指向现有稳定版本(若为首次部署也可暂不创建,待测试完成后再添加)。
  2. 验证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会直接更新别名路由配置,无资源替换,过程平滑无中断。

方案二:跨栈传递版本至专门的别名管理栈

如果希望将状态机部署与别名管理解耦,可以把版本引用传递到独立的别名管理栈中,具体流程如下:

  1. 在状态机栈中,通过CfnOutput导出新版本的ARN。
  2. 在别名管理栈中,通过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,
      }],
    });
  }
}

部署流程:

  1. 先部署状态机栈:cdk deploy StateMachineStack,使用preProd别名测试新版本。
  2. 测试无误后,修改别名管理栈中Prod别名的stateMachineVersionArn为newVersionArn,执行cdk deploy AliasManagementStack完成Prod别名更新。

这种方式的优势是状态机迭代部署不会影响Prod别名稳定性,别名管理完全独立,适合多环境、多团队协作场景。

内容的提问来源于stack exchange,提问作者user3473406

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 03:06:03