荣幸参与和csdn和aws联合举办的buildon实验活动,主要目的还是学习stepfucntion的使用,这个服务能够集成大量aws service感觉可以出现很多有趣的用法。官方给出的文档已经非常详细了,这里只是对一些比较难理解的点进行了记录和解释,欢迎交流和学习~

最新更新一下,年后收到了奖品,开心~

本次实验通过stepfunction创建事件驱动的 serverless 服务,整体架构如下图

涉及到的服务包括,Amazon Step Functions、Amazon EventBridge、Amazon Lambda、Amazon API Gateway、Amazon S3、Amazon DynamoDB和Amazon Cognito

主要收获

  1. 使用stepfunction创建工作流
  2. Amazon States Language的写法和含义
  3. eventbridge的事件生成捕获和驱动

大部分的资源已经通过cloudformation的方式预置了,属于是常规操作,想要了解cloudformation的更多细节可以看之前的几篇文章。我们只需要围绕一个主要的stepfunction用工即可

Workflow Studio

创建并设计状态机,aws提供了可视化界面来简化工作

设计界面预置了很多状态和集成服务。其中状态是状态机中的元素,状态通过其名称 来引用,这可以是任意字符串,但在整个状态机的范围内必须唯一,总共由以下几个

  • Do some work in your state machine (a Task state)
  • Make a choice between branches of execution (a Choice state)
  • Stop an execution with a failure or success (a Fail or Succeed state)
  • Pass its input to its output, or inject some fixed data into the workflow (a Pass state)
  • Provide a delay for a certain amount of time, or until a specified date and time (a Wait state)
  • Begin parallel branches of execution (a Parallel state)
  • Dynamically iterate steps (a Map state)

最终设计出的stepfunction如下

整个stepfunction就是将特定输入经过一系列处理按照特定逻辑转化为一系列输出的过程

其中两个回调事件比较特殊,通过指定如下api,经过自定义事件总线发送事件

{"Entries": [{"Detail": {"Message": "The order has reached the end of the workflow, and so a final event is emitted to alert other services to this.","userId.$": "$.detail.userId","orderId.$": "$.detail.orderId"},"DetailType": "OrderProcessor.orderFinished","EventBusName": "Serverlesspresso","Source": "awsserverlessda.serverlesspresso"}]
}

相关的ddb表存储数据,共四张表。例如下面这个表记录的店铺信息

等待具有任务令牌的回调(用于执行一些外部操作),在官方文档中给出了例子,Step Functions 发布了一条 Amazon SQS 消息,其中包含任务令牌作为消息的一部分。外部系统与 Amazon SQS 集成,并将消息从队列中拉出。完成后,它会返回结果和原始任务令牌。然后,Step Functions 继续其工作流程

具体需要发送api调用来恢复stepfunction的执行

aws stepfunctions send-task-success  --task-output '{"orderId":1}' --task-token YOUR_TASK_TOKEN

最后的超时设置

官方文档给出的示例如下,任务在 300 秒内未能完成,或者未在 60 秒的间隔内发送检测信号通知,则任务会被标记为 failed

"ActivityState": {"Type": "Task","Resource": "arn:aws:states:us-east-1:123456789012:activity:HelloWorld","TimeoutSeconds": 300,"HeartbeatSeconds": 60,"Next": "NextState"
}

Amazon States Language

Step Functions 工作流程使用 Amazon 状态语言 (ASL) 定义。ASL是一种基于 JSON 的结构化语言,用于定义状态机、工作状态的集合(任务状态)、确定要转换到下一个状态的状态(选择状态)、因错误停止执行(失败状态)、等等。工作流是基于 JSON 的文档,您可以将其签入 GitHub,并使用基础设施作为代码工具(如 Amazon SAM 或 CDK)进行部署。

Payload Template

状态机解释器通过payload template传递不同状态之间的输入输出

If any field within the Payload Template (however deeply nested) has a name ending with the characters “.$”, its value is transformed according to rules below and the field is renamed to strip the suffix

  • If the field value begins with only one “$”, the value MUST be a Path. In this case, the Path is applied to the Payload Template’s input and is the new field value.
  • If the field value begins with “$$”, the first dollar sign is stripped and the remainder MUST be a Path. In this case, the Path is applied to the Context Object and is the new field value.
  • If the field value does not begin with “$”, it MUST be an Intrinsic Function. The interpreter invokes the Intrinsic Function and the result is the new field value.
  • If the path is legal but cannot be applied successfully, the interpreter fails the machine execution with an Error Name of “States.ParameterPathFailure”. If the Intrinsic Function fails during evaluation, the interpreter fails the machine execution with an Error Name of “States.IntrinsicFailure”.
  • A JSON object MUST NOT have duplicate field names after fields ending with the characters “."arerenamedtostripthe"." are renamed to strip the "."arerenamedtostripthe".” suffix.

