在 亚马逊云科技 Step Functions 中使用版本和别名逐步部署状态机

作者: 本杰明·史密斯 |

这篇文章由 亚马逊云科技 Step F un ctions 首席工程师彼得·史密斯撰写

这篇博文介绍了 亚马逊云科技 Step Functions 中的新版本和别名功能 ,允许您运行状态机的特定修订版,而不必总是使用最新版本。这样可以实现更可靠的部署,帮助控制风险,并可以准确了解正在运行哪个版本。这篇文章描述了如何使用此功能,采用增量部署模式,例如 蓝/绿 金丝雀 线性 部署,每种模式都为状态机更新经过充分测试提供了更大的保证。

Step Functions 是一种用于构建分布式应用程序的低代码、可视化工作流服务。开发人员使用该服务来自动化 IT 和业务流程,并使用最少的代码编排 亚马逊云科技 服务。它使用 亚马逊州语言 (ASL) 来描述状态机,您可以随着时间的推移修改它们的定义。到目前为止,运行状态机时,它使用的是最新更新中的 ASL 定义。如果最新的变更包含缺陷,则可能会出现中断。该解决方案要么需要另一次 ASL 更新来修复问题,要么需要采取明确的措施将状态机恢复到先前的定义。

使用版本和别名

状态机的 ASL 定义的每次更新现在都可以通过 Step Functions 控制台、 亚马逊云科技 开发工具包 、亚马逊云科技 CLI 、 亚马逊云科技 C loudFormation 或类似工具进行版本控制。 您必须选择明确发布新版本,通常在更新 ASL 定义的同时。版本号是自动分配的,从版本 1 开始。

要控制运行哪个版本的状态机,现在可以在状态机 ARN 中附加版本号:

aws stepfunctions start-execution –-state-machine-arn \ 
    arn:aws:states:us-east-1:123456789012:stateMachine:demo:5

此示例启动了演示状态机的版本 5。即使状态机已更新,对状态机 ARN 进行资格验证也可确保使用版本 5 的定义。现在,您可以放心地测试较新的版本(例如版本 6),因为版本 5 会继续不间断地执行。

为了简化版本管理,可以将符号别名分配给特定版本,但随后可以随时更新以指代不同的版本。别名也可以在两个不同的版本之间拆分执行请求。例如,90% 的执行使用版本 5,10% 的执行使用版本 6。

要使用别名启动状态机执行,现在可以将别名(例如 prod)附加到状态机 ARN:

aws stepfunctions start-execution –-state-machine-arn \ 
    arn:aws:states:us-east-1:123456789012:stateMachine:demo:prod

此示例运行产品别名当前引用的状态机版本。如果 prod 在两个版本之间拆分执行,则根据分配的权重选择其中一个。例如,90% 的时间选择版本 5,10% 的时间选择版本 6。

增量部署用例

使用常见的部署模式有助于避免传统 “大爆炸” 更新的陷阱,例如部署新软件时所有执行都会失败。通过使用别名将状态机执行逐步过渡到新发布的版本(例如,每次执行 10%),新引入的错误影响有限。一旦对新版本有了信心,它就可以用于整个生产工作负载。

蓝/绿部署

在这种方法中,现有的状态机版本(目前在生产中使用)是 “蓝色” 版本,而新部署的状态机是 “绿色” 版本。通常,您应该在生产环境中部署蓝色版本,同时在单独的环境中测试较新的绿色版本。绿色版本通过验证后,将其用于生产(它将成为新的蓝色版本)。

如果版本 6 导致生产中出现问题,请将 “蓝色” 别名回滚到先前的值,以便执行恢复到版本 5。

这种方法为状态机提供了更高程度的质量保证。但是,除非您的测试套件能准确表示您的生产工作负载,否则您还应考虑使用金丝雀部署或线性(或滚动)部署来使用真实数据进行验证。

金丝雀和线性部署

在金丝雀部署中,将产品别名配置为在早期版本(例如,95% 的请求)和新版本(请求的 5%)之间分配流量。如果失败次数没有增加,则可以调整别名,将 100% 的请求定向到新版本。失败时,恢复别名以将 100% 的请求发送到早期版本。

线性部署采用类似的方法,但会随着时间的推移逐渐调整权重,直到新版本收到 100% 的请求。例如,从 10%/90% 开始,然后是 20%/80%,以固定间隔持续直到达到 100%/0%。如果检测到失败次数增加,请立即回滚到早期版本。

部署完整应用程序

另一种情况是,状态机作为大型应用程序的一部分进行部署,应用程序代码和状态机以锁定步骤进行更新。以下示例显示了蓝/绿部署,其中应用程序版本 56 使用状态机版本 5,应用程序版本 64 使用版本 6。

调用状态机时,应用程序必须使用正确版本的 ARN。这样可以避免在首次部署绿色版本(仍有待测试)时蓝色版本出现意外行为变化。如果您无意中使用了不合格的 ARN(没有版本号),则过时的应用程序(版本 56)会错误地使用最新的状态机定义(版本 6),而不是之前部署的版本 5。

可观察性和审计用例

