在 AWS 上掌握 Step Functions 的完整指南

工作流程编排变得更加简单

       欢迎来到雲闪世界。构建和维护复杂的系统仍然是行业中的常见挑战,尤其是在采用云基础设施时。

幸运的是,已经开发出各种工具AWS Step Functions来简化这些工作流程的编排,无论复杂程度如何。

本文提供了使用 Step Functions 的分步指南,从设置云帐户到实现真实场景。

什么是 AWS Step Functions?

AWS Step Functions 是一种无服务器编排服务,主要用于创建可视化工作流。它能够无缝协调 AWS Lambda 函数和其他 AWS 资源。

Step Functions 可以与 Amazon EC2、Amazon ECS、本地服务器、Amazon API Gateway 和 Amazon SQS 队列等集成。AWS Step Functions 的多功能性使其适用于广泛的应用程序。

开始使用 AWS Step Functions

本节的目标是提供开始使用 AWS Step Functions 的步骤,从了解构建块到浏览 AWS Step Functions 界面。

Step Functions 的构建块

Step Functions 基于以下模块:(1) 状态机,和 (2) 任务,让我们通过一个示例来理解这些概念。

  • State Machines定义事件顺序、条件逻辑以及任务执行总体流程的工作流。

  • Tasks它接受输入并生成输出(例如:查询数据库、进行 API 调用)。

让我们考虑一个使用 AWS Step Functions 执行日托注册流程的用例。

在深入了解利用 Step Functions 的过程之前,让我们先了解一下总体步骤:

  • Collect Registration data:第一步旨在收集家长的注册信息。提交后,将触发 Lambda 函数以将该信息发送到工作流程的下一步。

  • Verify Registration data此步骤检查父母是否提供了所有必需信息。如果验证成功,工作流程将继续进行下一步。否则,将向父母返回有意义的错误消息。

  • Check Availability:检查日托中心是否有空位。如果有空位,工作流程将进入下一步。否则,将向家长返回一条有意义的错误消息。

  • Confirm Registration这最后一步确认注册并向家长发送确认信息,其中包括有关开始日期和费用的相关详细信息。

底层工作流程如下所示。它有一个状态机,包含四个主要任务,这些任务都是不言自明的。

  • checkInformation

  • checkAgeRange

  • checkSpotsAvailability

  • confirmRegistration

使用 AWS Step 函数的日托注册工作流程(作者提供图片)

构建您的第一个 AWS Step Function

现在,让我们深入研究技术实施,从设置先决条件到实施端到端工作流程并部署它。

实施 Step Functions 的先决条件

在深入了解用例的细节之前,让我们首先了解一下成功实施所需的先决条件:

  • AWS account:访问 AWS 服务所需,可从 AWS网站创建一个。

  • Knowledge of JSON:需要对 JSON 有基本的了解才能理解 Step Functions 的输入和输出数据格式。

浏览 AWS Step Functions 界面

在深入了解我们的用例的核心功能之前,让我们先登录 AWS 账户后通过以下四个步骤来熟悉 Step Function 界面:

  • 在顶部的搜索栏中输入“Step Functions”关键字。

  • 从结果中选择相应的图标。

  • 点击“开始”图标开始创建第一步功能。

  • 最后,由于我们要创建自己的状态机,因此请选择“创建自己的”选项卡。

访问 Step Function 界面的四个主要步骤

第四步之后,我们可以借助“设计”选项卡开始设计状态机,该选项卡包含三个主要功能:“操作”,“流程”和“模式”。

“设计”选项卡的三个主要组件

  • Actions对应于工作流内可以执行的各个操作,它们对应于具体的 AWS 服务。

  • Flow表示指定状态机执行路径的控制流。我们有“Choice”表示分支逻辑,“Parallel”表示并发执行路径,“Map”表示迭代集合,“Pass”表示无操作或状态数据丰富器,“Wait”表示时间延迟,“success”表示成功结束工作流,“Fail”表示由于错误而结束工作流,这些都是工作流流控制的一部分。

  • Patterns:预定义模板使构建复杂的状态机变得更容易。