例如

"X": {"Type": "Task","Resource": "arn:aws:states:us-east-1:123456789012:task:X","Next": "Y","Parameters": {"flagged": true,"parts": {"first.$": "$.vals[0]", // payload参数"last3.$": "$.vals[-3:]"},"weekday.$": "$$.DayOfWeek", //context对象"formattedOutput.$": "States.Format('Today is {}', $$.DayOfWeek)" //内部函数}
}

Input and Output Processing

Fields named “InputPath”, “Parameters”, “ResultSelector”, “ResultPath”, “OutputPath” 支持对J不同状态之间传递的JSON文本的格式和内容进行控制

aws控制台上提供了data flow simulator的功能帮助我们调试数据流转换,遗憾的是中国区貌似还未提供此功能

看看每种类型的介绍如下

  • state input:状态机中的每个状态将接收 JSON 作为输入并将 JSON 作为输出传递。可以使用一个或多个提供的状态筛选器减少状态输入
  • inputpath:使用 InputPath 筛选器选择要使用的 JSON 状态输入部分,通过json表达式指定要使用的 JSON 部分
  • parameter:可用来创建作为aws服务输入传递的键值对集合,如 Lambda 函数调用。这些值可以是静态的或者可以使用 JSONPath 表达式
  • task result:来自 AWS 服务集成或活动工作线程的响应
  • ResultSelector:使用 ResultSelector 筛选器以使用任务结果部分构建新的 JSON 对象。
  • ResultPath:使用 ResultPath 将结果添加到原始状态输入中。指定的路径表示结果的添加位置。
  • OutputPath:OutputPath 筛选器允许您在最终结果成为状态输出之前对其进行筛选。
  • State Output:最终输出

不同数据状态之间的转换逻辑如下图

官方的电影数据的转换图示图下,字比较小建议下载放大看

实验中全部的参数输入和输出都是按照States Language的语法来写的,这个图应该有助于理解input/output的转化

Event-driven

事件驱动架构具有三个关键组件:事件生产者、事件路由器和事件消费者。生产者向路由器发布事件,路由器过滤并将事件推送给消费者。生产者服务和消费者服务是解耦的,这使得它们可以独立扩展、更新和部署。

eventbrdige会按照预先设定的规则对特定的事件进行匹配和捕获(事件种类众多),并触发目标操作

除了aws托管事件外,我们可以自定义事件的发送和处理

该项目实际上在2个地方等待外部事件激活工作流

  1. 等待客户下单(发送令牌回调事件)
  2. 等待商家完成订单(发送令牌回调事件)

实验中为我们提供了OrderManager工作流stepfunction进行发送回调的操作

在之后就是和前端页面进行端到端集成测试,按照给出的步骤完成就可以了,iot和cognito用户池的配置没有进一步解释有点遗憾。

  • 前端是使用Amazon Amplify部署的 Vue.js 应用程序。
  • 前端应用程序使用 Amazon Cognito 来允许客户注册和登录他们的账户,后端使用相同的 Cognito 配置来识别用户。
  • 前端使用Amazon API Gateway终端节点与关键服务进行通信。
  • 使用与Amazon IoT Core的 WebSocket 连接来接收实时消息

最终实现的效果还是很喜人,本次收获还是蛮大的~

亚马逊云科技 Build On - 理解和使用 stepfunction 创建 serverless 应用相关推荐

  1. 【官宣】亚马逊云科技Build On 2022年技能提升计划正式启航

    亚马逊云科技Build On 2022技能提升计划是结合教育与技术应用的云计算技术动手实验实操活动,也是全面适用于开发人员.IT技术人员.技术爱好人员和技术.业务领域决策者须掌握的基础云计算课程.Bu ...

  2. 亚马逊云科技 Build On 参与心得

    前言 小伙伴们, 很久不见了,我还是那个喜欢来分享技术和心得的小冷,最近没有更新,原因大概是想给自己放放假,换换心情,前几天,在一个同样是开发者的朋友的提议下,参加了亚马逊 build on 的线下活 ...

  3. 亚马逊云科技Build On2022技能提升计划第二季——揭秘出海爆款新物种背后的黑科技

    Build On是什么? 亚马逊云科技开发者Build On是由亚马逊团队策划.开发者社区联合打造的动手实操系列活动.它是以现实技术应用和需求场景为核心,结合时下重点技术领域与亚马逊云科技的前沿技术方 ...

  4. 亚马逊云科技Build On -报告总结

    亚马逊云科技Build On -流程及感受 挺意外地参加了这个活动,从看到这个活动再到想参与再到参与,感谢客服姐姐打电话和微信一步步落实是否参与,如果不是客服姐姐,我可能报名完也就不参加了. 活动内容 ...

  5. 亚马逊云科技 Build On-使用 Amazon KVS 和 Amazon Rekognition 进行实时智能视觉识别

    在观望了亚马逊云科技Build On第一季动手实验后,报名了第二季AIoT主题活动,由于深圳较远,就没有去深圳参加现场活动.(ps:很羡慕去现场的小伙伴,人手一个树莓派,啊啊啊-) Build On ...

  6. 亚马逊云科技 Build On 第二季物联网(AIoT)专场实验心得(附踩坑大全)

    写在前面的废话: 本身是物联网专业的,一直以来在学校都觉得没有太多实践机会,不清楚到底专业本身就业后是做什么的,以后能干什么更是一无所知. 总之没用的课程学了一大堆,然后去考试.迷茫,没有方向,想要行 ...

  7. 亚马逊云科技Build On - Serverless创新零售初体验

    亚马逊云科技Build On - Serverless创新零售初体验 亚马逊云科技Build On - 基于 Serverless 构建零售创新应用 参与目的 参与过程 活动开始(直播) 活动实操 活 ...

  8. 亚马逊云科技 Build On 2022 - 参加一场动手实验是怎样一种体验?

    本篇文章是我参与亚马逊云科技build on的实验心得,比较简略,此文写给想尝试参加动手实验,或者不清楚参加动手实验对个人成长有什么帮助的朋友. Build On是什么? 亚马逊云科技开发者Build ...

  9. 亚马逊云科技 Build On - Serverless助力企业降本增效

    亚马逊云科技 Build On - Serverless开启零售新篇章 梅开三度 活动体验 实验 问题总结 一点建议 咖啡案例实验 Serverless学习 总结 梅开三度 Hi,作为一名Builde ...

最新文章

  1. H5地理定位获取用户当前位置、城市
  2. 面向对象基础回顾(二)
  3. 生活感悟 2018-06-13
  4. wordpress 伪静态
  5. WebSocket + Spring消息推送服务的快速实现
  6. java语句类型_01-java数据类型与语句
  7. 尤雨溪介绍 Vue 3:语法不变、TS 支持很好、2.0 系列还会发一个版本
  8. oa中获取当前用户信息
  9. 计算机二级是要报所有科目吗,我要报考计算机等级考试二级,是全部科目都要考吗?...
  10. Web前端 HTTP1.0、 HTTP 1.1 、 HTTP2.0 区别与联系
  11. 用注册机注册Keil
  12. biopython有什么用_用Biopython解析BLAST结果
  13. 当了两天向导,带他进行了上海都市游885
  14. 微信H5授权用户和公众号关注用户区别
  15. jsp mysql电影网站_JSP+Servlet+C3P0+Mysql实现的YCU movies电影网站
  16. 不想升级iOS 15系统?iPhone最新屏蔽iOS更新的方法
  17. 一颗白菜的云原生之旅
  18. Xen Introduction
  19. Radon变换(Matlb)
  20. Postman+Newman:自定义测试报告展示内容

热门文章

  1. matlab字体安装,matlab安装教程
  2. 如何合成gif动态图?教你一招快速合成动态gif图
  3. 双网卡电脑的Internet连接共享
  4. 解决:RecyclerView只显示一行数据
  5. python - Django
  6. 【Python数据分析】波士顿房价分析小例子
  7. 贝塞尔曲线,B-样条,非均匀有理B样条梳理
  8. MarkdownPad 使用 MathJax
  9. ZBlog源码资源站整站打包-带天兴娱乐资源主题+墨初用户中心插件
  10. Qt使用第三方串口类qextserialport无法打开串口的可能解决方案(文章中描述的可以解决)