在检查执行历史时,尤其是在长时间运行的执行中,可以看到使用版本 ARN 的一个显著好处。状态机可以运行长达一年,在这段时间内访问其他 亚马逊云科技 资源(例如 亚马逊云科技 L am bda 函数)。为了审计资源,了解每台正在运行的状态机的版本很重要。完成所有执行后,您可以删除它们所依赖的资源(在以下示例中,ProcessInventory Lambda 函数)。

根据您的用例,您可能还有其他审计或合规需求,因此确切地知道您正在运行哪个版本的状态机非常重要。

功能演练

要在 Step Functions 控制台中创建新的状态机 版本,请在保存状态机定义后 立即选择 发布版本 。系统会提示您输入可选描述,例如 “初始实施”。

您也可以在更新现有状态机 后选择 “ 发布版本 ”,为最近的更改添加可选描述,例如 “添加重试逻辑”。

在主状态机详细信息页面上,有两个新选项卡: 别名 版本 版本 选项卡显示状态机版本列表、其描述、每个版本的上次运行时间以及指向该版本的别名。此示例显示了几个新版本。

要开始运行特定版本,请选择版本号左侧的单选按钮,然后选择 开始执行

在状态机详细信息页面上,选择 “ 执行 ” 选项卡以查看已完成和正在进行的执行。其他列表示每次执行都是哪个版本或别名开始的。您可以按版本或别名筛选执行列表以细化列表。

要创建状态机别名,请返回状态机详细信息页面,选择 别名 选项卡,然后选择 创建别名 。提供别名、可选描述和路由配置。对于简单的案例,每当使用别名开始执行时,选择要使用的单个版本(100% 的执行次数)。

要创建将流量路由到两个版本的别名(如增量部署示例所示),请提供具有两个不同版本号的路由配置。指定每个版本的状态机执行百分比。

使用 亚马逊云科技 CloudFormation 实施 CI/CD 部署

为了支持增量部署,新的 亚马逊云科技 CloudFormation 资源能够发布状态机版本、定义别名以及使用蓝/绿、金丝雀或线性方法增量部署状态机更新。

以下示例显示了 AWS:: StepFunctions:: StateMachine 、 AWS:: StateMachin eVersion、AWS:: StateMachineVersion 和 AWS:: StateMachineAlias 资源,这些资源用于定义状态机 、发布单个版本 以及使用产品别名进行线 性部署。

Description: "Example of Linear Deployment of a State Machine"

Parameters:
  StateMachineBucket:
    Type: "String"
  StateMachineKey:
    Type: "String"
  StateMachineRole:
    Type: "String"

Resources:
  DemoStateMachine:
    Type: "AWS::StepFunctions::StateMachine"
    Properties:
      StateMachineName: DemoStateMachine
      DefinitionS3Location:
        Bucket: !Ref StateMachineBucket
        Key: !Ref StateMachineKey
      RoleArn: !Ref StateMachineRole

  DemoStateMachineVersion:
    Type: "AWS::StepFunctions::StateMachineVersion"
    Properties:
      StateMachineArn: !Ref DemoStateMachine
      StateMachineRevisionId: !GetAtt DemoStateMachine.StateMachineRevisionId

  DemoAlias:
    Type: "AWS::StepFunctions::StateMachineAlias"
    Properties:
      Name: prod
      DeploymentPreference:
        StateMachineVersionArn: !Ref DemoStateMachineVersion
        Type: LINEAR
        Interval: 2
        Percentage: 20
        Alarms:
          - !Ref DemoCloudWatchAlarm

每次修改状态机时,都要使用新的带有日期戳的文件(例如 state_machine-202305251336.asl.json)更新 stateMachineKey 参数,然后重新部署 CloudFormation 模板 该状态机的执行在十分钟内从先前版本线性过渡到新版本,使用五个相等的间隔,每个间隔两分钟。如果触发了指定的 Amazon CloudWatch 警报,则该别名会自动回滚到之前的状态机版本。

此外,对于使用常用的第三方 CI/CD 工具(例如 Jenkins 或 Spinn aker ,甚至是您的自定义系统)的用户, 参考 实现 演示如何使用 亚马逊云科技 SDK 或 亚马逊云科技 CLI 实施增量部署,并在触发 CloudWatch 警报时自动回滚。

定价和供货情况

客户可以在所有提供步进功能的地区中使用步进功能版本和别名。Step Functions 的版本和别名包含在 Step Functions 定价中,无需额外付费。

结论

新的 Step Functions 版本和别名功能允许您运行状态机的特定版本,而不必始终使用最新版本。这样可以实现更可靠的部署,从而帮助控制部署风险,还可以准确了解运行的是哪个版本。更新状态机定义后,您可以选择发布该状态机的版本,然后使用版本控制状态机 ARN 运行该版本。

同样,别名(例如测试或生产)可以引用随时间而变化的状态机版本。例如,使用 prod 别名启动执行可确保您只使用经过充分测试的状态机修订版,即使存在较新的非生产就绪版本也是如此。

别名可以在两个不同的版本之间拆分执行,使用百分比权重在它们之间进行选择。此功能支持增量部署模式,例如蓝/绿、金丝雀和线性部署,每种模式都为成功部署状态机更新提供了更大的保障。

如需更多无服务器学习资源,请访问 无服务器世界


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。