我们使用机器学习技术将英文博客翻译为简体中文。您可以点击导航栏中的“中文(简体)”切换到英文版本。
在 亚马逊云科技 Step Functions 中使用版本和别名逐步部署状态机
这篇文章由 亚马逊云科技 Step F un ctions 首席工程师彼得·史密斯撰写
这篇博文介绍了
Step Functions 是一种用于构建分布式应用程序的低代码、可视化工作流服务。开发人员使用该服务来自动化 IT 和业务流程,并使用最少的代码编排 亚马逊云科技 服务。它使用
使用版本和别名
要控制运行哪个版本的状态机,现在可以在状态机 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 的一个显著好处。状态机可以运行长达一年,在这段时间内访问其他 亚马逊云科技 资源(例如
根据您的用例,您可能还有其他审计或合规需求,因此确切地知道您正在运行哪个版本的状态机非常重要。
功能演练
要在 Step Functions 控制台中创建新的状态机 版本,请在保存状态机定义后 立即选择 发布版本 。系统会提示您输入可选描述,例如 “初始实施”。
您也可以在更新现有状态机 后选择 “ 发布版本 ”,为最近的更改添加可选描述,例如 “添加重试逻辑”。
在主状态机详细信息页面上,有两个新选项卡: 别名 和 版本 。 版本 选项卡显示状态机版本列表、其描述、每个版本的上次运行时间以及指向该版本的别名。此示例显示了几个新版本。
要开始运行特定版本,请选择版本号左侧的单选按钮,然后选择 开始执行 。
在状态机详细信息页面上,选择 “ 执行 ” 选项卡以查看已完成和正在进行的执行。其他列表示每次执行都是哪个版本或别名开始的。您可以按版本或别名筛选执行列表以细化列表。
要创建状态机别名,请返回状态机详细信息页面,选择 别名 选项卡,然后选择 创建别名 。提供别名、可选描述和路由配置。对于简单的案例,每当使用别名开始执行时,选择要使用的单个版本(100% 的执行次数)。
要创建将流量路由到两个版本的别名(如增量部署示例所示),请提供具有两个不同版本号的路由配置。指定每个版本的状态机执行百分比。
使用 亚马逊云科技 CloudFormation 实施 CI/CD 部署
为了支持增量部署,新的
以下示例显示了
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 模板
。
此外,对于使用常用的第三方 CI/CD 工具(例如
定价和供货情况
客户可以在所有提供步进功能的地区中使用步进功能版本和别名。Step Functions 的版本和别名包含在 Step Functions 定价中,无需额外付费。
结论
新的 Step Functions 版本和别名功能允许您运行状态机的特定版本,而不必始终使用最新版本。这样可以实现更可靠的部署,从而帮助控制部署风险,还可以准确了解运行的是哪个版本。更新状态机定义后,您可以选择发布该状态机的版本,然后使用版本控制状态机 ARN 运行该版本。
同样,别名(例如测试或生产)可以引用随时间而变化的状态机版本。例如,使用 prod 别名启动执行可确保您只使用经过充分测试的状态机修订版,即使存在较新的非生产就绪版本也是如此。
别名可以在两个不同的版本之间拆分执行,使用百分比权重在它们之间进行选择。此功能支持增量部署模式,例如蓝/绿、金丝雀和线性部署,每种模式都为成功部署状态机更新提供了更大的保障。
如需更多无服务器学习资源,请访问
*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。