创建工作流

要成功实现上述日托工作流程,需要四个 lambda 函数。

以下七个步骤重点介绍了创建 lambda 函数的所有必要步骤,并且所有四个步骤的过程相同;唯一的区别在于这些函数的内容。

本文的整体代码可以在GitHub 页面上找到。尽管代码很容易理解,但为了获得更好的学习体验,我们强烈建议您阅读本文的全部内容。

创建 Lambda 函数的 7 个主要步骤

完成这七个步骤后,将出现以下窗口,显示重要信息,例如:

  • 函数名称

  • Amazon 资源名称 (ARN)链接,以及

  • 实现功能逻辑的集成区域。

lambda 函数的详细信息checkInformation

checkAgeRange现在,对剩下的三个任务(功能) 、checkSpotsAvailability和重复相同的过程confirmRegistration

下面给出了输入 JSON 的示例。理解它很重要,因为它会影响函数的实现方式。

  • JSON 包含有关正在注册的孩子的信息,包括其名字、姓氏和出生日期。

  • 它还包括有关父母的详细信息、孩子将在哪几天参加日托以及任何其他信息。

{  
  “registration_info” : {  
 “孩子” : {  
   “firstName” : “Mohamed” , 
   “lastName” : “Diallo” , 
   “dateOfBirth” : “2016-07-01”  
 } , 
 “父母” : {  
   “母亲” : {  
     “firstName” : “Aicha” , 
     “lastName” : “Cisse” , 
     “电子邮件” : “aicha.cisse@example.com” , 
     “电话” : “123-456-7890”  
   } , 
   “父亲” : {  
     “firstName” : “Ibrahim” , 
     “lastName” : “Diallo” , 
     “电子邮件” : “ibrahim.diallo@example.com” , 
     “电话” : “098-765-4321”  
   }  
 } , 
 “daysOfWeek” : [  
   “星期一” , 
   “星期二” , 
   “星期三” , 
   “星期四” , 
   “星期五”  
 ] , 
 “specialInstructions” : “穆罕默德对花生过敏。”  
  }  
} 

每个 lambda 函数的描述如下:

lambda 函数的描述(作者提供图片)

下面给出了各个函数的底层实现:

  • checkInformation功能

 导入json 
  
 def  checkInformation (事件,上下文): 
  registration_info = 事件 [ 'registration_info' ] 
  
  required_fields = [ 'child','parents','daysOfWeek' ]
  对于required_fields中的字段:
     如果字段不在 registration_info中:
         返回{ 
             'statusCode' : 400,
             'body' : f'缺少必填字段:{field} ' 
          }

  返回{ 
     'statusCode' : 200,
     'body' : json.dumps(registration_info) 
  }
  • checkAgeRange功能

 导入json
 导入datetime 
  
def checkAgeRange(event, context): 
 
registration_info = json.loads(event[ 'body' ]) 
  
dob = registration_info[ 'child' ][ 'dateOfBirth' ] 
  
today = datetime.date.today() 
dob_date = datetime.datetime.strptime(dob, '%Y-%m-%d' ).date() 
age = today.year - dob_date.year - ((today.month, today.day) < (dob_date.month, dob_date.day))
  
 如果age < 2或 age > 5 : 
     return { 
         'statusCode' : 400 , 
         'body' : json.dumps( '孩子不在该日托所可接受的年龄范围内。' ) 
     } 

registration_info[ 'child' ][ 'age' ] = age 
  
 return { 
     'statusCode' : 200 , 
     'body':json.dumps(注册信息)
}
  • checkSpotsAvailability功能

导入 json 
  
def checkSpotsAvailability ( event , context ): 
 
registration_info = json.loads( event [ 'body' ]) 
  
spot_available = 20   # 这应该是动态确定的,而不是硬编码
  
 if spot_available <= 0 : 
     return { 
         'statusCode' : 400 , 
         'body' : json.dumps( '日托中心没有可用位置。' ) 
     } 
  
 return { 
     'statusCode' : 200 , 
     'body' : json.dumps(registration_info) 
}
  • confirmRegistration功能

