使用AWS Lambda和AWS Step Functions轻松构建Serverless应用

2019 年 11 月 08 日

使用AWS Lambda和AWS Step Functions轻松构建Serverless应用
_作者: Vivian Zhang(张芸)_


Serverless(无服务器)应用可以说是当前的行业热点,用户无需预配置或管理服务器,只需要部署功能代码,AWS Lambda会在需要的时候执行代码并自动缩放, 从每天几个请求到每秒数千个请求,轻松地实现FaaS (Function as a Service)。无服务器应用的使用场景非常广阔,从微服务架构,到批处理、流处理、运维自动化和移动计算。
### 实现Serverless应用,除了AWS Lambda还需要什么?
我们来看一个典型的基于Lambda的无服务器应用。
[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/1-2.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/1-2.png)
当我们将作为计算和存储实体的Lambda函数、消息队列、DB去掉,可以看到下面这张图。
[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/2-3.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/2-3.png)
这张图上的箭头,就是上一张图里Lambda函数之间的流程,或者可以称为Lambda函数之间的“胶水”,它们起到了编排协调各个Lambda函数的作用。通常在应用中,我们会需要有这样的一些流程:
* 我想要顺序地执行方法。* 我想要并行地运行这些方法。* 我想要基于数据选择执行方法。* 我想要重试某些方法。* 我想要try/catch/finally* 我想要代码运行一定时间或者等待一段时间……
通常我们可以通过方法调用、函数链、DB和消息队列来协调这些函数,实现流程。但是对于所采用的协调机制,我们都希望它具有以下功能:
* 可以自动伸缩;* 不会丢失状态;* 可以处理错误和超时;* 可以简单的搭建和运维;* 可以审计。
这里我们介绍一种方式,采用AWS Step Functions协调Lambda函数之间的流程。
### AWS Step Functions
AWS Step Functions是一个可视工作流服务,可用来轻松协调分布式应用程序和微服务的各个组件。用户从单个组件构建应用程序,每个组件都执行一个特定的功能,也就是Task(可以采用Lambda函数实现)。Step Functions提供了一种可靠的方法来协调这些组件并逐步完成应用程序中的这些功能,并且 提供了一个图形控制台,将应用程序的组件可视化为一系列步骤,它可以自动触发并跟踪每一个步骤,并在出现错误时重试,这样应用程序就可以每一次都按照预先设定的顺序执行。Step Functions会记录每一步的状态,因此当事情出错时,用户可以快速地诊断和调试问题。
要使用Step Functions构建应用,首先我们需要在Step Functions里创建State Machine(状态机),也就是对应每一个应用的工作流程。可以采用以下8种蓝图,包括7种预定义好的状态机和1种自定义的。创建好的状态机用JSON描述。
[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/3-3.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/3-3.png)
在每一个状态机里,我们需要定义一系列的State(状态),用来完成不同的功能:
* Task:在状态机中完成特定的功能,可以采用Lambda函数实现。* Choice:在各种执行分支中进行选择。* Fail和Success:停止一个执行,并设为Fail或者Success。* Pass:简单地将输入传给输出,或者注入一些数据。* Wait:提供一定时间的延迟,或者等待到特定的时间/数据。* Parallel:并行地执行分支。
可以看出,上一节中我们所需要的协调和流程在这些状态中都得到了支持。其中的Task状态是用来真正实现应用的功能,而其他状态用来处理功能之间的流程。比如说,下面是一个名为HelloWorld,执行Lambda函数的状态。
[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/4.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/4.png)
下图是一个拥有所有状态的状态机:
[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/5-2.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/5-2.png)
在Console里看到一个创建好的状态机是这样:
[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/6-1.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/6-1.png)
我们点击New Execution并且传入input数据,就可以启动该状态机的一次执行,并且可以从界面上查看执行的情况。
此外也可以通过AWS SDKs,Step Functions API和AWS CLI来启动状态机的执行并且查看进程。
[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/7.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/7.png)
### 采用AWS Lambda和AWS Step Functions构建Serverless应用的例子
这里介绍一个镜像识别和后端处理的例子,展示如何使用 AWS Step Functions 编排一个集成 AWS Lambda、Amazon S3、Amazon DynamoDB 和 Amazon Rekognition 的无服务器处理工作流。此工作流处理上传至 Amazon S3 的照片,并从镜像中提取元数据,如地理位置、大小/格式、时间等。然后,它使用镜像识别功能标记照片中的对象,同时还生成照片的缩略图。该例子的源代码在github上:https://github.com/awslabs/lambda-refarch-imagerecognition
[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/8-2.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/8-2.png)
整个架构的流程如下:
1. 一张图片上传到名为PhotoRepo的S3 bucket里,位于“Incoming/”前缀下。2. S3 upload event产生,触发了名为ImageProcStartExecution的Lambda函数,该函数启动了AWS Step Functions中ImageProc状态机的执行,并将S3 bucket和object key作为参数传入状态机。3. ImageProc状态机执行以下步骤:4. 从S3中读取文件并抽取出图片的元数据(格式、EXIF数据、大小等等);5. 基于上一步骤的输出,验证上传的文件格式是否支持(png或者jpg);如果不支持,抛出NotSupportedImageType错误并且结束执行。6. 将抽取出的元数据保存在ImageMetadata DynamoDB中。7. 并行地同时启动两个进程:
* 1) 调用Amazon Rekognition探测图像文件的对象,如果探测到,将tag保存到ImageMetadata DynamoDB中;* 2) 生成缩略图并且保存在名为PhotoRepo的S3 bucket的“Thumbnails/”前缀下面。
可以通过源代码中的test web app上传图片来测试该图像识别和处理工作流的结果。
[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/9-1.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/9-1.png)
可以通过源代码中的CloudFormation template来创建该后端处理应用程序。
### 结论
用AWS Lambda函数定义应用程序需要执行的每一个特定功能,而用AWS Step Functions定义在各个功能中流转的流程,这样采用AWS Lambda和AWS Step Functions联合使用的方式,可以轻松地构建出Serverless应用。
此外,AWS 还提供一系列完全托管的服务,可以用来构建和运行无服务器应用程序。
[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/10.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/10.png)
[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/11.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/11.png)
### 参考
可以在我们的网站上下载到相关例子的sample code:https://github.com/awslabs/lambda-refarch-imagerecognition
关于AWS Step Functions的 更多内容请参考网站:[](https://amazonaws-china.com/cn/step-functions/)
关于AWS Lambda的更多内容请参考网站:[](https://amazonaws-china.com/lambda/)
关于AWS服务器平台请参考网站:[](https://amazonaws-china.com/cn/serverless/)
复制代码


TAGS:


AWS Lambda


,


AWS Step Functions


,


Serverless(无服务器)架构


,


大咖专栏


,


计算


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/easily-build-serverless-applications-using-aws-lambda-and-aws-step-functions/


2019 年 11 月 08 日 08:00115

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布
暂无评论
发现更多内容

彻底搞懂 etcd 系列文章(一):初识 etcd

aoho

架构 云原生 etcd

GitLab CI/CD

xgqfrms

C/C++:const常量真的可以用指针修改吗

韩小非

c c++ 指针 常量 编译器优化

Go: Go 调度器的任务窃取(Work-Stealing)

陈思敏捷

go golang 源码分析 原理 队列

单例模式详解

章小传

Java 单例模式

我体验了一把自由职业,比 996 苦多了...

非著名程序员

创业 程序员 自由职业 创业心态

ARTS Week2

时之虫

ARTS 打卡计划

原创 | TDD工具集:JUnit、AssertJ和Mockito (十九)编写测试-依赖注入\测试接口\重复测试

编程道与术

Java 编程 TDD 单元测试 JUnit

某二手交易平台大数据平台从 0 到 1 演进与实践

奈学教育

听说用 Lombok 可以早点下班?

武培轩

Java 程序员 工具 后端 IDEA

架构师应该具备哪些思维模型?

奈学教育

架构师

Pycharm社区版安装教程(永久免费,随时升级)

早睡蟒

彻底搞懂 etcd 系列文章(三):etcd 集群运维部署

aoho

架构 云原生 etcd

Spark学习笔记一之为什么Spark这么牛逼

Shockang

大数据 spark

推荐几款有意思的小众App(06.06)

静陌

缓存一致性协议的工作方式

HackMSF

缓存 并发

ARTS - Week Three

shepherd

开源 互联网 算法

程序员可迁移技能的培养

码闻强

程序员 程序员素养 程序员成长

ARTS|Week 02:体会刷算法题的快乐,同时开启Ubuntu 20.04备用系统

MiracleWong

算法 ARTS 打卡计划

Spring 源码学习 - 单例bean的实例化过程

公众号:好奇心森林

JDK 8,该离开的时候,请别留恋!

范学雷

Java 架构 编程语言 Java 25 周年

ES2020 new features / ES11

xgqfrms

ES2020 new features ES11 ES2020

江湖事儿 | 技术人如何做好晋升准备

哈利迪

android 职业成长

ARTS week3

丽子

日志过滤

HU

ARTS|Week 2 PlantUML 的学习和分享

Puran

LeetCode arts PlantUML

重装Oracle11g

阡陌r

oracle 踩坑 oracle重装

Trie 字典树

12583

LeetCode Trie

[kube 022] 混沌测试框架-Litmus

zbyufei

Kubernetes 云原生 混沌工程 Litmus litmuschaos

像运营公司一样去做产品

胖鱼2号

创业 产品 产品经理 企业

奈学教你五分钟学会分布式事务

奈学教育

分布式系统

使用AWS Lambda和AWS Step Functions轻松构建Serverless应用-InfoQ