导入json
导入datetime 
  
def  confirmedRegistration ( event, context ): 
 
registration_info = json.loads(event[ 'body' ]) 
age = registration_info[ 'child' ][ 'age' ]   # 这是在 checkAgeRange 函数中添加的
  
 if age >= 2  and age < 3 : 
     fee = 800  
 elif age >= 3  and age < 4 : 
     fee = 750  
 elif age >= 4  and age < 5 : 
     fee = 700  
 else :   # age >= 5
      fee = 650 
  
 start_date = datetime.date.today() + datetime.timedelta(weeks= 2 ) 
  
confirmed_details = { 
     'fees' : fees, 
     'start_date' : start_date.isoformat() 
} 
  
response = {**registration_info, **confirmation_details} 
  
 return { 
     'statusCode' : 200 , 
     'body' : json.转储(响应)
}

一切就绪后,我们就可以开始使用 Step Functions 图形界面创建我们的日托状态机。

最终的状态机如下所示,让我们了解导致该工作流程的主要步骤:

日托用例的状态机工作流程(作者提供的图片)

在深入研究之前,需要注意的是,statusCodelambda 函数输出的字段用于确定状态机中的下一个状态。

  • 如果值为200,则表示检查成功,我们继续下一步。

  • 如果statusCode是400,则检查失败,在这种情况下,我们会根据执行底层任务的函数返回相关消息。

查看信息

  • 状态机从此步骤启动。

  • 调用 lambda 函数来检查注册表中是否存在所有必需的信息。

  • 如果信息完整,流程将进入下一步。如果不完整,流程将以失败状态结束,通知信息不完整。

检查年龄范围

  • 只有信息检查成功后才能到达此步骤。

  • 调用另一个 lambda 函数来检查孩子的年龄是否在托儿所可接受的范围内。

  • 如果年龄在范围内,则流程进入下一步。如果不在范围内,则流程以失败状态结束,通知年龄无效。

查看可用位置

  • 仅当年龄检查成功时才会到达此步骤。

  • 调用 lambda 函数来检查日托中心是否有空位。

  • 如果有空位,则流程进入下一步。如果没有,则以失败状态结束,通知没有空位。

确认注册

  • 这是最后一步,只有日托中心有空位时才能完成。

  • 调用 Lambda 函数来确认注册并根据孩子的年龄计算费用。

  • 此步骤之后,流程以成功状态结束,确认注册。

要了解有关 Lambda 函数的更多信息,使用 AWS Kinesis 和 Lambda 进行流数据教您如何使用 AWS 上的无服务器技术处理流数据。

创建 IAM 角色

下一步是定义IAM 角色,以便步骤函数可以调用我们的 lambda 函数。具体步骤如下:

创建 IAM 角色的第 10 和第 11 步(作者提供图片)

可以按如下方式将此 IAM 角色分配给状态机,从“配置”选项卡开始。

授予 IAM 角色的 3 个主要步骤(作者提供图片)

保存后,我们应该收到以下消息来查看一切是否顺利。

状态机创建成功消息(作者提供的图片)

一旦我们对状态机感到满意,下一步就是使用位于右上角的“创建”按钮来创建它。

状态机执行的图示(图片来自作者)

部署和测试您的工作流程

我们的工作流已部署完毕,现在是时候测试状态机了。我们将测试两种场景:

  • 具有有效年龄范围的失败案例,在这种情况下,我们尝试注册的孩子年龄超过 5 岁。这对应于初始 JSON。

  • 孩子3岁的成功案例。

成功案例的结果(图片来自作者)失败案例的结果(图片来自作者)

结论

这个简短的教程简要概述了 AWS Step Functions 以及它如何帮助协调真实世界的工作流程。

我希望这个简短的教程能帮助您获得新的技能。

感谢关注雲闪世界。(Aws解决方案架构师vs开发人员&GCP解决方案架构师vs开发人员)

 订阅频道(https://t.me/awsgoogvps_Host)
 TG交流群(t.me/awsgoogvpsHost)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值